找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3364|回复: 9
收起左侧

请问为什么Proteus仿真的时候 LCD1602的 3个寄存器端口 电平一直是灰色?

[复制链接]
ID:795658 发表于 2021-6-28 16:54 | 显示全部楼层 |阅读模式
请问为什么仿真的时候 LCD1602的 3个寄存器端口 电平一直是灰色?
51hei图片20210628164946.png

单片机源程序如下:
  1. #include "reg51.h"
  2. #include "stdio.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5.    

  6. #define D P0
  7. sbit E=P2^7;
  8. sbit RS=P2^6;
  9. sbit RW=P2^5;


  10. void delay_ms(uchar xms);                    
  11. void LcdWriteCom(uchar com);               
  12. void LcdWriteData(uchar dat);            
  13. void LcdInit();                                
  14. void Show_string1(uchar a[]);            
  15. void Show_string2(uchar a[]);            
  16. void show_string(uchar add,uchar a[]);            
  17. void show_number(uchar add,uint a);               
  18. void show_float(uchar add,float a);        


  19. void main()
  20. {
  21.     LcdInit();
  22.     Show_string1("LCD1602test");
  23.     while(1);
  24. }

  25. void delay_ms(uchar xms)
  26. {
  27.     uchar i,j;
  28.     for(i=xms;i>0;i--)
  29.         for(j=110;j>0;j--);
  30. }


  31. void LcdWriteCom(uchar com)
  32. {
  33.     E=0;
  34.     RW=0;
  35.     RS=0;
  36.     D=com;
  37.     delay_ms(5);
  38.     E=1;
  39.     delay_ms(5);
  40.     E=0;
  41. }

  42. void LcdWriteData(uchar dat)
  43. {
  44.     E=0;
  45.     RW=0;
  46.     RS=1;
  47.     D=dat;
  48.     delay_ms(5);
  49.     E=1;
  50.     delay_ms(5);
  51.     E=0;
  52. }

  53. void LcdInit()//³õʼ»¯
  54. {
  55.     LcdWriteCom(0x38);
  56.     LcdWriteCom(0x0c);
  57.     LcdWriteCom(0x06);
  58.     LcdWriteCom(0x01);
  59.     LcdWriteCom(0x80);
  60. }



  61. void show_string(uchar add,uchar a[])
  62. {
  63.     uchar i;
  64.     LcdWriteCom(0x80+add);
  65.     for(i=0;a[i]!='\0';i++)
  66.     {
  67.         LcdWriteData(a[i]);
  68.     }
  69. }


  70. void Show_string1(uchar a[])
  71. {
  72.     uchar i;
  73.     LcdWriteCom(0x80);
  74.     for(i=0;a[i]!='\0';i++)
  75.     {
  76.         LcdWriteData(a[i]);
  77.     }
  78. }


  79. void Show_string2(uchar a[])
  80. {
  81.     uchar i;
  82.     LcdWriteCom(0x80+0X40);
  83.     for(i=0;a[i]!='\0';i++)
  84.     {
  85.         LcdWriteData(a[i]);
  86.     }
  87. }


  88. void show_number(uchar add,uint a)
  89. {
  90.     char s[10];
  91.     sprintf(s,"%d",a);               
  92.     show_string(add,(uchar *)s);        
  93. }


  94. void show_float(uchar add,float a)
  95. {
  96.     char s[10];
  97.     sprintf(s,"% .1f",a);
  98.     show_string(add,(uchar *)s);
  99. }
复制代码



回复

使用道具 举报

ID:795658 发表于 2021-6-28 16:55 | 显示全部楼层
第一次仿真的时候是能成功显示的,之后不知道什么原因 3个寄存器的电平就变这样了
回复

使用道具 举报

ID:8222 发表于 2021-6-29 06:04 | 显示全部楼层
你的主程序只能运行一次就停止了。改成这样:
void main()
{
    while(1)
    {
    LcdInit();
    Show_string1("LCD1602test");
    }
}
回复

使用道具 举报

ID:795658 发表于 2021-6-29 10:38 | 显示全部楼层
温xyz 发表于 2021-6-29 06:04
你的主程序只能运行一次就停止了。改成这样:
void main()
{

你好,我试了下,改了之后还是不行,3个寄存器仍是灰色
回复

使用道具 举报

ID:824490 发表于 2021-6-29 14:04 | 显示全部楼层
温xyz 发表于 2021-6-29 06:04
你的主程序只能运行一次就停止了。改成这样:
void main()
{

应该是这样的:
LcdInit();
  while(1)
{
Show_string1("LCD1602test");
}
回复

使用道具 举报

ID:824490 发表于 2021-6-29 14:06 | 显示全部楼层
lcd的VEE接到VDD试试? 55375ed0102a2804d1d341fdc701bce6.png
回复

使用道具 举报

ID:795658 发表于 2021-6-29 14:08 | 显示全部楼层
名字不是重点 发表于 2021-6-29 14:04
应该是这样的:
LcdInit();
  while(1)

在实验箱上实操 确实亮了
但是proteus仿真一直不行,不太明白原因
回复

使用道具 举报

ID:824490 发表于 2021-6-29 14:27 | 显示全部楼层
你的CPU没有加载代码吧?所 有IO都是灰色的,除了上拉的那几个

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:795658 发表于 2021-6-29 14:29 | 显示全部楼层
名字不是重点 发表于 2021-6-29 14:27
你的CPU没有加载代码吧?所 有IO都是灰色的,除了上拉的那几个

!,谢谢提醒。
我看了下后发现 代码是加载了的,但是不小心勾选了“不进行仿真”
回复

使用道具 举报

ID:390416 发表于 2021-7-6 20:32 | 显示全部楼层
LCD1602显示℃ 这种自定义符号 http://www.51hei.com/bbs/dpj-200685-1.html
LCD1602液晶最新资料 说明了具体的时间要求 http://www.51hei.com/bbs/dpj-205768-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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