4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键

6e4d6a775f109ab56767a48ea62c63e4.png

按键是一种常开型按钮开关,与单片机的常见接法如图所示。按键未按下时两个触点断开,单片机I/O口输入高电平;当按键闭合时,I/O口输入低电平。

一、按键讲解

当I/O口为P0口时,由于没有内部上拉电阻,所以必须外接上拉电阻,当I/O口为P1、P2和P3口时,由于内部已有上拉电阻,因此可省略外接的上拉电阻。

f7fb3c272c25554abfca9f81d90f9fa9.png

二、按键消抖

单片机系统中所使用的键盘都是机械式的弹性按键,因为存在机械触点的弹性作用,在按键闭合和弹起的瞬间都会出现抖动,如图所示。按键抖动一般会持续5~10ms,为使一次按键仅被处理一次,必须消除按键抖动。消除按键抖动可以采用软件消抖或硬件消抖。

47a7e8cbdfd2a8c7f523c856d6b2a9af.png

软件消抖指在检测到有按键闭合时,延时一小段时间之后再次检测,如果仍然检测到按键闭合,则认为按键真正闭合。

硬件消抖方法

1.R-S触发器

一旦有键按下,触发器立即反转,触点的抖动便不会再对输出产生影响,按键释放时也一样。

bb3fdd207b2b5051c40fcd0211b8ea8d.png

2.电容滤波

将电容并联在按键的两端,利用电容放电的延时特性,将产生抖动的电平通过电容吸收掉,从而达到消抖的作用;

5439552e76e0b536f77af7b52aa5cbf2.png

三、独立按键

独立键盘指每个按键都占据一个独立的引脚。

9fb31eb21b43a1d37ebf191afd4b9e96.png

四、矩阵按键

同一行上的所有按键都连接到一个引脚,同一列上的所有按键都连接到一个引脚。

3443a7fb84db777bce4949c57b42b366.png

(1)列扫描方式

所有行线都输出高电平,列线依次输出低电平;查询该列上行的值,若为0,则说明该行上的按键被按下;若该列上所有行的值都为1,则进行下一列行值的查询;循环往复。

3443a7fb84db777bce4949c57b42b366.png

(2)反转法

所有行线都输出0,查询列线上的值,若某列线上的值为0,则说明该列线上的按键被按下;然后所有列线都输出0,查询行线上的值,若某行线上的值为0,则说明该行线上的按键被按下;从而确定某行某列的按键被按下。

e4d535c721c42e34f7c95259fda448fb.png

五、程序举例

92ef8b64f1ee2334fd20d0f14e02bbb0.gif

#include #define uint unsigned int#define uchar unsigned charuint key,key_num;//键盘扫描值,键盘键值/********************************************************************///函数名:delay_1ms(uint x)//功能:利用定时器0精确定时1ms;自加 time_t的值为后面时间调整函数服务//调用函数://输入参数:x,1ms计数//输出参数://说明:延时的时间为1ms乘以x/********************************************************************/void delay_1ms(uint x){  TMOD=0X01;//开定时器0,工作方式为1  TR0=1;//启动定时器0;  while(x--)  {    TH0=0Xfc;//定时1ms初值的高8位装入TH0    TL0=0X18;//定时1ms初值的低8位装入TL0    while(!TF0);//等待,直到TF0为1    TF0=0;  }      TR0=0;//停止定时器0;} /**********************************************************///函数名:keyscan()//功能:得出4x4键盘的行列扫描值//调用函数:delay_1ms(uint x)//输入参数://输出参数://说明:通过P1口的扫描得出扫描值key,无键按下key为16/**********************************************************/uchar keyscan(){   uchar code_h;    //行扫描值  uchar code_l;    //列扫描值  P1=0XF0;       //P1.0-P1.3全为0,(行状态全为低电平)  if((P1&0xF0)!=0XF0)  //如果P1.4-P1.7不全为1,可能有键按下(为准确识别按键动作)  {      delay_1ms(5);  //廷时去抖动,为准确识别按键动作      if((P1&0xF0)!=0XF0)//重读高4位(列状态),若还是不全为1,定有键按下            {                code_h=0xfe;  //开始行扫描 (0xfe:11111110)          while((code_h&0x10)!=0x00)//判断是否扫描四行(X0~X3)完毕,若不是,继续扫描(0x10:00010000)                  {             P1=code_h;  //第1次P1.0置为0,其余高电平;第2次P1.1置为0,其余高电平  ;第3次P1.2置为0,其余高电平;第4次P1.3置为0,其余高电平             if((P1&0xF0)!=0XF0) //如果P1.4-P1.7不全为1,该行有键按下(0xF0:11110000)                   {               code_l=(P1&0xF0|0x0F);//保留P1口高4位,低4位变为1,作为列值               return((~code_h)+(~code_l));//键盘编码=行扫描值+列扫描值 (取反后用,相当于改为按下按键对应的行、列标识为1,其它为0)                      }             else                           //左移后补0,但是我们需要将其他位置1,所以+1               code_h=(code_h<<1)|0x01;  //若该行无键按下,行扫描值左移+1,扫描下一行            }       }   }  return(16);   //无键按下,返回16  } /**********************************************************///函数名:keynum()//功能:得出4x4按键的键值//调用函数:keyscan()//输入参数://输出参数://说明:通过key的值确定按键键值/**********************************************************/void keynum(){    uchar i,j;    uchar code tab[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};     //4x4键盘各键值标注    key=16;    key = keyscan();//引入key值    if((key&0x01)!=0) i=0;  //判断出按下按键的行列号 (即找出低电平的行、列)    if((key&0x02)!=0) i=1;    if((key&0x04)!=0) i=2;    if((key&0x08)!=0) i=3;    if((key&0x10)!=0) j=0;    if((key&0x20)!=0) j=1;    if((key&0x40)!=0) j=2;    if((key&0x80)!=0) j=3;    if(key!=16)     {       key_num = tab[i][j];//通过比较得出4x4键盘的键值    }   } void main(){  uint shi,ge;  shi = 0;  ge = 0;  P2 = 0x16;//初始值 为16  while(1)  {     keynum(); //获取到键值     if(key!=16)     {        shi = key_num/10;//获得十位          ge = key_num%10;//获得个位       if(shi)       {         P2 = 0x10|ge;       }       else       {          P2 = ge;       }     }     delay_1ms(10);//延时  }}

