单片机矩阵按键设计方法的实现
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,本篇内容主要讲解"单片机矩阵按键设计方法的实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"单片机矩阵按键设计方法的实现"吧!一、原理如果我们每个按键用两
千家信息网最后更新 2025年01月18日单片机矩阵按键设计方法的实现
本篇内容主要讲解"单片机矩阵按键设计方法的实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"单片机矩阵按键设计方法的实现"吧!
一、原理
如果我们每个按键用两个位表示,那么一组端口8只引脚则可以实现C82=16个按键的输入。按键4×4布置,按键的键位表示为行和列的交点,同样可以准确的表示按键输入。
二、设计步骤
1. 设计电路。
按键布置为4行×4列。P1.0、P1.1、P1.2、P1.3分别连接第1、2、3、4行按键,P1.4、P1.5、P1.6、P1.7分别连接第4、3、2、1列按键。
当某一按键被按下时,对应的行和列对应的引脚被接通而发生变化。由于每一个按键对应了唯一的行列,因此可以精确确定按键的位置。
2. 程序设计的思路。
逐行输出低电平,其它引脚输出高电平。对于输出低电平每一行,如果某一列有按键被按下,则对应的引脚会被下拉为低电平。检测低电平所在的位置,即可得到按键所在列。行和列都确定的情况下,即得到按键的所处位置。
本设计中,程序功能设计为当按下某一按键时,动态数码管上显示按键所在行列。
3. 行和列的按键编码
(1)扫描检测行时P1输出的编码
正在检测的行 | P1输出 | |||||
P1.3 | P1.2 | P1.1 | P1.0 | 二进制编码 | 十六进制编码 | |
1 | 1 | 1 | 1 | 0 | 11111110 | 0xFE |
2 | 1 | 1 | 0 | 1 | 11111101 | 0xFD |
3 | 1 | 0 | 1 | 1 | 11111011 | 0xFB |
4 | 0 | 1 | 1 | 1 | 11110111 | 0xF7 |
(2)检测时编码所对应的列
P1输入 | 被按下按键对应的列 | |||||
P1.7 | P1.6 | P1.5 | P1.4 | 二进制编码 | 十六进制编码* | |
1 | 1 | 1 | 0 | 1110 | 0xEX | 4 |
1 | 1 | 0 | 1 | 1101 | 0xDX | 3 |
1 | 0 | 1 | 1 | 1011 | 0xBX | 2 |
0 | 1 | 1 | 1 | 0111 | 0x7X | 1 |
*X表示因所在行不同,数值有所变化。 |
4. 程序设计
(1)列数的检测
/** * @brief 获取按键所在列 * * @return 返回1-4或F。F表示无按键。 */UCHAR getColumn(){ UCHAR tmp = P1; tmp = tmp >> 4; // 请结合P1输入表思考:这是什么操作? switch (tmp) { case 0xF /* 0b1111 */: return 0xf; case 0xE /* 0b1110 */: return 4; case 0xD /* 0b1101 */: return 3; case 0xB /* 0b1011 */: return 2; case 0x7 /* 0b0111 */: return 1; }}
(2)行数和按键的检测
/** * @brief 扫描输入的按键并将序号显示在数码管上。 * */void inputKeyScan(){ UCHAR row = 0x10, column = 0x10; UCHAR i; const UCHAR rows[] = {0xFE, 0xFD, 0xFB, 0xF7}; delayNms (20); // 消除抖动 for (i = 0; i < 4; i++) { P1 = rows[i]; if (getColumn() != 0xf) { row = 0x10, column = 0x10; row = i + 1; column = getColumn(); display4N(0x10, 0x10, row, column); } } display4N(0x10, 0x10, 0x10, 0x10); // 请思考这是为什么?}
(3)主函数调用
/** * @brief 主函数 * */void main(){ P1 = 0xFF; while (1) { inputKeyScan(); }}
三、用到的其它函数
分别在4个数码管上显示数字的函数
/** * @brief 分别在4根数码管上显示数字。每个数字的范围都是0-F。 * * @param n1 第一个数码管上显示的数字。 * @param n2 第二个数码管上显示的数字。 * @param n3 第三个数码管上显示的数字。 * @param n4 第四个数码管上显示的数字。 */void display4N(UCHAR n1, UCHAR n2, UCHAR n3, UCHAR n4){ P2 = 0x01; // 选择第一个数码管 if (n1 >= 0 && n1 < 0x10) P0 = HexBCD[n1]; // 显示n1 else P0 = 0xFF; delayNms(5); P2 = 0x02; // 选择第二个数码管 if (n2 >= 0 && n2 < 0x10) P0 = HexBCD[n2]; // 显示n2 else P0 = 0xFF; delayNms(5); P2 = 0x04; // 选择第三个数码管 if (n3 >= 0 && n3 < 0x10) P0 = HexBCD[n3]; // 显示n3 else P0 = 0xFF; delayNms(5); P2 = 0x08; // 选择第四个数码管 if (n4 >= 0 && n4 < 0x10) P0 = HexBCD[n4]; // 显示n4 else P0 = 0xFF; delayNms(5);}
到此,相信大家对"单片机矩阵按键设计方法的实现"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
按键
设计
数码
数码管
数字
编码
检测
所在
电平
输入
输出
方法
函数
单片机
矩阵
位置
程序
二进制
内容
十六进制
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
华为云支持数据库
hp服务器书
excel导入到数据库
大数据网络安全应用
云管家服务器备份文件
数据库的几种连接方式和解释
北京计算机网络技术培训
网络架构和网络技术原理
异度之刃世界树数据库
测控软件开发工具
高性能网络技术工资
唐人街探案软件开发
游戏直播app软件开发
删除了数据库还极可能恢复吗
华为重庆云平台大数据服务器
怪蛙兽数据库
数据库转换为网址
土木软件开发 招聘
网络安全态势值
思达数据库修复软件
pubg游客怎么选择服务器
山东省存储服务器哪家好
常州软件开发技术
服务器生存流程
sql数据库密码怎么改
电脑拨打电话软件开发
快快网络安全海报
数据库怎么连接两个查询
等保软件开发方面的法律
云台服务器可以用来做什么