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

2019-03-24 18:38发布

#include<reg51.h>    //包含单片机寄存器的头文件
#include<intrins.h>  //包含_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<n;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='')
   {
   write_data(str);
   delay(150);
   i++;
  }
  delay(1000);
   }
   }


[ 本帖最后由 51DPJLT 于 2013-9-28 22:25 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。