【51单片机入门】矩阵键盘

文章目录

  • 前言
  • 矩阵键盘介绍与检测原理
  • 原理图
  • 代码讲解
  • 总结


前言

在嵌入式系统设计中,键盘输入是一种常见的人机交互方式。其中,矩阵键盘因其简单、方便和易于扩展的特性,被广泛应用于各种设备中。本文将介绍如何使用51单片机来实现矩阵键盘的设计,包括硬件连接、键盘扫描算法以及按键处理等内容。希望通过本文的学习,读者能够掌握矩阵键盘的基本原理和设计方法,为自己的项目提供强大的输入功能。


矩阵键盘介绍与检测原理

矩阵键盘是一种常见的输入设备,它由多个按键组成,通常是以矩阵的形式排列。每个按键都有一个唯一的行和列位置,通过检测行和列的电平变化来确定按下的是哪个按键。

在嵌入式系统设计中,矩阵键盘是一种常见的人机交互方式。矩阵键盘的本质是使用8个IO口来进行16个按键的控制读取,可以减小IO口的使用。它用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。

其工作原理是:先从P1口的高四位(四个行)输出高电平,低四位(四个列)输出低电平,假设有按键按下,从P1口的高四位读取键盘状态。判断高四位的四行哪一行变成了低电平,就知道是第几行,再从P1口的低四位(四个列)输出高电平,高四位(四个行)输出低电平,从P1口的低四位读取键盘状态。判断低四位的四列哪一行变成了低电平,就知道是第几列,将两次读取结果组合起来就可以得到当前按键的特征编码。

矩阵键盘通常用于嵌入式系统中,例如家用电器、手机、计算器等设备。希望这个介绍能帮助你更好地理解矩阵键盘的工作原理和应用。

比如下面的这个也是矩阵键盘:
在这里插入图片描述

原理图

矩阵键盘的元件名称:KEY-PAD-PHONE
在这里插入图片描述

在这里插入图片描述

代码讲解

总体代码如下所示:

