学习使用的开发板: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行(列) →……
然后快速循环这个过程,最终实现所有按键同时检测的效果
此处采用固定列,扫描行的方式,检测按键按下,代码如下:
//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;
}
以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。