往期回顾

01

|ESP8266模块详解

02

|DA转换器是什么?快来一起学习一下吧!

03

|STM32中断优先级详解

04

|STM32下载程序新思路--使用串口下载程序

d511fbe84a047391bc453b95b22caa64.png

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

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

相关文章

android给数组添加新元素_重磅!超详细的 JS 数组方法整理出来了

作者&#xff1a;Yushiahttps://juejin.cn/post/6907109642917117965数组是 js 中最常用到的数据集合&#xff0c;其内置的方法有很多&#xff0c;熟练掌握这些方法&#xff0c;可以有效的提高我们的工作效率&#xff0c;同时对我们的代码质量也是有很大影响。一、创建数组1.使…

小米登录协议分析_性能测试篇之Loadrunner与ida工具结合完成java vuser协议的脚本...

你这么优秀&#xff0c;一定只想把“柠檬班”置顶▲→性能3期优秀作业利用lr的java vuser协议完成(登录&#xff0c;md5加密完成重置支付密码&#xff0c;获取订单列表)请求&#xff0c;并加if判断完善脚本本文由柠檬班性能3期学员eleven根据作业原创出品。1工作准备jdk版本的选…

发动机压缩比怎么计算公式_2020沃德十佳发动机出炉:这三款机头,20万内就能买到...

引言 | 内燃机最后的巅峰&#xff1f;《Wards Auto World》每年都会发布沃德十佳发动机榜单&#xff0c;2020年度的榜单早在去年底已经出炉&#xff0c;但小编觉得仍有可讲之处。考虑到老美特殊的驾驶环境&#xff0c;地广人稀&#xff0c;基础设施齐全&#xff0c;人工费奇高&…

计算ln_钢筋工程算量培训-钢筋工程量计算公式

框架梁一首跨钢筋的计算1、上部贯通筋上部贯通筋&#xff08;上通长筋1&#xff09;长度&#xff1d;通跨净跨长&#xff0b;首尾端支座锚固值2、端支座负筋端支座负筋长度&#xff1a;第一排为Ln/3&#xff0b;端支座锚固值&#xff1b;第二排为Ln/4&#xff0b;端支座锚固值3…

智能照明控制系统电路图_咻享智能|学校教室智能照明控制系统怎么理解

教室是学校照明用电的主要部分。教室灯光照度设计标准为室内平均照度300 lx&#xff0c;这样高的照度要求&#xff0c;如果没有合理控制方案&#xff0c;能源上将造成巨大的浪费。因此将智能照明控制系统应用于普通教室、阶梯教室具有相当的实际意义。对于学校而言&#xff0c;…

redis关键字删除_微信公众号文章防删除

阅读本文大概需要 3.6 分钟。前段时间《一个出身寒门的状元之死》刷屏了&#xff0c;当我看完了这篇文章&#xff0c;很有感触&#xff0c;一开始我以为是事实&#xff0c;后来才发现完全是虚构&#xff0c;对于我来讲并不是非常在乎文章中的故事是否是真实的&#xff0c;我在乎…

java单链表节点翻转_Java数据结构01-链表基础(讲解+代码+面试题)

文章结构链表的概念/用处链表的基本代码实现&#xff08;韩顺平Java数据结构网课&#xff09;剑指offer上链表题目代码实现&#xff08;个人手敲&#xff0c;更精巧的答案可以参考官网&#xff09;链表链表包含单链表&#xff0c;双向链表&#xff0c;循环链表等等。相对于线性…

分解连续自然数的和_小学奥数各年级经典题解题技巧大全——分解因数法(2)...

*例7&#xff1a;在等式35( )8127718( )162的两个括号中&#xff0c;填上适当的最小的数。(适于六年级程度)解&#xff1a;将已知等式的两边分解质因数&#xff0c;得&#xff1a;5377( )22367( )把上面的等式化简&#xff0c;得&#xff1a;15( )4( )所以&a…

