單鍵調時,適用帶冒號時鐘專用數碼管。
無標題.jpg (139.15 KB, 下載次數: 62)
下載附件
2022-8-14 07:17 上傳
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define key_S 3 //宏定義短按(約15ms)
- #define key_L key_S*40 //宏定義長按(約600ms)
- #define key_I key_S*20 //宏定義長按連+間隔(約300ms)
- sbit K1=P2^4;//連接按鍵
- sbit DP=P0^7;//連接冒號
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
- uchar displayData[4];//顯示數據緩存
- char shi=12,fen=0,sec=0;//時,分,秒
- uchar Cnt5ms;//5ms時基
- uchar KeySec;//鍵值
- uint num=0;//計數
- bit flashing=0;//閃爍標志
- //定時器初始化程序
- void Timer0Init()//5毫秒@12.000MHz
- {
- TMOD=0x01;//定時器T0方式1
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- TF0=0;//中斷請求清0
- TR0=1;//啟動T0
- }
- void keyscan()
- {
- static unsigned int time=0;//計數變量
- if(!K1)//按鍵按下
- {
- time++;
- if(time>=key_L)//長按
- {
- switch(KeySec)
- {
- case 1: shi++;if(shi>23)shi=0; break;
- case 2: fen++;if(fen>59)fen=0; break;
- }
- time=key_I;//連+間隔
- num=1000;//自復位變量賦值(5秒)
- }
- }
- else //松手
- {
- if(time>key_S && time<key_I)//短按
- {
- KeySec++;
- if(KeySec>2)
- {
- KeySec=0;
- Cnt5ms=0;
- sec=0;
- }
- num=1000;//自復位變量賦值(5秒)
- }
- time=0;
- }
- }
- void display()//顯示
- {
- static uchar i=0;
- displayData[0] = tab[shi/10%10];
- displayData[1] = tab[shi%10];
- displayData[2] = tab[fen/10%10];
- displayData[3] = tab[fen%10];
- P2&=0xf0;//消隱
- if(KeySec==0)
- P0=displayData[i];
- if(KeySec==1)
- {
- if(flashing && (i==0||i==1) && K1)
- P0=0xff;//時調整閃爍
- else P0=displayData[i];
- }
- if(KeySec==2)
- {
- if(flashing && (i==2||i==3) && K1)
- P0=0xff;//分調整閃爍
- else P0=displayData[i];
- }
- P2|=0x01<<i;
- i=++i%4;
- }
- void main()//主函數
- {
- Timer0Init();//初始化定時器
- while(1)
- {
- if(TF0)//查詢定時器中斷請求位
- {
- TF0=0;
- TH0=(65536-5000)/256;//5ms
- TL0=(65536-5000)%256;
- Cnt5ms++;
- if(KeySec!=0)
- {
- num--;
- if(num==0)//按鍵停止操作5秒自動恢復正常顯示
- {
- KeySec=0;
- Cnt5ms=0;
- sec=0;
- }
- if(Cnt5ms%50==0) //0.25s 快閃
- flashing=~flashing;
- }
- else if(Cnt5ms%100==0)//0.5s 慢閃
- flashing=~flashing;
- if(Cnt5ms==200)//1s
- {
- Cnt5ms=0;
- sec++;
- if(sec>=60)
- {
- sec=0;
- fen++;
- if(fen>=60)
- {
- fen=0;
- shi++;
- if(shi>23)
- shi=0;
- }
- }
- }
- keyscan(); //按鍵掃描
- display(); //數碼管顯示
- if(KeySec==0)
- DP=flashing; //閃冒號 表示走時
- else DP=0;
- }
- }
- }
復制代碼
4位數碼管時鐘仿真.rar
(125.11 KB, 下載次數: 15)
2022-8-14 07:20 上傳
點擊文件名下載附件
|