加按鍵調時的代碼
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
-
- uchar code Table[] =
- { // 0 1 2 3 4 5 6 7 8 9 A b C d E 不顯 -
- 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0xFF,0xbf
- };
- //-----------------------------------------------------------------------------
- sbit SER = P1^0; //串行數據輸入端
- sbit STCP = P1^1; //時鐘脈沖信號——上升沿有效 存儲寄存器時鐘輸入端,并行輸出
- sbit SHCP = P1^2; //輸入信號————上升沿有效 移位寄存器時鐘輸入端
- sbit key1 = P3^0; //選擇鍵
- sbit key2 = P3^1; //加鍵
- sbit key3 = P3^2; //減鍵
- sbit key4 = P3^3;
- char shi=12,fen=59,miao=30;
- uchar shan,A,K,C,D,E,F;
- uchar knum; //選擇鍵計數變量
- uchar keycont1,keycont2,keycont3;//消抖計時變量
- bit lock1,lock2,lock3;//按鍵自鎖標志
- void TimerInit();
- void KeyScan();
- void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao); // 數碼管顯示
- void SMG_Int(uchar Dat); // 數碼管單字節串行移位函數
- //*****************************************************************************
- // 主程序
- void main ()
- {
- TimerInit();
- while(1)
- {
- Display (A,K,C,D,E,F);
- KeyScan();
- }
- }
- void KeyScan()
- {
- if(key1)
- {
- keycont1=0;
- lock1=0;
- }
- else if(lock1==0)
- {
- keycont1++;
- if(keycont1>50)
- {
- keycont1=0;
- lock1=1;
- knum++;
- if(knum==4)
- knum=0;
- }
- }
- /////////////////////////
- if(key2)
- {
- keycont2=0;
- lock2=0;
- }
- else if(lock2==0)
- {
- keycont2++;
- if(keycont2>50)
- {
- keycont2=0;
- lock2=1;
- switch(knum)
- {
- case 0: break;
- case 1: shi++; if(shi==24)shi=0; break;
- case 2: fen++; if(fen==60)fen=0; break;
- case 3: miao++; if(miao==60)miao=0; break;
- }
-
- }
- }
- /////////////////////////
- if(key3)
- {
- keycont3=0;
- lock3=0;
- }
- else if(lock3==0)
- {
- keycont3++;
- if(keycont3>50)
- {
- keycont3=0;
- lock3=1;
- switch(knum)
- {
- case 0: break;
- case 1: shi--; if(shi<0)shi=23; break;
- case 2: fen--; if(fen<0)fen=59; break;
- case 3: miao--; if(miao<0)miao=59; break;
- }
- }
- }
- }
- void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao)
- {
- uchar i;
- //顯示第1位 小時10位
- if(knum==1)
- {
- if(shan%4==0) //
- i = Table[15];
- else
- i = Table[shi10];
-
- SMG_Int(i);
- SMG_Int(0x01);
-
- STCP = 0; //數據并行輸出,(借助上升沿)
- _nop_();
- _nop_();
- STCP = 1;
-
- //顯示第2位 小時個位
- if(shan%4==0) //
- i = Table[15];
- else
- i = Table[shi];
-
- SMG_Int(i);
- SMG_Int(0x02);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
- }
- else
- {
- i = Table[shi10];
-
- SMG_Int(i);
- SMG_Int(0x01);
-
- STCP = 0; //數據并行輸出,(借助上升沿)
- _nop_();
- _nop_();
- STCP = 1;
-
- //顯示第2位 小時個位
- i = Table[shi];
-
- SMG_Int(i);
- SMG_Int(0x02);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
- }
- //顯示第3位 -
- if(shan<10) //"-" 閃爍
- i = Table[16];
- else
- i = Table[15];
- SMG_Int(i);
- SMG_Int(0x04);
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
- //顯示第4位 分鐘10位
- if(knum==2)
- {
- if(shan%4==0) //
- i = Table[15];
- else
- i = Table[fen10];
- SMG_Int(i);
- SMG_Int(0x08);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
-
- //顯示第5位 分鐘個位
- if(shan%4==0) //
- i = Table[15];
- else
- i = Table[fen];
-
- SMG_Int(i);
- SMG_Int(0x10);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
- }
- else
- {
- i = Table[fen10];
-
- SMG_Int(i);
- SMG_Int(0x08);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
-
- //顯示第5位 分鐘個位
- i = Table[fen];
-
- SMG_Int(i);
- SMG_Int(0x10);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
- }
- //顯示第6位 -
- if(shan<10) //"-" 閃爍
- i = Table[16];
- else
- i = Table[15];
- SMG_Int(i);
- SMG_Int(0x20);
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
- if(knum==3)
- {
- //顯示第7位 秒10位
- if(shan%4==0) //
- i = Table[15];
- else
- i = Table[miao10];
-
- SMG_Int(i);
- SMG_Int(0x40);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
-
- //顯示第8位 秒個位
- if(shan%4==0) //
- i = Table[15];
- else
- i = Table[miao];
-
- SMG_Int(i);
- SMG_Int(0x80);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
- }
- else
- {
- //顯示第7位 秒10位
- i = Table[miao10];
-
- SMG_Int(i);
- SMG_Int(0x40);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
-
- //顯示第8位 秒個位
- i = Table[miao];
-
- SMG_Int(i);
- SMG_Int(0x80);
-
- STCP = 0;
- _nop_();
- _nop_();
- STCP = 1;
- }
- }
- void SMG_Int(uchar Dat) //通過8次循環將8位數據移入74HC595
- {
- uchar i;
- for(i=8;i>=1;i--)
- {
- if (Dat & 0x80)
- {
- SER = 1;
- }
-
- else
- {
- SER = 0;
- }
- Dat <<= 1;
- SHCP = 0;
- _nop_();
- _nop_();
- SHCP = 1;
- }
- }
- void TimerInit() //定時器0初始化
- {
- TMOD = 0x01;
- TH0 = (65536-50000)/256; //50ms初值
- TL0 = (65536-50000)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void Timer0() interrupt 1
- {
- static uchar cnt;
-
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
-
- shan++;
- if(shan==20)
- shan=0;
- if(knum==0)
- {
- cnt++;
- if(cnt==20)
- {
- cnt = 0;
- miao++;
- if(miao == 60)
- {
- miao = 0;
- fen++;
- if(fen==60)
- {
- fen = 0;
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- }
- }
- }
- }
- A=shi/10;
- K=shi%10;
- C=fen/10;
- D=fen%10;
- E=miao/10;
- F=miao%10;
- }
復制代碼 |