51单片机基于lcd1602的可调时钟,显示错误且无法调整时间,如何解决?

不久前刚入门单片机,编了一个基于lcd1602的可调时钟程序,但烧录后,lcd上的小时每一秒变更一次且看不出有任何规律,有时是数字,有时是字符,时间久了还会在其他位置随机显示数字或字符。此外,外部中断INT0和INT1即使按下按键也不会有任何反应。请问要如何解决?

main.c代码如下:

#include <STC12C5A60S2.h>
#include "LCD1602.h"

typedef unsigned char uchar;
typedef unsigned int uint;

uint second=0,minute=0,hour=0;

void time();
void count();
 
void main()
{
    //计时器工作方式2:定时器/计数器
    TMOD=0x02;
    //设置初始值
    TH0=0x56;
    TL0=0x56;
    //启动计时器
    TR0=1;
    EA=1;//开启中断
    ET0=1;//开启计时器中断
    //开启外部中断,下降沿触发
    EX0=1;
    IT0=1;
    EX1=1;
    IT1=1;
    //LCD初始化
    LCD_1602_Init();
    
    while(1)
    {
        time();
    }
}
//延迟1ms
void Delay(uint time)
{
    uint i,j;
    for(i=0;i<time;i++)
        for(j=0;j<930;j++)
            ;
}
//时间显示
void time()
{    
    Write_1602_String("Clock",0X80);//显示界面标题
    Write_1602_Num(hour/10,0XC0);//显示小时
    Write_1602_Num(hour%10,0XC1);
    Write_1602_String(":",0XC2);
    Write_1602_Num(minute/10,0XC3);//显示分钟
    Write_1602_Num(minute%10,0XC4);
    Write_1602_String(":",0XC5);
    Write_1602_Num(second/10,0XC6);//显示秒
    Write_1602_Num(second%10,0XC7);
    count();
}
//计时
void count()
{
    Delay(1000);
    second++;
    if(second==60)
    {
        second=0;
        minute++;//每60秒为一分钟
        if(minute==60)
        {
            minute=0;
            hour++;//每60分钟为一小时
            if(hour==24)
            {        
                hour=0;//小时为24时重置
            }
        }
    }
}
//调整分钟,外部中断0触发
void Set_minute() interrupt 0
{    
    minute++;
    if(minute==60)
        minute=0;
}
//调整小时,外部中断1触发
void Set_hour() interrupt 2
{
    hour++;
    if(hour==24)
        hour=0;
}        

看你的代码看到了几处写的好像不太正确呦仔细检查一下 其中 中断设置错误等

  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:【51单片机】LCD1602显示字符串,时间、时间+按键校准、秒表计时的功能代码。
  • 除此之外, 这篇博客: LCD控制器中的 所有显示器显示图像的原理都是从上到下,从左到右的。这是什么意思呢?这么说吧,一副图像可以看做是一个矩形,由很多排列整齐的点一行一行组成,这些点称之为像素。那么这幅图在LCD上的显示原理就是: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • A:显示指针从矩形左上角的第一行第一个点开始,一个点一个点的在LCD上显示,在上面的时序图上表示为VCLK,我们称之为像素时钟信号
    
    B:当显示指针一直显示到矩形的右边就结束这一行,那么这一行的动作在上面的时序图中就称之为1 Line
    
    C:接下来显示指针又回到矩形的左边从第二行开始显示,注意,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换
    
    D:如此类推,显示指针就这样一行一行的显示至矩形的右下角才把一副图显示完成。行的显示在时序图上看就是HSYNC
    
    E:然而,LCD要显示多个图片就要一幅一幅的切换, 那么这每一幅图像就称之为帧,在时序图上就表示为1 Frame,因此从时序图上可以看出1 Line只是1 Frame中的一行
    
    F:同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换,那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC