- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit digital_1=P2^0;
- sbit digital_2=P2^1;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar KeyValue=0; //鍵值變量
- bit sign_1=0,sign_2=0; //位變量
- uint count_1=0,count_2=0; //計數變量
- void keyscan() //按鍵掃描程序
- {
- P3=0xf0; //賦值P3 1111 0000
- if(P3!=0xf0) //檢測有按鍵按下
- {
- if((++count_1>=250)&&(sign_1==0))//消抖計數100~1000,判斷按鍵自鎖
- {
- sign_1=1; //按鍵自鎖標志置1
- switch(P3)
- {
- case(0Xe0):KeyValue=0;break;
- case(0Xd0):KeyValue=1;break;
- case(0Xb0):KeyValue=2;break;
- case(0X70):KeyValue=3;break;
- }
- P3=0x0f; //賦值P3 0000 1111
- switch(P3)
- {
- case(0X0e):KeyValue+= 1;break;
- case(0X0d):KeyValue+= 5;break;
- case(0X0b):KeyValue+= 9;break;
- case(0X07):KeyValue+=13;break;
- }
- }
- }
- else //鍵抬起
- {
- sign_1=0; //按鍵自鎖標志清0
- count_1=0; //消抖計數清0
- }
- }
- void display() //數碼管顯示程序
- {
- if(++count_2>=100) //延時計數
- {
- count_2=0;
- P0=0x00; //消隱
- if(sign_2==0)
- {
- P0=table[KeyValue/10];//顯示十位段碼
- digital_1=0;
- digital_2=1;
- sign_2=1;
- }
- else
- {
- P0=table[KeyValue%10];//顯示個位段碼
- digital_1=1;
- digital_2=0;
- sign_2=0;
- }
- }
- }
- void main() //主函數
- {
- while(1)
- {
- keyscan(); //按鍵掃描程序
- display(); //數碼管顯示鍵值1~16
- }
- }
復制代碼
|