找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1907|回复: 17
打印 上一主题 下一主题
收起左侧

51单片机LCD1602仿真为什么字符只能显示一两秒?

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
程序在开发板上尝试过,没有任何问题,但是到了仿真里面就是只能显示一两秒,求教!附上完整代码和仿真。
代码:
#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仿真

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:342822 发表于 2022-6-8 23:21 | 只看该作者
没问题
回复

使用道具 举报

板凳
ID:390416 发表于 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
回复

使用道具 举报

地板
ID:372579 发表于 2022-6-9 08:27 | 只看该作者
要把仿真图也上传上来看看,还有你对比下是不是电路图画错了
回复

使用道具 举报

5#
ID:1033099 发表于 2022-6-9 08:36 | 只看该作者
delay太长了
回复

使用道具 举报

6#
ID:161164 发表于 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. }
复制代码


回复

使用道具 举报

7#
ID:1012735 发表于 2022-6-9 12:46 | 只看该作者
while(*p != '0')      这句错了!
回复

使用道具 举报

8#
ID:1033526 发表于 2022-6-9 15:47 | 只看该作者
看下是不是定时里面没做循环
回复

使用道具 举报

9#
ID:702127 发表于 2022-6-11 14:36 | 只看该作者

您用Proteus仿真可以正常显示
回复

使用道具 举报

10#
ID:702127 发表于 2022-6-11 14:42 | 只看该作者
lkc8210 发表于 2022-6-9 09:14
如果只显示固定文字
运行一次就可以了

我也尝试过这样写,这样写的话就是固定显示了,不能刷新,这样是没问题的。一旦循环显示,就只能显示一两秒,然后就消失了。
回复

使用道具 举报

11#
ID:702127 发表于 2022-6-11 14:43 | 只看该作者
820845001 发表于 2022-6-9 15:47
看下是不是定时里面没做循环

做了,我在硬件上尝试,是没问题的。
回复

使用道具 举报

12#
ID:702127 发表于 2022-6-11 14:44 | 只看该作者
hy47566398 发表于 2022-6-9 12:46
while(*p != '0')      这句错了!

应该换成\0吗
回复

使用道具 举报

13#
ID:161164 发表于 2022-6-11 15:59 来自手机 | 只看该作者
ii11nnocent 发表于 2022-6-11 14:42
我也尝试过这样写,这样写的话就是固定显示了,不能刷新,这样是没问题的。一旦循环显示,就只能显示一两 ...

如果要更新显示内容
就只在有内容改变时更新一次
或加一些延时
不要高速刷新
回复

使用道具 举报

14#
ID:342822 发表于 2022-6-11 16:08 | 只看该作者
本帖最后由 taotie 于 2022-6-11 17:40 编辑
ii11nnocent 发表于 2022-6-11 14:36
您用Proteus仿真可以正常显示



02两个字缺失
回复

使用道具 举报

15#
ID:702127 发表于 2022-6-11 21:26 | 只看该作者
ii11nnocent 发表于 2022-6-11 14:43
做了,我在硬件上尝试,是没问题的。

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

使用道具 举报

16#
ID:342822 发表于 2022-6-12 09:13 | 只看该作者

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

使用道具 举报

17#
ID:342822 发表于 2022-6-12 17:55 | 只看该作者
或者改为while(*p != 0)
回复

使用道具 举报

18#
ID:1034505 发表于 2022-6-14 23:37 来自手机 | 只看该作者
可能延时太短
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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