0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

矩阵键盘扫描的原理及设计

凡亿PCB 来源:设计中在遇到按键较多, 作者:设计中在遇到按键 2022-07-05 14:59 次阅读

设计中在遇到按键较多,但是单片机I/O资源有限时,采用矩阵键盘是一种很好的选择方案。在按键较少时,矩阵键盘没有明显的优势,比如3×3矩阵键盘占用I/O口6个,只支持9个按键;但是,按键较多时,矩阵键盘的优势就凸显出来了,比如5×5矩阵键盘占用I/O口10个,可支持25个按键;

矩阵键盘的硬件设计非常简单,如图1以5×5矩阵键盘为例,蓝色行线5条,绿色列线5条(加上拉电阻),用按键代替行列交叉的节点即组成了矩阵键盘,其中二极管处的红色连线可用来检测按键是否按下或作为中断信号的(可以不需要,使用时没有任何影响,本文不涉及)。

4b9915ac-f417-11ec-ba43-dac502259ad0.png

图1:矩阵键盘

图2单片机STM32F103CBT6的外围电路,带颜色的I/O口为矩阵键盘行线PA1~PA5(蓝色),列线PA6~PA10(绿色)。为方便编程,矩阵键盘最好选择同组的I/O端口

4bb1e8ca-f417-11ec-ba43-dac502259ad0.png

图2:单片机外围电路

硬件的设计就是以上部分,接下来讲解程序部分,

矩阵键盘的扫描方法有多种,其中很青睐的是行列反转扫描,不仅简单而且效率高,而且只需要掌握该方法就足够了。

行列反转扫描的逻辑:

①行线输出全为0(行线PA1~PA5配置成推挽输出,列线PA6~PA10配置成上拉输入)

②读入列线值

③输出列线值(行线PA1~PA5配置成上拉输入,列线PA6~PA10配置成推挽输出)

④读入行线值

⑤组合行线列线值

对于STM32的单片机,直接操作寄存器会更简单,且无需再对I/O进行另外的配置,全部代码如图3所示,完全可以当做一个模块来使用。

4bcd4e44-f417-11ec-ba43-dac502259ad0.png

图3:矩阵键盘的行列反转扫描

以下代码与图3里面的代码完全一致(为方便浏览和拷贝)

/*----------------------
5*5矩阵键盘扫描函数,返回扫描键值(行列反转扫描)
-----------------------*/
u16 Key_Scan(void)
{
u16 cord_h,cord_l;
u16 key_value = 0xFFFF;
GPIOA->CRL = 0x88333334;
GPIOA->CRH = 0x44444888;
GPIOA->ODR = GPIOA->IDR & 0xFFC1;
cord_l = GPIOA->IDR & 0x07C0;
if(cord_l != 0x07C0)
{
delay_ms(10);
if(cord_l != 0x07C0)
{
cord_l = GPIOA->IDR & 0x07C0;
GPIOA->CRL = 0x33888884;
GPIOA->CRH = 0x44444333;
GPIOA->ODR = cord_l | 0xF83F;
delay_us(1);
cord_h = GPIOA->IDR & 0x003E;
cord_h >>= 1;
cord_l >>= 1;
key_value = (cord_l + cord_h) & 0xFFFF;
return(key_value);
}
}return(0xFFFF);
}

以下代码为端口配置寄存器的操作,PA组I/O有16个引脚:PA0~PA15;3代表推挽输出,4代表浮空输入,8代表上拉输入;

GPIOA->CRL = 0x88333334; //低8位配置
GPIOA->CRH = 0x44444888; //高8位配置

以下代码中,GPIOA->ODR为端口输出数据寄存器,用于写操作;GPIOA->IDR为端口输入数据寄存器,用于读操作;

0xFFC1的二进制:1111 1111 1100 0001,表示要对PA1~PA5置0。

0x07C0的二进制:0000 0111 1100 0000,表示要对PA6~PA10读值。

GPIOA->ODR = GPIOA->IDR & 0xFFC1;//行线输出全为0
cord_l = GPIOA->IDR & 0x07C0; //读入列线值

行列反转后的原理与上面完全一样,这里就不一一阐述了。