即席和即兴_即兴说话小课堂

即 兴 说 话 小 课 堂了解发音的小知识&#xff0c;运用语言技巧&#xff0c;通过音色、音强&#xff0c;来达到的一种发音。发音的能力&#xff0c;更重要的是提高自己的普通话水平&#xff0c;锻炼自己的综合能力。师兄的课堂是非常难得&#xff0c;大家一起来学习吧&a…

云片短信php接口_php与阿里云短信接口接入

使用阿里云短信API&#xff0c;需要在控制台获取以下必要参数&#xff0c;其中需要自己手机验证官方审核多次&#xff0c;尤其审核需要保持耐心。1. accessKeyId 相当于你的个人账户密钥&#xff1b;2. accessKeySecret 与上是成对的&#xff1b;3. SignName 个人签名&#xff…

读中文_校友分享预告 | 在港中文读物理是什么体验?理科就业转商科有何经验心得?...

留学分享会总第233期港新地区校友分享实录商科《19年入读港大金融师姐带来最新香港就读体验与求职经验》《在香港大学读金融是怎样一种体验&#xff1f;》《在香港大学读会计是怎样一种体验&#xff1f;》《在香港大学读商业分析是怎样一种体验&#xff1f;》《在新加坡国立大学…

命令逐行显示_在LoadRunner中执行命令行程序之:popen()取代system()

》》》推荐阅读《《《1、性能测试学习笔记-场景设计2、性能测试的重要意义3、性能分析流程及方法4、应用系统性能调优之性能分析在LoadRunner中执行命令行程序之&#xff1a;popen()取代system() 我想大家应该都知道在LoadRunner可以使用函数system()来调用系统指令&#xf…

的使用go_使用 Go 开发 Prometheus Exporter

Exporter 是 Prometheus 监控的核心&#xff0c;如果你遇到一些应用不存在相应的 Exporter&#xff0c;那么我们可以自己去编写 Exporter。下面我们简单介绍如何使用 Golang 来快速编写一个 Exporter。1. 安装 GO 和依赖包按照 https://golang.org/doc/install 上的步骤进行安装…

flask 获取前端form内容_flask 项目中使用 bootstrapFileInput(进阶篇)

bootstrap 为 flask 使用人员提供了一个非常优美且有效的前端页面组件,但是完美之处还存在些许缺陷,比如文件的上传功能.而 bootstrap-fileinput 是基于 bootstrap 的控件,非常完美的填补了这个空缺.注意: 本文是基于 bootstrap-fileinput v4.4.2. github 地址: https://github…

phpstudy能安装不带mysql的么_装了phpstudy还需要装mysql吗

phpStudy是一个PHP调试环境的程序集成包。该程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer&#xff0c;一次性安装&#xff0c;无须配置即可使用&#xff0c;是非常方便、好用的PHP调试环境。该程序不仅包括PHP调试环境&#xff0c;还包括了开发工具、开发手册等。对…

mysql 5.1.53_mysql 5.1.53免安装版的优化配备和精简

mysql 5.1.53免安装版的优化配置和精简[摘要]MySQL是一种关联数据库管理系统&#xff0c;关联数据库将数据保存在不同的表中&#xff0c;而不是将所有数据放在一个大仓库内。这样就增加了速度并提高了灵活性。本文介绍mysql-noinstall.zip免安装版的优化配置和精简。欢迎大家阅…

python牛顿法寻找极值_python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例...

Rosenbrock函数的定义如下&#xff1a;其函数图像如下&#xff1a;我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验。梯度下降梯度下降的更新公式&#xff1a;图中蓝色的点为起点&#xff0c;橙色的曲线(实际上是折线)是寻找最小值点的轨迹&#xff0c;终点(最小值点…

mysql报11004_使用mysqli扩展技术查看服务器连接错误报告的方法

使用mysqli扩展技术查看服务器连接错误报告的方法作为PHP的黄金搭档MySQL数据库&#xff0c;在PHP项目开发过程中有着举足轻重的作用&#xff0c;这不仅因为MySQL是完全免费的&#xff0c;而且和PHP一样都是完全跨平台的。但在实际项目开发过程中&#xff0c;PHP与MySQL数据库产…

_Linux进程信号详解

信号是什么一个信号就是一条小消息&#xff0c;它通知进程系统中发生了一个某种类型的事件信号是多种多样的&#xff0c;并且一个信号对应一个事件&#xff0c;这样才能做到收到一个信号后&#xff0c;知道到底是一个什么事件&#xff0c;应该如何处理&#xff08;但是要保证必…

java乘法表_Java中四种9*9乘法表的实现方式(附代码)

前言: 初学java,实现99乘法表是必学必会的内容。需求 : 分别写出上下左右,对应四个角的乘法表。思路: 可以先打印出*星星,形成一个直角三角形,然后再替换成乘法公式。代码如下:public class Demo {public static void main(String[] args) {for (int i 1; i <5 ; i) {for (…