給你寫了一個按鍵短按加減,長按連加減 4位數碼管顯示0~9999程序,端口根據實際電路自行修改。
無標題.jpg (147.15 KB, 下載次數: 34)
下載附件
2019-11-14 21:37 上傳
- //按鍵短按加減,長按連加減 4位數碼管顯示0~9999
- #include <REG51.H>
- #define uint unsigned int //宏定義數據類型uint
- #define uchar unsigned char //宏定義數據類型uchar
- #define key_S 10 //宏定義短按20ms
- #define key_L 500 //宏定義長按1000ms
- #define key_M 400 //宏定義長按間隔200ms
- sbit key1=P1^6; //加鍵
- sbit key2=P1^7; //減鍵
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uchar code wela[]={0xfe,0xfd,0xfb,0xf7};
- uint num=0;
- void Timer0Init() //2毫秒@12.000MHz
- {
- TMOD= 0x01; //設置定時器模式
- TL0 = 0x30; //設置定時初值
- TH0 = 0xF8; //設置定時初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- EA = 1; //開總中斷
- ET0 = 1; //開定時器0中斷
- }
- void keyscan() //按鍵掃描
- {
- static uint count1=0,count2=0;//計數變量
- if(!key1)
- {
- count1++;
- if(count1>=key_L) //長按
- {
- if(num<9999)
- num++;
- count1=key_M;
- }
- }
- else //按鍵抬起
- {
- if(count1>key_S && count1<key_L)//短按
- {
- if(num<9999)
- num++;
- }
- count1=0; //count清0
- }
- if(!key2)
- {
- count2++;
- if(count2>=key_L) //長按
- {
- if(num>0)
- num--;
- count2=key_M;
- }
- }
- else //按鍵抬起
- {
- if(count2>key_S && count2<key_L)//短按
- {
- if(num>0)
- num--;
- }
- count2=0; //count清0
- }
- }
- void display()//顯示程序
- {
- static uchar i=0;
- P2=0x00;
- P3=wela[i];
- switch(i)
- {
- case 0: P2=table[num/1000%10]; break;
- case 1: P2=table[num/100%10]; break;
- case 2: P2=table[num/10%10]; break;
- case 3: P2=table[num%10]; break;
- }
- i++;
- i%=4;
- }
- void main()
- {
- Timer0Init();
- while(1);
- }
- void timer0() interrupt 1
- {
- TL0 = 0x30;
- TH0 = 0xF8;
- keyscan();
- display();
- }
復制代碼
|