eeworker 发表于 2025-1-19 15:06 你可以把完整的程序贴出来,我给你看看 |
llzfry 发表于 2025-1-19 11:00 您好,我用的是STC的,如果可以的话能不能%,我把出现的情况详细说一下。 |
eeworker 发表于 2025-1-18 23:44 可以。请你确定你的单片机用的是STC还是AT的。还有一种可能就是写完指令后的延时时间不够,或者是你的程序在反复调用显示,这样是不合适的。 |
llzfry 发表于 2025-1-17 20:02 你好,可以和您交流一下吗 |
WL0123 发表于 2025-1-17 13:45 好的好的,谢谢前辈,我学习一下 |
| 可以在重新返回图1界面时,再次调用初始化,或者调用清屏,然后再调用显示距离就不会有问题了。 |
eeworker 发表于 2025-1-17 09:49 前面已经说了问题不在LCD驱动代码本身,而在于你主函数刷新LCD时是怎么调用驱动代码的。给你一个示例,有详细注释,读懂就不会解决不了目前的问题。
万年历汉字1602 1302 18B20 仿真程序.rar
(140.98 KB, 下载次数: 0)
|
| 因为前几天有点忙没注意登录,前辈帮我看一下驱动程序,我已经发上来了 |
|
void LcdWriteCmd(uchar cmd) { LcdRs_P = 0; LcdRw_P = 0; LcdEn_P = 0; P0=cmd; DelayMs(2); LcdEn_P = 1; DelayMs(2); LcdEn_P = 0; } void LcdWriteData(uchar dat) { LcdRs_P = 1; LcdRw_P = 0; LcdEn_P = 0; P0=dat; DelayMs(2); LcdEn_P = 1; DelayMs(2); LcdEn_P = 0; } void LcdGotoXY(uchar line,uchar column) { // 第一行 if(line==0) LcdWriteCmd(0x80+column); // 第二行 if(line==1) LcdWriteCmd(0x80+0x40+column); } void LcdPrintStr(uchar *str) { while(*str!='\0') LcdWriteData(*str++); } void LcdPrintNum(uint num) { LcdWriteData(num/100+0x30); // 百位 LcdWriteData(num%100/10+0x30); // 十位 LcdWriteData(num%10+0x30); // 个位 } void LcdInit() { LcdWriteCmd(0x38); // 16*2显示,5*7点阵,8位数据口 LcdWriteCmd(0x0C); // 开显示,不显示光标 LcdWriteCmd(0x06); // 地址加1,当写入数据后光标右移 LcdWriteCmd(0x01); // 清屏 } void LcdShowInit() { LcdGotoXY(0,0); // 定位到第0行第0列 LcdPrintStr("L: R: "); // 第0行显示“ U ” LcdGotoXY(1,0); // 定位到第1行第0列 LcdPrintStr("D: "); // 第1行显示“ L D R ” } |
eeworker 发表于 2025-1-12 21:47 程序发上来 |
WL0123 发表于 2025-1-12 07:19 可不可以麻烦前辈您帮我看一下程序 |
| 我认同楼上,如果初始正常,某一个动作以后不正常,首先应该判断的就是这个动作是不是导致了一些问题。在此可以使用排除法:首先把底下的负载切除,只剩下单片机最小系统,然后连线短接使系统达到进入这个动作所需要的外部条件,查看系统反应,如果正常,那就大概率是外部干扰,如果不正常,那就继续检查程序。 |
| 图1证明LCD驱动代码基本没有什么问题,刷新后成图2,这是LCD初始化失败的典型现象。这就要看你刷新LCD时是怎么调用的驱动代码的。也有可能是受中断干扰导致(虽然LCD对时序不是太敏感)。 |