不久前刚入门单片机,编了一个基于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;
}
看你的代码看到了几处写的好像不太正确呦仔细检查一下 其中 中断设置错误等
A:显示指针从矩形左上角的第一行第一个点开始,一个点一个点的在LCD上显示,在上面的时序图上表示为VCLK,我们称之为像素时钟信号
B:当显示指针一直显示到矩形的右边就结束这一行,那么这一行的动作在上面的时序图中就称之为1 Line
C:接下来显示指针又回到矩形的左边从第二行开始显示,注意,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换
D:如此类推,显示指针就这样一行一行的显示至矩形的右下角才把一副图显示完成。行的显示在时序图上看就是HSYNC
E:然而,LCD要显示多个图片就要一幅一幅的切换, 那么这每一幅图像就称之为帧,在时序图上就表示为1 Frame,因此从时序图上可以看出1 Line只是1 Frame中的一行
F:同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换,那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC