找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机显示问题

[复制链接]
跳转到指定楼层
楼主
请教各位大佬,我使用51单片机做测距抽水的系统,当距离没达到预设值时,显示如图1,当距离达到预设值水泵启动,显示屏变为图2,距离正常时不会自动回到显示距离的界面(像图1),一直保持图2状态,请各位大佬指导一下。

IMG_20250111_201031.jpg (1.43 MB, 下载次数: 0)

图1

图1

IMG_20250111_201208.jpg (1.4 MB, 下载次数: 0)

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

使用道具 举报

沙发
ID:1133081 发表于 2025-1-12 07:19 | 只看该作者
图1证明LCD驱动代码基本没有什么问题,刷新后成图2,这是LCD初始化失败的典型现象。这就要看你刷新LCD时是怎么调用的驱动代码的。也有可能是受中断干扰导致(虽然LCD对时序不是太敏感)。
回复

使用道具 举报

板凳
ID:403593 发表于 2025-1-12 09:27 | 只看该作者
我认同楼上,如果初始正常,某一个动作以后不正常,首先应该判断的就是这个动作是不是导致了一些问题。在此可以使用排除法:首先把底下的负载切除,只剩下单片机最小系统,然后连线短接使系统达到进入这个动作所需要的外部条件,查看系统反应,如果正常,那就大概率是外部干扰,如果不正常,那就继续检查程序。
回复

使用道具 举报

地板
ID:1085509 发表于 2025-1-12 21:47 | 只看该作者
WL0123 发表于 2025-1-12 07:19
图1证明LCD驱动代码基本没有什么问题,刷新后成图2,这是LCD初始化失败的典型现象。这就要看你刷新LCD时是 ...

可不可以麻烦前辈您帮我看一下程序
回复

使用道具 举报

5#
ID:1133081 发表于 2025-1-13 11:39 | 只看该作者
eeworker 发表于 2025-1-12 21:47
可不可以麻烦前辈您帮我看一下程序

程序发上来
回复

使用道具 举报

6#
ID:1085509 发表于 2025-1-17 09:47 | 只看该作者
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    ”
}


回复

使用道具 举报

7#
ID:1085509 发表于 2025-1-17 09:49 | 只看该作者
因为前几天有点忙没注意登录,前辈帮我看一下驱动程序,我已经发上来了
回复

使用道具 举报

8#
ID:1133081 发表于 2025-1-17 13:45 | 只看该作者
eeworker 发表于 2025-1-17 09:49
因为前几天有点忙没注意登录,前辈帮我看一下驱动程序,我已经发上来了

前面已经说了问题不在LCD驱动代码本身,而在于你主函数刷新LCD时是怎么调用驱动代码的。给你一个示例,有详细注释,读懂就不会解决不了目前的问题。 万年历汉字1602 1302 18B20 仿真程序.rar (140.98 KB, 下载次数: 0)



回复

使用道具 举报

9#
ID:1143113 发表于 2025-1-17 20:02 | 只看该作者
可以在重新返回图1界面时,再次调用初始化,或者调用清屏,然后再调用显示距离就不会有问题了。
回复

使用道具 举报

10#
ID:1085509 发表于 2025-1-17 22:20 | 只看该作者
WL0123 发表于 2025-1-17 13:45
前面已经说了问题不在LCD驱动代码本身,而在于你主函数刷新LCD时是怎么调用驱动代码的。给你一个示例,有 ...

好的好的,谢谢前辈,我学习一下
回复

使用道具 举报

11#
ID:1085509 发表于 2025-1-18 23:44 | 只看该作者
llzfry 发表于 2025-1-17 20:02
可以在重新返回图1界面时,再次调用初始化,或者调用清屏,然后再调用显示距离就不会有问题了。

你好,可以和您交流一下吗
回复

使用道具 举报

12#
ID:1143113 发表于 2025-1-19 11:00 | 只看该作者
eeworker 发表于 2025-1-18 23:44
你好,可以和您交流一下吗

可以。请你确定你的单片机用的是STC还是AT的。还有一种可能就是写完指令后的延时时间不够,或者是你的程序在反复调用显示,这样是不合适的。
回复

使用道具 举报

13#
ID:1085509 发表于 2025-1-19 15:06 | 只看该作者
llzfry 发表于 2025-1-19 11:00
可以。请你确定你的单片机用的是STC还是AT的。还有一种可能就是写完指令后的延时时间不够,或者是你的程 ...

您好,我用的是STC的,如果可以的话能不能%,我把出现的情况详细说一下。
回复

使用道具 举报

14#
ID:1143113 发表于 2025-1-22 12:54 | 只看该作者
eeworker 发表于 2025-1-19 15:06
您好,我用的是STC的,如果可以的话能不能%,我把出现的情况详细说一下。

你可以把完整的程序贴出来,我给你看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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