|
5黑幣
我想在1602LCD液晶上第一行顯示日期,第二行顯示時(shí)間,我定時(shí)器設(shè)置為50ms中斷一次,但是當(dāng)我在中斷中寫入if(i==20)i清零,秒自增時(shí)不是一秒加一次,而是差不多兩秒加一次,這是怎么回事?代碼如下:
- #include<reg52.h>
- uchar hours=1,mins=3,ss=0,hourg=9,ming=6,sg=0; //最后一個(gè)字母帶s表示十位,g表示個(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; //當(dāng)要對(duì)1602寫時(shí)RW=0,表示允許寫入
- P0=cmd;
- delay1ms();
- E=1;
- delay5ms();
- E=0;
- }
- void write_dat(uchar dat)
- {
- E=0;
- RS=1; //RS=1為寫數(shù)據(jù)
- RW=0; //當(dāng)要對(duì)1602寫時(shí)RW=0,表示允許寫入
- P0=dat;
- delay1ms();
- E=1;
- delay5ms();
- E=0;
- }
- void init()
- { //(STA7~STA0)(D7~D0)STA7為讀寫操作使能 1為禁止 2為允許
- E=0; //使能先關(guān)閉 為后面使能高脈沖做鋪墊
- write_cmd(0x38); //送入 0011 1000 設(shè)置16X2顯示
- write_cmd(0x0c); //光標(biāo)顯示設(shè)置 0000 1DCB
- //D=1開(kāi)顯示 C=1顯示光標(biāo) B=1光標(biāo)閃爍
- write_cmd(0x06); //光標(biāo)設(shè)置 0000 01NS
- //N=1 讀R或?qū)慦一個(gè)字符后地址指針加1,光標(biāo)自加一;反之N=0 減一
- write_cmd(0x01); //01表示顯示清屏:數(shù)據(jù)指針清零 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();
- }
復(fù)制代碼
|
|