摁键扫描是很基础的知识点,摁键扫描通俗的来说就是在串口输出高低电平,然后当有摁键摁下时便会引起电平的变化,我们只需将变化的电平进行记录和组合便可以知晓具体是那一格摁键摁下。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.H>
- #define u8 unsigned char
- #define KEY P3 //定义变量,方便以后键盘接到其他的端口后,修改这里就行了,下面的程序不用再修改
- u8 num1,i,num2;
- u8 code keycode[16]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
- void delay(long i){while(i--);}
-
- void main(void)
- {
- KEY=0x0f;//初始状态,高位列,低电平;低位行,高电平
- while(1)
- {
- if(KEY!=0x0f)//如果有按键按下,则KEY肯定不是原来的0x0f
- {
- delay(2000);//延时20毫秒,以防按键的弹簧上下振荡,造成按下的假象
- if(KEY!=0x0f)num1=KEY;//的确是按下了,获取此时状态,高位均为0,低位有1位不是1
- KEY=0xf0;//KEY输出0xf0
- delay(2000);//延时20毫秒,以防按键的弹簧上下振荡,造成按下的假象
- if(KEY!=0xf0)num2=KEY;
- //for循环keycode数组检测 break
- for(i=0;;i++)
- {
- if((num1|num2)==keycode[i]) break;
- }
- KEY=0x0f;//KEY输出0x0f,恢复初始状态
- while(KEY!=0x0f);//如果还在按下,等待放手
- P2=i;//P2口输出给BCD数码管
- }
- }
- }
复制代码
仿真代码资料51hei提供下载(用winrar解压):
矩阵键盘程序.rar
(66.73 KB, 下载次数: 60)
|