加按键调时的代码
- #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;
- }
复制代码 |