找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2217|回复: 6
收起左侧

我的单片机+LCD1602怎么显示不了?

[复制链接]
ID:907204 发表于 2022-3-26 17:59 | 显示全部楼层 |阅读模式
lcd仿真.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. //定义控制引脚
  4. sbit RS=P2^0;
  5. sbit RW=P2^1;
  6. sbit E=P2^2;

  7. extern void lcd_W_cmd(unsigned char com);                 //LCD写命令函数
  8. extern void lcd_W_dat(unsigned char dat);                    //LCD写数据函数
  9. extern void lcd_init();                                                  //LCD初始化函数
  10. extern        void show_sting(unsigned char ch[]);             //显示字符串
  11. extern void show_data(unsigned int dbyte)reentrant;       //显示数据


  12. //实现软件延时,延时时间为i*1ms
  13. void delay(unsigned int i)
  14. {
  15.         unsigned char k;
  16.         while(i--);        
  17.         for(k=0;k<120;k++);                   //120次空操作
  18. }

  19. //采用软件延时,5个机器周期
  20. void delay1()
  21. {
  22.         _nop_();
  23.         _nop_();
  24.         _nop_();
  25. }

  26. //读状态字
  27. unsigned char lcd_r_start()
  28. {
  29.         unsigned char s;
  30.         RW=1;                  //RW=1,RS=0,读LCd状态
  31.         delay1();
  32.         RS=0;
  33.         delay1();
  34.         E=1;                                                                        //E端时序
  35.         delay1();
  36.         s=P0;                 //从LCD的数据口读状态
  37.         delay1();
  38.         E=0;               
  39.         delay1();
  40.         RW=0;
  41.         delay1();
  42.         return(s);           //返回读取的LCD状态字
  43. }

  44. //写命令
  45. void lcd_w_cmd(unsigned char com)
  46. {
  47.         unsigned char i;
  48.         do{                               //查LCD忙操作
  49.                 i=lcd_r_start();      //调用读状态字函数,读取LCD状态字
  50.                 i=i&0x80;             //与操作屏蔽掉低7位
  51.                 delay(1);             //延时1ms
  52.         }while(i!=0);               //LCD忙,继续查询,否则退出循环
  53.         RW=0;                  
  54.         delay1();
  55.         RS=0;                  //RW=0,RS=0,写LCD命令操作
  56.         delay1();
  57.         E=1;                                                                                //E端时序
  58.         delay1();
  59.         P0=com;               //将com中的命令写入LCD数据口
  60.         delay1();
  61.         E=0;
  62.         delay1();
  63.         RW=1;
  64.         delay(1);
  65. }

  66. //写数据
  67. void lcd_W_dat(unsigned char dat)
  68. {
  69.         unsigned char i;
  70.         do{                               //查LCD忙操作
  71.                 i=lcd_r_start();      //调用读状态字函数,读取LCD状态字
  72.                 i=i&0x80;             //与操作屏蔽掉低7位
  73.                 delay(1);             //延时1ms
  74.         }while(i!=0);              //LCD忙,继续查询,否则退出循环
  75.         RW=0;
  76.         delay1();
  77.         RS=1;                                                                                //RW=0,RS=0,写LCD数据
  78.         delay1();
  79.         E=1;                                                                                //E端时序
  80.         delay1();
  81.         P0=dat;                 //将dat中的命令写入LCD数据口   
  82.         delay1();
  83.         E=0;
  84.         delay1();
  85.         RW=1;
  86.         delay(255);
  87. }

  88. //lcd初始化
  89. void lcd_init()
  90. {
  91.         lcd_w_cmd(0x38);     //设置工作方式
  92.         lcd_w_cmd(0x0c);     //设置显示状态
  93.         lcd_w_cmd(0x01);            //清屏
  94.         lcd_w_cmd(0x06);     //设置输入方式
  95.         lcd_w_cmd(0x80);     //设置初始显示位置
  96. }

  97. //在LCD上显示字符串函数
  98. void show_sting(unsigned char ch[])
  99. {
  100.         unsigned char i;
  101.         i=0;
  102.         while(ch[i]!='\0')                   //字符串结束符
  103.         {
  104.                 lcd_w_cmd(0x83+i);      //字符串显示位置
  105.                 lcd_W_dat(ch[i]);
  106.                 i++;
  107.         }
  108. }

  109. void main()
  110. {
  111.         lcd_init();           //LCD初始化   
  112.         while(1)
  113.         {
  114.                 show_sting("HELLO");
  115.         }
  116. }
复制代码

LCDtest.zip

40.22 KB, 下载次数: 6

回复

使用道具 举报

ID:907204 发表于 2022-3-26 18:06 | 显示全部楼层
求有空的大佬帮忙看看哪里出问题了!谢谢
回复

使用道具 举报

ID:975909 发表于 2022-3-26 18:59 | 显示全部楼层
如果lcd1602显示达不到预期效果,肯定程序有点错误
回复

使用道具 举报

ID:149451 发表于 2022-3-26 19:12 | 显示全部楼层
有显示啊,没问题的 捕获.JPG

回复

使用道具 举报

ID:161164 发表于 2022-3-26 19:21 | 显示全部楼层
部份版本的Protues LCD1602仿真不支援查忙
于是你的程序在While(i!=0)中死循环了
回复

使用道具 举报

ID:907204 发表于 2022-3-26 19:36 | 显示全部楼层
w1179benp 发表于 2022-3-26 19:12
有显示啊,没问题的

谢大佬帮忙查看,看了二楼知道问题出在哪里了!前几天protues8.6升8.9了,应该是这个原因。
回复

使用道具 举报

ID:907204 发表于 2022-3-26 19:38 | 显示全部楼层
lkc8210 发表于 2022-3-26 19:21
部份版本的Protues LCD1602仿真不支援查忙
于是你的程序在While(i!=0)中死循环了

谢谢大佬!应该是版本问题,我前几天protues8.6换8.9了。感谢
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表