- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={//0~FLP
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xc7,0x8c};
- void Delay_ms(uint t)
- {
- uint i,j;
- for(i=t;i>0;i--)
- for(j=120;j>0;j--);
- }
- uchar keyscan() //按鍵掃描程序
- {
- static uint count=0;
- static bit sign=0;
- uchar KeyValue=0;
- P3=0xf0; //賦值P3 1111 0000
- if(P3!=0xf0) //檢測有按鍵按下
- {
- if(++count>10 && !sign)//消抖計數10,判斷按鍵自鎖
- {
- sign=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=KeyValue+1;break;
- case(0X0d):KeyValue=KeyValue+5;break;
- case(0X0b):KeyValue=KeyValue+9;break;
- case(0X07):KeyValue=KeyValue+13;break;
- }
- return KeyValue;
- }
- }
- else //鍵抬起
- {
- sign=0; //按鍵自鎖標志清0
- count=0; //消抖計數清0
- return 0;
- }
- }
- void display(uchar i) //數碼管顯示程序
- {
- static uchar a=0,t=0;
- if(i>0)a=i;
- P0=0xff; //消隱
- P2&=0xf0; //位清0
- P2|=0x01<<t; //賦位碼
- switch(t) //賦段碼
- {
- case 0:P0=table[16];break;//L
- case 1:P0=table[a/10];break;
- case 2:P0=table[a%10];break;
- case 3:P0=table[17];break;//P
- }
- t=++t%4;//循環計數
- }
- void main() //主函數
- {
- while(1)
- {
- display(keyscan());//數碼管顯示鍵值1~16
- Delay_ms(1); //控制循環周期約1ms
- }
- }
復制代碼
|