给你写一个示例程序,你按实际需要修改。
- #include <reg51.H>
- #define PD 0x80|(P1<<3&0x60)|(P2>>1&0x18)|(P3&0x07)//P1.2~3/P2.4~5/P3.0~2组合7个按键为1个字节数据
- unsigned char code table[]={//共阳数码管段码"0~f-."
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- unsigned char KeySec=0;//键值变量
- //延时程序
- void delayms(unsigned int k)
- {
- unsigned int i,j;
- for(i=k;i>0;i--)
- for(j=110;j>0;j--);
- }
- //按键扫描
- void keyscan()
- {
- static unsigned int count=0;//计数变量
- static bit key_sign=0; //按键状态标志
- unsigned char time; //临时变量
- if((PD&0xff)!= 0xff)//有按键按下
- {
- count++; //计数变量自加1
- if(count>500)
- count=501;//防止溢出
- if(count>10 && key_sign==0)//10ms消抖与按键状态识别
- {//使用组合键要适当延长消抖时间
- key_sign=1;//确认按键按下
- time=PD&0xff;//保存键态值
- }
- if(count==500)//判断按下0.5s长按有效
- {
- switch(time)
- {
- //单键
- case 0xfe: KeySec=8; break;
- case 0xfd: KeySec=9; break;
- case 0xfb: KeySec=10; break;
- case 0xf7: KeySec=11; break;
- case 0xef: KeySec=12; break;
- case 0xdf: KeySec=13; break;
- case 0xbf: KeySec=14; break;
- // 组合键
- // case 0xee: KeySec=?; break;
- }
- }
- }
- else //没有按或按下后松手
- {
- if(key_sign==1)//判断是按键按下后松手
- {
- key_sign=0; //按键状态标志清0
- if(count>10 && count<500)//小于0.5s判断为短按
- {
- switch(time)
- {
- //单键
- case 0xfe: KeySec=1; break;
- case 0xfd: KeySec=2; break;
- case 0xfb: KeySec=3; break;
- case 0xf7: KeySec=4; break;
- case 0xef: KeySec=5; break;
- case 0xdf: KeySec=6; break;
- case 0xbf: KeySec=7; break;
- // 组合键
- // case 0xee: KeySec=?; break;
- }
- }
- }
- count=0;//计数变量清0
- }
- }
- //主函数
- void main()
- {
- P0=table[KeySec];//初始显示状态0
- while(1)
- {
- keyscan(); //按键扫描
- if(KeySec!=0)//刷新显示
- {
- P0=table[KeySec];//显示键值
- KeySec=0;//键值清0
- }
- delayms(1);//控制主循环周期1ms
- }
- }
复制代码
|