给你写一个3*3矩阵键盘不占用剩余IO口演示程序,有详细注释。顺序取了P3.0~3.5,按此规律可以取任意一组的任意6个IO口。
- #include <reg52.h>
- #define uint unsigned int //宏定义无符号整型数据
- #define uchar unsigned char //宏定义无符号字符型数据
- uchar key=0; //定义键值全局变量
- void keyscan() //按键扫描程序
- {
- static bit sign=0; //按键自锁标志
- static uint count=0; //消抖计数变量
- uchar temp1=0,temp2=0,temp3;//临时变量
- P3|=0x3f; //赋值P3,保留高2位不变,操作低6位 xx11 1111 x为0或1
- P3&=0xf8; //赋值P3,保留高2位不变,操作低6位 xx11 1000 x为0或1
- temp1=P3&0x38; //保存P3低6位状态到temp1
- if(temp1!=0x38) //检测有按键按下
- {
- count++; //消抖计数
- if((count>=250)&&(sign==0))//count100~1000,根据主循环周期调整约10~20ms
- {
- sign=1; //按键自锁标志置1
- P3|=0x3f; //赋值P3,保留高2位不变,操作低6位 xx11 1111 x为0或1
- P3&=0xc7; //赋值P3,保留高2位不变,操作低6位 xx00 0111 x为0或1
- temp2=P3&0x07; //保存P3低6位状态到temp2
- temp3=temp2|temp1; //保存temp2和temp1相或值
- switch(temp3)
- {
- case 0x36: key=1; break;
- case 0x35: key=2; break;
- case 0x33: key=3; break;
- case 0x2e: key=4; break;
- case 0x2d: key=5; break;
- case 0x2b: key=6; break;
- case 0x1e: key=7; break;
- case 0x1d: key=8; break;
- case 0x1b: key=9; break;
- }
- }
- }
- else //键抬起
- {
- sign=0; //按键有效标志清0
- count=0; //消抖计数清0
- }
- }
- void main() //主函数
- {
- while(1)
- {
- keyscan(); //按键扫描程序
- P1=key; //P1显示(2进制)
- }
- }
复制代码
|