2793|1

28

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

新手,自己编的一个1602显示程序,proteus仿真就是不显示,求高手指点 [复制链接]

#include    //包含单片机寄存器的头文件
#include  //包含_nop_()函数定义的头文件
#define uint unsigned int
#define uchr unsigned char
sbit RS=P0^5;    //寄存器选择位,将RS位定义为P0.5引脚
sbit RW=P0^6;    //读写选择位,将RW位定义为P0.6引脚
sbit E=P0^7;     //使能信号位,将E位定义为P0.7引脚
sbit BF=P2^7;    //忙碌标志位,,将BF位定义为P2.7引脚
uchr code str[]={"Welcome to china"};
//延时程序 约为1ms
void delayms()
{
  uchr i,j;
  for(i=0;i<20;i++)
  for(j=0;j<50;j++);
  }
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(uchr n)
{
uchr i;
for(i=0;i delayms();
}

//LCD忙判断
uchr busytest(void)
{
bit result;
P2=0x0ff;
RS=0;
RW=1;//读忙信号
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=BF;
E=0;
return result;
}
//函数;模式设置指令或显示地址写入
void write_instruction(uchr C)
{
// while(busytest()==1);
delay(5);
  RS=0;
  RW=0;
  E=0;
  _nop_();
  _nop_();
  P2=C;
   delay(5);
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  E=1; //先E从0变1,写入指令再从1变0 通知lcd执行
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  E=0;
  }
  //函数;指定字符显示位置的实际地址
  void write_address(uchr b)
  {
  write_instruction(b|0x80);//位置显示规定为“80H+b”
  }
  //函数:写入数据
  void write_data(uchr b)
  {
// while(busytest()==1);
delay(5);
  RS=1;           //RS为高电平,RW为低电平时,可以写入数据
  RW=0;
  E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
       // 就是让E从0到1发生正跳变,所以应先置"0"
  P2=b;  
      //将数据送入P0口,即将数据写入液晶模块
   delay(5);
  _nop_();
  _nop_();
  _nop_();
  _nop_();       //空操作四个机器周期,给硬件反应时间
  E=1;          //E置高电平
  _nop_();
  _nop_();
  _nop_();
  _nop_();        //空操作四个机器周期,给硬件反应时间
  E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
  }

   //函数:LCD初始化
   void LCDinitial(void)
   {
   E=0;
   delay(15);
  write_instruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
   delay(5);   //延时5ms 
    write_instruction(0x38);
   delay(5);
    write_instruction(0x38);
   delay(5);
   write_instruction(0x0f);  //显示模式设置:显示开,有光标,光标闪烁
   delay(5);
   write_instruction(0x06);  //显示模式设置:光标右移,字符不移
   delay(5);
   write_instruction(0x01);  //清屏幕指令,将以前的显示内容清除
   delay(5);
   }
   //主函数
   void main()
   {
    uint i;
   LCDinitial();
  delay(10);
   while(1)
   {
   i=0;
    write_instruction(0x01);
write_address(0x00);
   while(str='\0')
   {
   write_data(str);
   delay(150);
   i++;
  }
  delay(1000);
   }
   }


[ 本帖最后由 51DPJLT 于 2013-9-28 22:25 编辑 ]
此帖出自51单片机论坛
点赞 关注
 

回复
举报

28

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
找到问题了。我用p2口做连接数据线,p0口做控制口。换了一下就好使了,不过这是为什么呢
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表