- #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
- }
- }
复制代码
|