找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

51单片机显示问题

查看数: 2141 | 评论数: 13 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-1-11 20:22

正文摘要:

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

回复

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

你可以把完整的程序贴出来,我给你看看
ID:1085509 发表于 2025-1-19 15:06
llzfry 发表于 2025-1-19 11:00
可以。请你确定你的单片机用的是STC还是AT的。还有一种可能就是写完指令后的延时时间不够,或者是你的程 ...

您好,我用的是STC的,如果可以的话能不能%,我把出现的情况详细说一下。
ID:1143113 发表于 2025-1-19 11:00
eeworker 发表于 2025-1-18 23:44
你好,可以和您交流一下吗

可以。请你确定你的单片机用的是STC还是AT的。还有一种可能就是写完指令后的延时时间不够,或者是你的程序在反复调用显示,这样是不合适的。
ID:1085509 发表于 2025-1-18 23:44
llzfry 发表于 2025-1-17 20:02
可以在重新返回图1界面时,再次调用初始化,或者调用清屏,然后再调用显示距离就不会有问题了。

你好,可以和您交流一下吗
ID:1085509 发表于 2025-1-17 22:20
WL0123 发表于 2025-1-17 13:45
前面已经说了问题不在LCD驱动代码本身,而在于你主函数刷新LCD时是怎么调用驱动代码的。给你一个示例,有 ...

好的好的,谢谢前辈,我学习一下
ID:1143113 发表于 2025-1-17 20:02
可以在重新返回图1界面时,再次调用初始化,或者调用清屏,然后再调用显示距离就不会有问题了。
ID:1133081 发表于 2025-1-17 13:45
eeworker 发表于 2025-1-17 09:49
因为前几天有点忙没注意登录,前辈帮我看一下驱动程序,我已经发上来了

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



ID:1085509 发表于 2025-1-17 09:49
因为前几天有点忙没注意登录,前辈帮我看一下驱动程序,我已经发上来了
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    ”
}


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

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

可不可以麻烦前辈您帮我看一下程序
ID:403593 发表于 2025-1-12 09:27
我认同楼上,如果初始正常,某一个动作以后不正常,首先应该判断的就是这个动作是不是导致了一些问题。在此可以使用排除法:首先把底下的负载切除,只剩下单片机最小系统,然后连线短接使系统达到进入这个动作所需要的外部条件,查看系统反应,如果正常,那就大概率是外部干扰,如果不正常,那就继续检查程序。
ID:1133081 发表于 2025-1-12 07:19
图1证明LCD驱动代码基本没有什么问题,刷新后成图2,这是LCD初始化失败的典型现象。这就要看你刷新LCD时是怎么调用的驱动代码的。也有可能是受中断干扰导致(虽然LCD对时序不是太敏感)。

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

Powered by 单片机教程网

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