学习使用的开发板:STC89C52RC/LE52RC
编程软件:Keil5
烧录软件:stc-isp
开发板实图:
文章目录
矩阵键盘
矩阵键盘位于开发板的右下角
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
采用
逐行或逐列
的"扫描",就可以读出任何位置按键的状态
原理图
独立按键原理图如下:
4个按键使用了4个I/O口
,如果矩阵按键也使用这种接线,则需要16个I/O口
为了节省接线,矩阵按键采用行列排列,使用8个接线就可以控制16个按键
- 通过P17控制 S1 ~ S4一端,P16控制 S5 ~ S8一端,以此类推
- 一个按键按下,那个两端都会有信号,如
S1按下,那么P17和P13都为0
如此就可以通过扫描检测按键是否按下
矩阵键盘扫描(输入扫描) 原理:
读取第1行(列)→读取第2行(列) →读取第3行(列) →......
然后快速循环这个过程,最终实现所有按键同时检测的效果
此处采用固定列,扫描行的方式,检测按键按下,代码如下:
c
//brief:方法描述 parm:参数说明 retval:返回值
/**
* @brief 检测哪个按键被按下
* @parm 无
* @retval 被按下的按键的编号 范围: 1 ~ 16
*/
unsigned char matrixKey()
{
unsigned char keyNumber = 0;
//先重置
P1 = 0xFF;
//第一列
P1_3 = 0;
if(P1_7 == 0){Delay(20);while(P1_7 == 0);Delay(20);keyNumber = 1;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);Delay(20);keyNumber = 5;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);Delay(20);keyNumber = 9;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);Delay(20);keyNumber = 13;}
//第二列
P1 = 0xFF;
P1_2 = 0;
if(P1_7 == 0){Delay(20);while(P1_7 == 0);Delay(20);keyNumber = 2;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);Delay(20);keyNumber = 6;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);Delay(20);keyNumber = 10;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);Delay(20);keyNumber = 14;}
//第三列
P1 = 0xFF;
P1_1 = 0;
if(P1_7 == 0){Delay(20);while(P1_7 == 0);Delay(20);keyNumber = 3;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);Delay(20);keyNumber = 7;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);Delay(20);keyNumber = 11;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);Delay(20);keyNumber = 15;}
//第四列
P1 = 0xFF;
P1_0 = 0;
if(P1_7 == 0){Delay(20);while(P1_7 == 0);Delay(20);keyNumber = 4;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);Delay(20);keyNumber = 8;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);Delay(20);keyNumber = 12;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);Delay(20);keyNumber = 16;}
return keyNumber;
}
基本操作同独立按键
,可参看【51单片机】独立按键
以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。