但是到01之后又是正常顯示01 了,秒和小時是正常的
還有整點報時那里也不太清楚怎么修改,新人求解答
代碼如下
- #include <reg51.h>
- sbit key1 = P1^0;
- sbit beep = P1^0;
- bit flag1s = 0;
- bit KeySta = 1;
- unsigned char hour = 12;
- unsigned char minute =59;
- unsigned char second =50;
- unsigned char mode = 0;
- void FreshTime();
- void TimeInit();
- void IntInit();
- void InitLedBuff();
- void keyscan();
- void zhengdian();
- unsigned char code LedChar[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//共陰數(shù)碼管顯示字符轉換表
- unsigned char LedBuff[6] = {0xff,0xff,0xff,0xff,0xff,0xff};//數(shù)碼管顯示緩沖區(qū)
- void main()
- {
- TimeInit();
- IntInit();
- InitLedBuff();
- while(1)//顯示內容處理
- {
- if(flag1s&&!mode) //時間顯示模式
- {
- flag1s = 0;
- FreshTime();
- }
- else if(mode == 1) //校準分鐘
- {
- LedBuff[0] = 17;
- LedBuff[1] = 17;
- LedBuff[4] = 17;
- LedBuff[5] = 17;//不顯示
- LedBuff[2] = minute/10;
- LedBuff[3] = minute%10;
- }
- else if(mode == 2) //校準小時
- {
- LedBuff[2] = 17;
- LedBuff[3] = 17;
- LedBuff[4] = 17;
- LedBuff[5] = 17;//不顯示
- LedBuff[0] = hour/10;
- LedBuff[1] = hour%10;
- }
- else if(mode == 3) //校準完成重新顯示
- {
- InitLedBuff();
- mode = 0;
- }
- keyscan();
- }
- }
- void InitLedBuff()//初始化時間到顯示緩沖區(qū)
- {
- LedBuff[0] = hour/10;
- LedBuff[1] = hour%10;
- LedBuff[2] = minute/10;
- LedBuff[3] = minute%10;
- LedBuff[4] = second/10;
- LedBuff[5] = second%10;
- }
- void FreshTime()//刷新時間到顯示緩沖區(qū)
- {
- second++;
- if(second == 60)//進位
- {
- second = 0;
- minute++;
- LedBuff[2] = minute/10;
- LedBuff[3] = minute%10;
- if(minute ==60)//進位
- minute = 00;
- hour++;
- if(hour == 24)
- hour = 0;
- LedBuff[0] = hour/10;
- LedBuff[1] = hour%10;
- }
- LedBuff[4] = second/10;
- LedBuff[5] = second%10;
- }
- void TimeInit()//定時器初始化
- {
- TMOD = 0X11; //設置定時器為模式1
- TL0 = 0xB0;
- TH0 = 0x3C; //定時初值 50ms
- TL1 = 0x18; //
- TH1 = 0xFC; //定時初值 1ms
- TR0 = 1; //定時器0開始計時
- TR1 = 1; //定時器1開始計時
- ET1 = 1; //使能定時器1
- ET0 = 1; //使能定時器0
- PT0 = 1; //提高計時準確性,提高定時器0中斷優(yōu)先級
- EA = 1; //打開總中斷
- }
- void IntInit()//外部中斷初始化
- {
- IT0 = 1; //下降沿觸發(fā)
- EX0 = 1; //使能外部中斷0
- }
- void keyscan() //按鍵掃描及處理
- {
- static bit backup = 1;
- if (KeySta != backup) //當前值與前次值不相等說明此時按鍵有動作
- {
- if (backup == 0) //如果前次值為0,則說明當前是彈起動作
- {
- if(mode == 1)
- {
- minute++;
- if(minute==60)
- minute = 0;
- }
- else if(mode == 2)
- {
- hour++;
- if(hour==24)
- hour = 0;
- }
- }
- backup = KeySta; //更新備份為當前值,以備進行下次比較
- }
- }
- void Int0() interrupt 0
- {
- mode++;
- if(mode == 4)
- {
- mode = 0;
- }
- }
- void Ledfresh() //數(shù)碼管顯示刷新
- {
- static unsigned char i = 0;
- switch(i)
- {
- case 0 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
- case 1 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
- case 2 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
- case 3 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
- case 4 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i++;break;
- case 5 : P2 = ~(0x01<<i);P0 = LedChar[LedBuff[i]];i=0;break;
- }
- }
- void Time0() interrupt 1 //12MHz 50ms
- {
- static unsigned char n = 0;
- TL0 = 0xB0;
- TH0 = 0x3C;
- n++;
- if(n==20)
- {
- n=0;
- flag1s = 1;//1s標志位
- }
- }
- void zhengdian() //整點報時
- {
- if((second==0)&&((minute==0)&&(hour>=0)))
- {
- beep=1;
-
- beep=0;
-
- }
- }
- void Time1() interrupt 3 //12MHz 1ms
- {
- static unsigned char keybuff = 0xff;
- TL1 = 0x18;
- TH1 = 0xFC;
- Ledfresh();
- keybuff = (keybuff<<1)|key1;
- if (keybuff == 0x00)
- {
- KeySta = 0;
- }
- else if (keybuff == 0xFF)
- {
- KeySta = 1;
- }
- else
- {}
- }
復制代碼
|