最后讲一下组合行线列线值,假如S1按键按下去了,得到的二进制为(注意黑体字

cord_h:0000 0000 0011 1100

cord_l:0000 0111 1000 0000

cord_h >>= 1 表示右移1位得到:

0000 0000 0001 1110

cord_l >> = 1 表示右移1位得到:

0000 0011 1100 0000

组合码(键值):key_value=0000 0011 1101 1110,即0x03DE;最后函数返回key_value值,该值就作为判断S1的键值。

之所以右移1位,是因为PA0没有用于矩阵键盘,所得到的键值也就被左移了1位,事实上,也可以不用右移,只是得到的组合码不同而已,右移是为了方便计算。

矩阵键盘的键值定义如下:

#define S1 0x03DE
#define S2 0x03BE
#define S3 0x037E
#define S4 0x02FE
#define S5 0x01FE
#define S6 0x03DD
#define S7 0x03BD
#define S8 0x037D
#define S9 0x02FD
#define S10 0x01FD
#define S11 0x03DB
#define S12 0x03BB
#define S13 0x037B
#define S14 0x02FB
#define S15 0x01FB
#define S16 0x03D7
#define S17 0x03B7
#define S18 0x0377
#define S19 0x02F7
#define S20 0x01F7
#define S21 0x03CF
#define S22 0x03AF
#define S23 0x036F
#define S24 0x02EF
#define S25 0x01EF

要点:

①行列反转扫描的思想是行线作为输出时,读出列线的值;然后反过来,列线作为输出时,读出行线的值,最后把两个值组合起来就是该按键的键值;

②参与计算的十六进制数一定要与行线或列线在同组端口的位置匹配,比如0xFFC1的二进制:1111 1111 1100 0001,表示要对PA1~PA5置0。

审核编辑:郭婷


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二极管
    +关注

    关注

    147

    文章

    9631

    浏览量

    166330
  • 单片机
    +关注

    关注

    6035

    文章

    44553

    浏览量

    634734

原文标题:5×5矩阵键盘扫描,一条龙化繁为简,值得拥有

文章出处:【微信号:FANYPCB,微信公众号:凡亿PCB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【xG24 Matter开发套件试用体验】物联网密码柜之驱动矩阵键盘和OLED显示器

    编辑器,选择circuitpython为解释器并选择开发板连接的串口 然后将有关代码提示的设置打开,方便后续开发 矩阵键盘的驱动 矩阵键盘的实现原理并不难,就是逐行
    发表于 08-04 23:04

    TCA8424低压8x16键盘扫描器数据表

    电子发烧友网站提供《TCA8424低压8x16键盘扫描器数据表.pdf》资料免费下载
    发表于 07-11 11:46 0次下载
    TCA8424低压8x16<b class='flag-5'>键盘</b><b class='flag-5'>扫描</b>器数据表

    TCA8418 I2C控制型键盘扫描IC数据表

    电子发烧友网站提供《TCA8418 I2C控制型键盘扫描IC数据表.pdf》资料免费下载
    发表于 07-01 11:53 0次下载
    TCA8418 I2C控制型<b class='flag-5'>键盘</b><b class='flag-5'>扫描</b>IC数据表

    TCA8418E I2C控制键盘扫描IC,带集成ESD保护数据表

    电子发烧友网站提供《TCA8418E I2C控制键盘扫描IC,带集成ESD保护数据表.pdf》资料免费下载
    发表于 06-27 09:58 0次下载
    TCA8418E I2C控制<b class='flag-5'>键盘</b><b class='flag-5'>扫描</b>IC,带集成ESD保护数据表

    基于51单片机矩阵键盘音乐电子琴电路图proteus仿真及程序

    本资源内容概要:       这是基于51单片机矩阵键盘音乐电子琴电路图proteus仿真及程序设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开
    发表于 06-21 14:32 3次下载

    键盘矩阵规格设计图

    键盘矩阵规格设计图
    发表于 06-19 14:29 0次下载

    用STM8L152使用一个矩阵键盘,信号一直处于低电平状态的原因?

    想用STM8L152 使用一个矩阵键盘,根据的是行列扫描的方法,但是代码调试过程中只能检测到列的信号(高低电平)的变化,信号一直处于低电平状态,这是怎么一回事?哪里出问题了?
    发表于 05-15 08:31

    单片机接矩阵键盘GPIO应该怎么设置?是用上拉输出或输入模式吗?

    单片机接矩阵键盘GPIO应该怎么设置?是用上拉输出或输入模式吗?
    发表于 05-11 08:38

    往RA8875移植矩阵键盘程序失败的原因?怎么解决?

    安富莱提供的例程RA8875,往里面移植4×4矩阵键盘失败,就是搞不懂原因,扫描程序如下int KEY_Scan(void){ u8 KeyVal; GPIO_Write(GPIOA
    发表于 05-09 06:44

    stop mode下怎么实现按下矩阵键盘的任意键将系统唤醒呢?

    请问有没有大佬知道stop mode下怎么实现按下矩阵键盘的任意键将系统唤醒呢?用WAKEUP 能实现吗?
    发表于 05-06 07:08

    采用NT33510显示屏,如何通过矩阵键盘更改显示屏上的数字内容?

    我想实现一个这样的功能:我的LCD当前显示的是:新年快乐!2018! 想通过矩阵键盘将2018更改成2019,这个过程首先通过矩阵键盘上的左键移动到数字“8”上,然后在通过
    发表于 04-24 08:10

    stm32cubeMX如何配置4*4矩阵键盘

    stm32cubeMX如何配置4*4矩阵键盘,求大佬给代码指导一下,看了太多代码,自己迷乱了
    发表于 03-28 09:27

    薄膜键盘领域设计#键盘

    薄膜键盘
    泰达克电子材料
    发布于 :2024年01月09日 11:30:41

    单片机如何读取键盘数据

    单片机作为一种嵌入式系统,往往需要与外部设备进行交互。其中之一的重要环节就是通过键盘读取输入的数据。在本文中,我们将详细介绍如何使用单片机读取键盘数据,包括键盘的原理、扫描方式、连接方
    的头像 发表于 01-04 17:09 1752次阅读

    矩阵led扫描频率怎么调

    矩阵LED扫描频率是指LED矩阵在单位时间内刷新显示的次数。LED矩阵是由多个发光二极管(LED)组成的显示设备,通过扫描控制来实现各个LE
    的头像 发表于 01-02 17:30 1301次阅读