求用proteus仿真51单片机控制LCD1602的实例

最好附图 附程序(有适当注解)
2024-11-16 12:29:50
推荐回答(3个)
回答(1):

  //实例81:用LCD显示字符'A'
  #include //包含单片机寄存器的头文件
  #include //包含_nop_()函数定义的头文件
  sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
  sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
  sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
  sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
  /*****************************************************
  函数功能:延时1ms
  (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
  ***************************************************/
  void delay1ms()
  {
  unsigned char i,j;
  for(i=0;i<10;i++)
  for(j=0;j<33;j++);
  }
  /*****************************************************
  函数功能:延时若干毫秒
  入口参数:n
  ***************************************************/
  void delay(unsigned char n)
  {
  unsigned char i;
  for(i=0;i  delay1ms();
  }
  /*****************************************************
  函数功能:判断液晶模块的忙碌状态
  返回值:result。result=1,忙碌;result=0,不忙
  ***************************************************/
  unsigned char BusyTest(void)
  {
  bit result;
  RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
  RW=1;
  E=1; //E=1,才允许读写
  _nop_(); //空操作
  _nop_();
  _nop_();
  _nop_(); //空操作四个机器周期,给硬件反应时间
  result=BF; //将忙碌标志电平赋给result
  E=0;
  return result;
  }
  /*****************************************************
  函数功能:将模式设置指令或显示地址写入液晶模块
  入口参数:dictate
  ***************************************************/
  void WriteInstruction (unsigned char dictate)
  {
  和槐while(BusyTest()==1); //如果忙就等待
  RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
  RW=0;
  E=0; //E置低电平(根据表8-6,雀绝写指令时,E为高脉冲,
  // 就是让E从0到1发生正跳变,所以应先置"0"
  _nop_();
  _nop_(); //空操作两个机器周期,给硬件反应时间
  P0=dictate; //将数据送入P0口,即写入指令或地址
  _nop_();
  _nop_();
  _nop_();
  _nop_(); //唤岁友空操作四个机器周期,给硬件反应时间
  E=1; //E置高电平
  _nop_();
  _nop_();
  _nop_();
  _nop_(); //空操作四个机器周期,给硬件反应时间
  E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
  }
  /*****************************************************
  函数功能:指定字符显示的实际地址
  入口参数:x
  ***************************************************/
  void WriteAddress(unsigned char x)
  {
  WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
  }
  /*****************************************************
  函数功能:将数据(字符的标准ASCII码)写入液晶模块
  入口参数:y(为字符常量)
  ***************************************************/
  void WriteData(unsigned char y)
  {
  while(BusyTest()==1);
  RS=1; //RS为高电平,RW为低电平时,可以写入数据
  RW=0;
  E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
  // 就是让E从0到1发生正跳变,所以应先置"0"
  P0=y; //将数据送入P0口,即将数据写入液晶模块
  _nop_();
  _nop_();
  _nop_();
  _nop_(); //空操作四个机器周期,给硬件反应时间
  E=1; //E置高电平
  _nop_();
  _nop_();
  _nop_();
  _nop_(); //空操作四个机器周期,给硬件反应时间
  E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
  }
  /*****************************************************
  函数功能:对LCD的显示模式进行初始化设置
  ***************************************************/
  void LcdInitiate(void)
  {
  delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
  WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
  delay(5); //延时5ms
  WriteInstruction(0x38);
  delay(5);
  WriteInstruction(0x38);
  delay(5);
  WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁
  delay(5);
  WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
  delay(5);
  WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
  delay(5);
  }
  void main(void) //主函数
  {
  LcdInitiate(); //调用LCD初始化函数
  WriteAddress(0x07); //将显示地址指定为第1行第8列
  WriteData('A'); //将字符常量'A'写入液晶模块
  //字符的字形点阵读出和显示由液晶模块自动完成
  }

回答(2):

这个不用求人。
如果你已经安装了proteus,该软件就自带了51单片中粗并机控制卖迹LCD1602的仿真实例。

一般在C盘的:C:\Program Files\Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM for 8051\8051 LCD Driver 文件夹。

程序、仿真文件等都是现成的。
根据这个例子,你还可以找到凳蠢很多其它的仿真例子,本人试过,都能成功仿真。

回答(3):

源程序如下

#include
#include圆首纳 /*用到了_nop_()函橘没数*/

#define uchar unsigned char

sbit rs=P3^0;
sbit rw=P3^1;
sbit en=P3^2;

void delay(uchar t) ;/*延时程序*/
void lcd_init() ;/*LCD初始化*/
bit lcd_busy() ;/*判LCD忙芹森否*/
void lcd_write_data(uchar d) ;/*写LCD数据*/
void lcd_write_com(uchar c) ;/*写LCD命令*/

..........
仿真图
额,不能插图进来
参考(有图)http://hi.baidu.com/chenxing263/blog/item/b7c025de3bff935895ee376a.html