深圳市航顺芯片技术研发有限公司
直播中

俞舟群

7年用户 1073经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

矩阵按键与按键输入有哪些不同点

什么是按键输入?什么是矩阵按键?
按键抖动产生的原因是什么?矩阵按键与按键输入有哪些不同点?


回帖(1)

张毕鹄

2021-7-29 14:50:43
  KEY
  按键输入:通过按键向芯片输入信号,一般的按键都会接上拉电阻接芯片,另一端接地,按下将芯片的引脚拉低。因此在初始化函数中芯片引脚的工作模式为上拉输入,引脚的初始电平为高电平。
  矩阵按键:通过芯片向矩阵按键(4*4)的行和列接口分别输入0000 1111和1111 0000检测两次,判断出按键的坐标。
  1.KEY初始化
  CT117E开发板KEY1-4引脚,分别为PA0、PA8、PB1、PB2。
  KEY_Init()函数注意的问题:
  按键输入时GPIO的工作模式为上拉输入。
  
  2.按键抖动产生的原因
  通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。
  
  由于单片机的运行速度非常快,按下一次按键,可能在A点检测到一次低电平,在B点检测到一次高电平,在C点又检测到一次低电平。同时抖动是随机,不可测的。那么按下一次按键,抖动可能对会让单片机误以为按下多次按键。
  设置系统定时器,50ms进行一次按键扫描,就尽可能的避免按键抖动对按键检测的影响。
  3.短按和长按
  按键输入最主要的一步是按键扫描,方法有很多。
  三行代码的按键扫描(不是原创)
  
  按键配置的上拉输入,当没有按键按下时,KEYINPUT为0xff;read_data = (KEYINPUT)^(0xff) = 0x00;trg = 0x00&0x00 = 0x00;cont = 0x00;
  当按键4按下时,KEYINPUT为0xf7; read_data = 0x08;计算trg的cont为按键未按下时的cont:trg = 0x08&(0x08^0x00) = 0x08;cont = 0x08依次列推,trg 为0x04、0x02、0x01;
  当按键4长按时,第二次进入按键扫描时,按键4 trg = 0x08&(0x08^0x08) = 0x00;cont的值保持不变,按键4、3、2、1分别长按:cont = 0x08、0x04、0x02、0x01;
  按键短按的标志位为trg 按键长按的标志位为cont.
  在SYSTICK中断处理函数每50ms进行一次按键扫描,如果按键判断语句放在中断外时,必须要用(长按标志位cont & KEY_FLAG按键扫描标志位)作为判断条件,if语句中变量累加20次后在执行操作,达到地效果为按键长按1s后执行操作;如果按键判断语句放在SYSTICK中断内则不需要。
  按键1短按:蜂鸣器响100ms,长按:点亮第二个LED;
  按键4短按:点亮第三个LED,长按:熄灭第三个LED;
  
  
  
  4.矩阵按键
  经过三行代码的按键扫描的启发,自己写了一下矩阵按键的三行代码。
  与按键输入不同的点:
  矩阵按键需要扫描两次,分别是行和列。
  矩阵按键的行和列端口的初始值由芯片输出,要自己设定。
  矩阵按键扫描函数
  
  4*4的矩阵按键需要8个IO口,我把它接在了PC0-PC7;矩阵按键第一列到第四列是PC0-PC3,第一行到第四行是PC4-PC7。
  检测方式:行或列分别赋0和1,检测赋0的行或列,变为1的行或列为按键的坐标。
  KEYINPUT宏定义,PC0-PC8由低位到高位赋值,与按键输入方法相同。
  
  矩阵按键的检测分为检测行和列,因此分成了两个函数,行检测函数和列检测函数。
  
  行检测函数:
  
  
  列检测函数:
  
  
  行、列检测函数内要用GPIO_SetBits();函数设置行和列端口的初始值;
  5.矩阵按键初始化函数
  
  注意:GPIO的工作模式为推挽输出。
  按键(1,1)点亮第三个LED,按键(2,2)熄灭第三个LED。
  
  6.GPIO口输入和输出类型
  Cortex-M3 里,GPIO 工作模式的配置有 8 种:
  GPIO_Mode_IPU 上拉输入
  GPIO_Mode_IPD 下拉输入
  GPIO_Mode_AIN 模拟输入
  GPIO_Mode_IN_FLOATING 浮空输入
  GPIO_Mode_Out_OD 开漏输出
  GPIO_Mode_AF_OD 复用开漏输出
  GPIO_Mode_AF_OD 复用开漏输出
  GPIO_Mode_AF_PP 复用推挽输出
  上拉输入/下拉输入/模拟输入
  字面意思理解即可。
  浮空输入
  浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平 是不确定的。
  推挽输出
  可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通 的时候另一个截止。
  开漏输出
  输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动其吸收电流的能力相对 强(一般 20MA 以内)。 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电 平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以 改变传输电平。比如加上上拉电阻就可以提供 TTL/CMOS 电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的 速度 。阻值越大,速度越低功耗越小, 所以负载电阻的选择要兼顾功耗和速度。)
  
  图中,左边是推挽输出模式,其中比较器输出高电平时下面的 PNP 三极管截止,而上面 NPN 三极管导通,输出电 平VS+;当比较器输出低电平时则恰恰相反, PNP 三极管导通,输出和地相连,为低电平。右边可以理解为开漏输 出形式,需要接上拉。
  复用开漏输出、复用推挽输出
  可以理解为 GPIO 口被用作第二功能时的配置情况(即并非作为通用 IO口使用)。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分