無標題.jpg (177.75 KB, 下載次數: 61)
下載附件
2020-8-30 10:25 上傳
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- //端口定義
- sbit key=P2^7; //按鍵
- //全局變量定義
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//0~f段碼
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar data dis_buf[6]; //顯示緩存
- uchar Cnt250us=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//計時變量
- bit stop=0; //停止標志
- /***********按鍵掃描程序****************/
- void keyscan()
- {
- static uint count1=0; //計數變量
- static bit key_sign=0; //按鍵自鎖標志
- if(!key) //檢測按鍵為0
- {
- count1++; //計數延時消抖
- if(count1>40 && key_sign==0)//消抖
- key_sign=1; //按鍵自鎖標志置1,防止重復響應
- if(count1==2000) //長按0.5秒
- {
- count1=2001;
- Cnt250us=0;
- Cnt10ms=0;
- Cnt1s=0;
- Cnt1min=0;
- stop=0;
- }
- }
- else
- {
- if(count1<2000&&key_sign==1)//短按
- {
- stop=~stop;
- }
- count1=0; //計數變量清0
- key_sign=0; //按鍵自鎖標志清0
- }
- }
- /***********定時器初始化程序****************/
- void Timer0Init() //250微秒@12.000MHz
- {
- TMOD |= 0x02; //設置定時器模式
- TL0 = 0x06; //設置定時初值
- TH0 = 0x06; //設置定時重載值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- }
- /***********共陰數碼管顯示程序****************/
- void display()
- {
- static uchar i=0; //計數變量
- P0=0x00;//消隱
- P2&=0xc0;//清低6位
- P2|=~(0x01<<i);//送位碼
- P0=dis_buf[i];//送段碼
- i++;
- i%=6;
- }
- /***************主程序****************/
- void main()
- {
- Timer0Init(); //定時器初始化
- while(1)
- {
- if(TF0)
- {
- TF0=0; //清除TF0標志
- Cnt250us++; //中斷變量Cntus自+1
- if(Cnt250us>=40) //10ms
- {
- Cnt250us=0; //清0
- if(stop==1) //啟動
- Cnt10ms++; //10毫秒計數
- if(Cnt10ms>=100)
- {
- Cnt10ms=0;
- Cnt1s++; //秒計數
- }
- if(Cnt1s>=60)
- {
- Cnt1s=0;
- Cnt1min++; //分計數
- if(Cnt1min>=100)
- Cnt1min=0;
- }
- }
- keyscan(); //按鍵掃描
- //數據分解放入顯示緩存
- dis_buf[0]=table[Cnt1min/10];
- dis_buf[1]=table[Cnt1min%10]|0x80;//加點
- dis_buf[2]=table[Cnt1s/10];
- dis_buf[3]=table[Cnt1s%10]|0x80;//加點
- dis_buf[4]=table[Cnt10ms/10];
- dis_buf[5]=table[Cnt10ms%10];
- display(); //顯示程序
- }
- }
- }
復制代碼
|