#include <REGX51.H>// ????????
#define KEYPAD_ROW P1
#define KEYPAD_COL P3void delay(unsigned int ms) {unsigned int i, j;for(i = ms; i > 0; i--)for(j = 120; j > 0; j--);
}// ??????
char keys[4][3] = {{'1', '2', '3'},{'4', '5', '6'},{'7', '8', '9'},{'*', '0', '#'}
};// ????
char scan_keypad(void);void main() {char key;while(1) {key = scan_keypad();  // ????????if(key != 0xFF) {     // ????????// ?????????????????// ??:?????????LCD??}}
}char scan_keypad(void) {int row, col;KEYPAD_COL = 0xFF;for(row = 0; row < 4; row++) {KEYPAD_ROW = ~(1 << row);for(col = 0; col < 3; col++) {if(!(KEYPAD_COL & (1 << col))) {while(!(KEYPAD_COL & (1 << (col))));return keys[row][col];}}}return 0xFF;
}

这段代码的实现基于矩阵键盘的工作原理。矩阵键盘是由行和列组成的,每个按键位于特定的行和列的交叉点。当某个按键被按下时,对应的行和列就会被连接起来。

在这段代码中,我们首先将所有的行设置为输出,并将所有的列设置为输入。然后,我们逐行扫描键盘:将当前行设置为低电平,其他行保持高电平。然后读取所有的列,如果某一列的电平为低,那么就说明当前行的这一列的按键被按下。

这样,我们就可以通过行号和列号确定哪个按键被按下。在代码中,我们使用一个二维数组keys来存储每个按键的值,通过行号和列号就可以从数组中取出对应的按键值。

核心代码:

char scan_keypad(void) {int row, col;KEYPAD_COL = 0xFF;for(row = 0; row < 4; row++) {KEYPAD_ROW = ~(1 << row);for(col = 0; col < 3; col++) {if(!(KEYPAD_COL & (1 << col))) {while(!(KEYPAD_COL & (1 << (col))));return keys[row][col];}}}return 0xFF;
}

这段代码的主要目标是扫描矩阵键盘并返回被按下的键。下面是这段代码的二进制解释:

  1. KEYPAD_COL = 0xFF;:这行代码将所有列设置为输入。在二进制中,0xFF表示1111 1111,这意味着所有的列线都被设置为高电平。

  2. KEYPAD_ROW = ~(1 << row);:这行代码将当前行设置为低电平,其他行保持高电平。1 << row将1向左移动row位,然后~操作符取反。例如,如果row为2,那么1 << row就是0000 0100,取反后就变成1111 1011,这就将第2行设置为低电平,其他行保持高电平。

  3. !(KEYPAD_COL & (1 << col))这段代码我们通过下面二进制解释:

===没有按下
col = 0
1 << col =>0000,0001
1111,1111
0000,0001
&
0000,0001
!
1111,1110===按下
col = 0
1 << col =>0000,0001
1111,1110
0000,0000
&
0000,0000
!
1111,1111
  1. return keys[row][col];:这行代码返回被按下的键的值。keys是一个二维数组,存储了每个按键的值,通过行号和列号就可以从数组中取出对应的按键值。

  2. return 0xFF;:如果没有按键被按下,那么函数就返回0xFF。在二进制中,0xFF表示1111 1111


总结

通过本文的学习,我们了解了矩阵键盘的工作原理,学习了如何使用51单片机实现矩阵键盘的硬件连接和软件设计。我们还探讨了一些常见的问题,如按键抖动和多键按下的处理。希望这些知识能够帮助你在实际的项目中更好地使用矩阵键盘。记住,理论知识的学习是重要的,但实践才能使理论知识得以应用。因此,我鼓励你动手实践,尝试设计和制作自己的矩阵键盘,通过实践来提高自己的技能和理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/369132.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相机光学(二十四)——CRA角度

CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系&#xff08;一&#xff09;   2.芯片CRA角度与镜头选型的匹配关…

【MySQL系列】隐式转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于Java的壁纸网站设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

【linux高级IO(一)】理解五种IO模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 重谈对…

Redis基础教程(六):redis 哈希(Hash)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

Windows 安装hadoop 3.4

目录 安装 下载 设置环境变量 配置 修改&#xff1a;hadoop-env.cmd 修改&#xff1a;core-sit.xml 修改&#xff1a;hdfs-site.xml 修改&#xff1a;mapred-site.xml 修改&#xff1a;yarn-site.xml 运行 格式化HDFS文件系统 启动&#xff1a;hadoop 启动&#xf…

CTF常用sql注入(二)报错注入(普通以及双查询)

0x05 报错注入 适用于页面无正常回显&#xff0c;但是有报错&#xff0c;那么就可以使用报错注入 基础函数 floor() 向下取整函数 返回小于或等于传入参数的最大整数。换句话说&#xff0c;它将数字向下取整到最接近的整数值。 示例&#xff1a; floor(3.7) 返回 3 floor(-2…

统计信号处理基础 习题解答11-12

题目 证明 的MAP估计量为 其中是一个的矢量, 是一个可逆的p*p的矩阵。也就是说&#xff0c;MAP估计量对可逆的线性变换是可以变换的。 解答 已知的联合概率密度 且&#xff1a; 现在知道&#xff1a; 那么为了获得变换后的MAP&#xff0c;首先需要根据求出 根据概率密度变换…

Linux系统部署MongoDB开源文档型数据库并实现无公网IP远程访问

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&am…

Springboot与xxl-job

一、下载xxl-job项目 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 从GitHub上面将项目clone下来&#xff0c;如果网络问题导致速度慢也可以从Gitee上面拉…

企业搭建知识库:解锁无限潜力的钥匙

在当今这个信息爆炸的时代&#xff0c;企业如何高效地管理、传播与利用知识&#xff0c;已成为衡量其竞争力的重要标尺。知识库&#xff0c;作为这一背景下的产物&#xff0c;正逐步成为企业不可或缺的数字资产。它不仅是一个自助式的数字门户&#xff0c;更是连接员工、客户与…

stm32定时器与pwm波

文章目录 4 TIM4.1 SysTick系统定时器4.2 TIM定时器中断与微秒级延时4.3 TIM使用PWM波4.3.1 PWM介绍4.3.2 无源蜂鸣器实现 4.4 TIM ,PWM常用函数 4 TIM 4.1 SysTick系统定时器 ​ Systick系统滴答&#xff0c;&#xff08;同时他有属于自己的中断&#xff0c;可以利用它来做看…

RT-Thread Studio与CubeMX联合编程之rtthread stm32h743的使用(十一)spi设备SFUD驱动的使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.建立新工程&#xff0c;选择相应的芯片型号及debug引脚及调试器 2.编译下载&#xff0c;可以看到串口打印正常 3.…

Solo 开发者周刊 (第12期):连接独立开发者,共享开源智慧

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿&#xff0c;每周五发布。在这期周刊中&#xff0c;我们将深入探讨开源软件产品的开发旅程&#xff0c;分享来自一线独立开发者的经验和见解。本杂志开源&#xff0c;欢迎投稿。 产品推荐 1、Soju————一个现代的书签…

完全理解C语言函数

文章目录 1.函数是什么2.C语言中的函数分类2.1 库函数2.1.1 如何使用库函数 2.2自定义函数 3.函数的参数3.1 实际参数&#xff08;实参&#xff09;3.2 形式参数&#xff08;形参&#xff09; 4.函数调用4.1传值调用4.2 传址调用4.3 练习 5.函数的嵌套调用和链式访问5.1 嵌套调…

Django + Vue 实现图片上传功能的全流程配置与详细操作指南

文章目录 前言图片上传步骤1. urls 配置2. settings 配置3. models 配置4. 安装Pillow 前言 在现代Web应用中&#xff0c;图片上传是一个常见且重要的功能。Django作为强大的Python Web框架&#xff0c;结合Vue.js这样的现代前端框架&#xff0c;能够高效地实现这一功能。本文将…

DolphinDB 蝉联 Gartner 中国实时数据管理代表厂商

报&#xff01;DolphinDB 又上榜啦&#xff01;&#xff01;&#xff01; 上月&#xff0c;全球知名信息技术研究公司 Gartner 发布了 Hype Cycle for Data, Analytics and AI in China, 2024 报告&#xff0c;以技术成熟度曲线&#xff08;Hype Cycle&#xff09;和优先级矩阵…

JVM的五大内存区域

JVM的五大内存区域 JVM内存区域最粗略的划分可以分为 堆 和 栈 &#xff0c;当然&#xff0c;按照虚拟机规范&#xff0c;可以划分为以下几个区域&#xff1a; JVM内存分为线程独享区和线程共享区&#xff0c; 其中 方法区 和 堆 是线程共享区&#xff0c; 虚拟机栈, 本地方法…

HTMLCSS(入门)

HTML <html> <head><title>第一个页面</title></head><body>键盘敲烂&#xff0c;工资过万</body> </html> <!DOCTYPE>文档类型声明&#xff0c;告诉浏览器使用哪种HTML版本显示网页 <!DOCTYPE html>当前页面采取…

云桌面运维工程师

一 深信服驻场工程师 1 深信服AC、AF、AD、NGAF、WOC Atrust、WAF项目实施经验者优先考虑。 负责云桌面POC测试 部署和配置&#xff1a;设置云桌面基础设施&#xff0c;包括虚拟化平台、云桌面管理软件和相关组件。确保正确配置网络、存储和安全设置。 用户体验&#xff1…