無標題.jpg (193.14 KB, 下載次數: 49)
下載附件
2020-8-10 09:08 上傳
- #include<reg52.h>
- #define key_S 15 //宏定義短按/消抖(約15ms)
- #define key_L key_S*35 //宏定義長按(約500ms)
- #define key_I key_S*27 //宏定義長按連續+/-間隔(約120ms)
- #define uint unsigned int
- #define uchar unsigned char
- sbit SER = P1^0; //數據輸入
- sbit SCK = P1^1; //串行移位時鐘
- sbit RCK = P1^2; //鎖存器時鐘
- sbit key0 = P3^5;
- sbit key1 = P3^6;
- sbit key2 = P3^7;
- uchar code table[]={//共陽數碼管段碼"0~f-."
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- uchar data dis_buf[]={0,0,0xbf,0,0,0xbf,0,0};//顯示緩存
- char sec=0,fen=0,shi=12;
- uchar num=0,KeySec;
- void delay_ms(uint z)
- {
- uint x,y;
- for(x = z;x>0;x--)
- for(y=115;y>0;y--);
- }
- void hc595(uchar Data)//74HC595的數據串入并出子程序
- {
- uchar i;
- for(i=0;i<8;i++) //由高位到低位發送一個字節
- {
- Data<<=1; //左移一位,最高位溢出到位寄存器CY
- SER=CY; //從位寄存器的進位標志位CY讀取
- SCK = 0; //串行移位
- SCK = 1;
- }
- RCK = 0; //鎖存
- RCK = 1;
- }
- void key()
- {
- static unsigned int time=0;//計數變量
- if(!key0||!key1||!key2)
- {
- time++;
- if(time>key_L)//長按有效
- time=key_I;//連續+/-間隔
- if(time==key_S)//短按消抖
- {
- if(!key0)//調整時、分、秒
- {
- KeySec++;
- if(KeySec>3)
- {
- KeySec=0;
- num=0;
- }
- }
- }
- if(time==key_S||time==key_L)//短按消抖或長按連+/-
- {
- if(!key1 && KeySec!=0)//++
- {
- switch(KeySec)
- {
- case 1: shi++;if(shi>23)shi=0; break;
- case 2: fen++;if(fen>59)fen=0; break;
- case 3: sec++;if(sec>59)fen=0; break;
- }
- }
- if(!key2 && KeySec!=0)//--
- {
- switch(KeySec)
- {
- case 1: shi--;if(shi<0)shi=23; break;
- case 2: fen--;if(fen<0)fen=59; break;
- case 3: sec--;if(sec<0)sec=59; break;
- }
- }
- }
- }
- else time=0;
- }
- void display(void)
- {
- static uchar i=0;
- dis_buf[0]=table[shi/10];
- dis_buf[1]=table[shi%10];
- dis_buf[3]=table[fen/10];
- dis_buf[4]=table[fen%10];
- dis_buf[6]=table[sec/10];
- dis_buf[7]=table[sec%10];
- P2=0xff; //段碼消隱
- hc595(0x01<<i); //送位碼
- if((KeySec==1 && i==1)||(KeySec==2 && i==4)||(KeySec==3 && i==7))
- P2=dis_buf[i]&0x7f; //送段碼加點
- else P2=dis_buf[i]; //送段碼不加點
- i++;
- i%=8;
- }
- void Timer0Init() //20毫秒@12.000MHz
- {
- TMOD= 0x01; //設置定時器模式
- TL0 = 0xE0; //設置定時初值
- TH0 = 0xB1; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- EA = 1; //開總中斷
- ET0 = 1; //開T0中斷
- }
- void main()
- {
- Timer0Init();
- while(1)
- {
- key();
- display();
- delay_ms(1);//控制主循環周期約1ms
- }
- }
- void timer0() interrupt 1
- {
- TL0 = 0xE0;
- TH0 = 0xB1;
- num++;
- if(num>=50)
- {
- num=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- fen++;
- if(fen>=60)
- {
- fen=0;
- shi++;
- if(shi>=24)
- {
- shi=0;
- }
- }
- }
- }
- }
復制代碼
|