我想在1602LCD液晶上第一行显示日期,第二行显示时间,我定时器设置为50ms中断一次,但是当我在中断中写入if(i==20)i清零,秒自增时不是一秒加一次,而是差不多两秒加一次,这是怎么回事?代码如下:
- #include<reg52.h>
- uchar hours=1,mins=3,ss=0,hourg=9,ming=6,sg=0; //最后一个字母带s表示十位,g表示个位
- void delay1ms(void) // 1ms
- {
- unsigned char a,b,c;
- for(c=1;c>0;c--)
- for(b=142;b>0;b--)
- for(a=2;a>0;a--);
- }
- void delay5ms(void) // 5ms
- {
- unsigned char a,b;
- for(b=19;b>0;b--)
- for(a=130;a>0;a--);
- }
- void write_cmd(uchar cmd)
- {
- E=0;
- RS=0; //RS=0为写命令
- RW=0; //当要对1602写时RW=0,表示允许写入
- P0=cmd;
- delay1ms();
- E=1;
- delay5ms();
- E=0;
- }
- void write_dat(uchar dat)
- {
- E=0;
- RS=1; //RS=1为写数据
- RW=0; //当要对1602写时RW=0,表示允许写入
- P0=dat;
- delay1ms();
- E=1;
- delay5ms();
- E=0;
- }
- void init()
- { //(STA7~STA0)(D7~D0)STA7为读写操作使能 1为禁止 2为允许
- E=0; //使能先关闭 为后面使能高脉冲做铺垫
- write_cmd(0x38); //送入 0011 1000 设置16X2显示
- write_cmd(0x0c); //光标显示设置 0000 1DCB
- //D=1开显示 C=1显示光标 B=1光标闪烁
- write_cmd(0x06); //光标设置 0000 01NS
- //N=1 读R或写W一个字符后地址指针加1,光标自加一;反之N=0 减一
- write_cmd(0x01); //01表示显示清屏:数据指针清零 02表示显示回车
- }
- uchar hours=1,mins=3,ss=0,hourg=9,ming=6,sg=0;
- void Time0_init()
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TR0=1;
- EA=1;
- ET0=1;
- }
- void timer()
- {
- if(sg==10)
- {
- sg=0;
- ss++;
- if(ss==6)
- {
- ss=0;
- ming++;
- if(ming==10)
- {
- ming=0;
- mins++;
- if(mins==6)
- {
- mins=0;
- hourg++;
- if(hours==2&&hourg==4)
- {
- hours=0;
- hourg=0;
- }
- if(hourg==10)
- {
- hourg=0;
- hours++;
-
- }
- }
- }
- }
- }
- }
- void main()
- {
-
- Time0_init();
- init();
-
- while(1);
- }
- void Time0() interrupt 1
- {
- uchar i;
- uchar a[]={'2','0','1','8','/','0','7','/','2','6'};
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- i++;
- if(i==5)
- {
- i=0;
- sg++;
- }
-
- write_cmd(0x80+3);
- write_dat(a[0]);
- write_cmd(0x80+4);
- write_dat(a[1]);
- write_cmd(0x80+5);
- write_dat(a[2]);
- write_cmd(0x80+6);
- write_dat(a[3]);
- write_cmd(0x80+7);
- write_dat(a[4]);
- write_cmd(0x80+8);
- write_dat(a[5]);
- write_cmd(0x80+9);
- write_dat(a[6]);
- write_cmd(0x80+10);
- write_dat(a[7]);
- write_cmd(0x80+11);
- write_dat(a[8]);
- write_cmd(0x80+12);
- write_dat(a[9]);
-
-
-
-
-
-
-
- write_cmd(0x80+0x40+4);
- write_dat(0x30+hours);
- write_cmd(0x80+0x40+5);
- write_dat(0x30+hourg);
- write_cmd(0x80+0x40+6);
- write_dat(':');
- write_cmd(0x80+0x40+7);
- write_dat(0x30+mins);
- write_cmd(0x80+0x40+8);
- write_dat(0x30+ming);
- write_cmd(0x80+0x40+9);
- write_dat(':');
- write_cmd(0x80+0x40+10);
- write_dat(0x30+ss);
- write_cmd(0x80+0x40+11);
- write_dat(0x30+sg);
- timer();
- }
复制代码
|