标题: 51单片机LCD1602仿真为什么字符只能显示一两秒? [打印本页]

作者: ii11nnocent    时间: 2022-6-8 18:50
标题: 51单片机LCD1602仿真为什么字符只能显示一两秒?
程序在开发板上尝试过,没有任何问题,但是到了仿真里面就是只能显示一两秒,求教!附上完整代码和仿真。
代码:
#include "reg52.h"  

#define LCD_DB  P1              //宏定义P1口  
sbit RW = P3^5;  
sbit RS = P3^6;  
sbit E  =   P3^4;                       //位定义LCD1602的RW、RS和E端口  

void delay(unsigned int i);  
void LCD_WriteCom(unsigned char com);  
void LCD_WriteData(unsigned char dat);  
void LCD_Init(void);  
void LCD_WriteString(unsigned int x,unsigned int y,unsigned char *p);  

void delay(unsigned int i)  //延时程序  
{  
    while(i--);  
}  

void LCD_WriteCom(unsigned char com)    //写入命令  
{  
    LCD_DB = com;                   //待传送代码放入P0口  

    delay(100);                     //延时,等待数据稳定  
    RS = 0;                             //选择发送命令  
    RW = 0;                             //选择写入  
    E = 1;                              //写入时序  
    delay(100);                     //下降沿保持时间  
    E = 0;  
}  

void LCD_WriteData(unsigned char dat)       //写入数据  
{  
    LCD_DB = dat;                   //待传送代码放入P0口  

    delay(100);                     //延时,等待数据稳定  
    RS = 1;                             //选择输入数据  
    RW = 0;                             //选择写入  
    E = 1;                              //写入时序  
    delay(100);                     //下降沿保持时间  
    E = 0;  
}  

void LCD_Init(void)         //LCD初始化子程序  
{  

    LCD_WriteCom(0x38);     //功能设定,设置双行显示,8位数据总线DB0~DB7,5X7点阵/字符  
    LCD_WriteCom(0x0c);     //显示开关设定,开显示,不显示光标  
    LCD_WriteCom(0x06);     //进入模式设定,写一个数据后光标向右移动,显示屏不移动  
    LCD_WriteCom(0x01);     //清屏,清空DDRAM的内容  
}  

/*显示字符串函数,x为行数:1~2,y为列数:1~16,*p是要显示的字符串指针*/  
void LCD_WriteString(unsigned int x,unsigned int y,unsigned char *p)  
{  
     x--;  
    y--;  
    while(*p != '0')                         //如果没显示到字符串结尾时,就进入循环  
    {  
        if(x==0)                                 //在第一行显示  
        {  
            y|=0x80;  
            LCD_WriteCom(y);  //将需要显示的列数位置与0x80相与,得到在该行下的具体位置  
            LCD_WriteData(*p); //显示p中的字符  
            y++;                        //显示完一个字符后,列数+1  
            p++;                       //指针地址+1,显示下一个字符  
        }  
        if(x==1)                                //在第二行显示  
        {  
            y|=0xc0;  
            LCD_WriteCom(y); //将需要显示的列数位置与0xc0相与,得到在该行下的具体位置  
            LCD_WriteData(*p); //显示p中的字符  
            y++;                        //显示完一个字符后,列数+1  
            p++;                       //指针地址+1,显示下一个字符  
        }  
    }         
}  

void main(void)  
{  
    LCD_Init();  
    while(1)  
    {  
        LCD_WriteString(1,1,"LCD1602");  //在第一行第五列开始显示字符串
    }  
}


1602例程.rar

48.85 KB, 下载次数: 35

1602仿真


作者: taotie    时间: 2022-6-8 23:21
没问题
作者: 人人学会单片机    时间: 2022-6-9 08:14
http://www.51hei.com/bbs/dpj-205768-1.html
LCD1602液晶最新资料 说明了具体的时间要求

LCD1602液晶最新资料 说明了具体的时间要求
http://www.51hei.com/bbs/dpj-214747-1.html
作者: aide51    时间: 2022-6-9 08:27
要把仿真图也上传上来看看,还有你对比下是不是电路图画错了
作者: startxk    时间: 2022-6-9 08:36
delay太长了
作者: lkc8210    时间: 2022-6-9 09:14
如果只显示固定文字
运行一次就可以了
  1. void main(void)  
  2. {  
  3.     LCD_Init();  
  4.     LCD_WriteString(1,1,"LCD1602");  //在第一行第五列开始显示字符串
  5.     while(1)  
  6.     {  
  7.     }  
  8. }
复制代码



作者: hy47566398    时间: 2022-6-9 12:46
while(*p != '0')      这句错了!
作者: 820845001    时间: 2022-6-9 15:47
看下是不是定时里面没做循环
作者: ii11nnocent    时间: 2022-6-11 14:36
taotie 发表于 2022-6-8 23:21
没问题

您用Proteus仿真可以正常显示
作者: ii11nnocent    时间: 2022-6-11 14:42
lkc8210 发表于 2022-6-9 09:14
如果只显示固定文字
运行一次就可以了

我也尝试过这样写,这样写的话就是固定显示了,不能刷新,这样是没问题的。一旦循环显示,就只能显示一两秒,然后就消失了。
作者: ii11nnocent    时间: 2022-6-11 14:43
820845001 发表于 2022-6-9 15:47
看下是不是定时里面没做循环

做了,我在硬件上尝试,是没问题的。
作者: ii11nnocent    时间: 2022-6-11 14:44
hy47566398 发表于 2022-6-9 12:46
while(*p != '0')      这句错了!

应该换成\0吗
作者: lkc8210    时间: 2022-6-11 15:59
ii11nnocent 发表于 2022-6-11 14:42
我也尝试过这样写,这样写的话就是固定显示了,不能刷新,这样是没问题的。一旦循环显示,就只能显示一两 ...

如果要更新显示内容
就只在有内容改变时更新一次
或加一些延时
不要高速刷新
作者: taotie    时间: 2022-6-11 16:08
本帖最后由 taotie 于 2022-6-11 17:40 编辑
ii11nnocent 发表于 2022-6-11 14:36
您用Proteus仿真可以正常显示



02两个字缺失

作者: ii11nnocent    时间: 2022-6-11 21:26
ii11nnocent 发表于 2022-6-11 14:43
做了,我在硬件上尝试,是没问题的。

我也是,实际搭建的硬件没问题,一到proteus就显示一两次,我觉得可能是模拟环境和实际硬件有一些差距,找了好多原因,结果还是解决不了,是在不行就用别人能显示的1602例子吧,有可能是延时的问题,谢谢各位。
作者: taotie    时间: 2022-6-12 09:13

只需将while(*p != '0') 改为while(*p != '\0') 就OK

作者: taotie    时间: 2022-6-12 17:55
或者改为while(*p != 0)
作者: 13132984104    时间: 2022-6-14 23:37
可能延时太短




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1