单片机矩阵按键设计方法的实现
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,本篇内容主要讲解"单片机矩阵按键设计方法的实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"单片机矩阵按键设计方法的实现"吧!一、原理如果我们每个按键用两
千家信息网最后更新 2025年11月10日单片机矩阵按键设计方法的实现
本篇内容主要讲解"单片机矩阵按键设计方法的实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"单片机矩阵按键设计方法的实现"吧!
一、原理
如果我们每个按键用两个位表示,那么一组端口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安全错误
数据库的锁怎样保障安全
没人管理的服务器
2018配资软件开发
计算网络技术属于工程类么
安卓系统软件开发工具
长图关于网络安全生产
怎样导出空数据库
腾讯大数据库收藏文件保持多久
关于计算机网络安全是指什么
北大医信his数据库广东
重庆合川生鲜类的软件开发
ibm服务器故障灯亮硬盘故障
测试系统软件开发工具
钛马车联网上海网络技术
联系人数据库怎么恢复软件
php是 用的什么软件开发
超市销售管理系统数据库设计总结
网络安全知识网上有奖竞答案
网络安全实施计划工作方案
嘉定区品质数据库服务商销售
视频设备 网络安全认证
软件开发方法和
通信公司网络安全工
正规网络技术服务收费
服务器突然无法关机
软件上传服务器
2021网络安全宣传周测验答案
自动网络安全密钥
合作获取数据库中的最大值
博雅数据库江苏大学
盈达网络技术老余直播