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。

审核编辑:郭婷


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

    关注

    149

    文章

    10309

    浏览量

    176390
  • 单片机
    +关注

    关注

    6074

    文章

    45334

    浏览量

    663302

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FZH217 带键盘扫描接口的大笔段 LED 驱动控制专用电路 原厂技术支持

    至8位×24段,可根据需求配置。键盘扫描功能o 内置16×2bit键扫描矩阵,支持按键检测,内置5kΩ下拉电阻。辉度调节o 提供8级占空比可调的辉度控制,支持动态亮度调节。串行接口o
    发表于 12-03 11:01

    FZH216 带键盘扫描接口的大笔段 LED 驱动控制专用电路

    型号:FZH216厂商:深圳市方中禾科技有限公司(Premier Chip Limited)FZH216 是带键盘扫描接口的大笔段 LED 驱动控制专用电路,内部集成有 MCU 数字接口、数据锁存器
    发表于 12-02 11:57

    FZH186 一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路

    的封装形式。核心特性工艺技术:功率CMOS工艺,低功耗设计。显示模式:固定支持 10段×7位 LED显示。键盘扫描:10×2矩阵扫描(10条SEG/KS线复用,2条K输入线)。亮度调
    发表于 11-28 15:57

    FZH183 带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路--方中禾科技

    形式:SOP32封装。核心特性工艺技术:采用功率CMOS工艺。显示模式:支持14段×8位显示模式。键盘扫描:支持8×2矩阵键盘扫描。辉度调节
    发表于 11-28 09:31

    FZH182 带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路

    等产品的高段位显示屏驱动。核心特性· 工艺技术:采用功率CMOS工艺。· 显示模式:支持16段×8位显示模式。· 键盘扫描:支持8×4矩阵键盘扫描
    发表于 11-27 14:58

    FZH181 一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路

    )。· 键盘扫描:支持10×2矩阵键盘扫描。· 辉度调节:提供8级占空比可调的辉度调节电路。· 通信接口:串行接口(CLK、STB、DIO)
    发表于 11-26 15:46

    FZH100 带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用 IC 原厂技术支持

    是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用 IC,内部集成有 MCU 数字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。
    发表于 11-18 09:26

    原厂 FZH1697 带键盘扫描接口的LCD驱动控制专用电路

    )FZH1697是一种带键盘扫描接口的LCD驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LCD驱动、键盘扫描、幻彩背光驱动等电路。本产品性能优良,质量可靠,无须更改解码板
    发表于 11-07 09:43

    FAQ_MA35_Family如何设置矩阵键盘

    FAQ_MA35_Family如何设置矩阵键盘
    发表于 09-02 06:57

    FZH182 LED驱动控制专用电路中文手册

    高段位显示驱动支持 16段×8位 显示模式,适配复杂数码管、点阵屏或多段位 LED 面板。内置 16字节显存,通过地址映射直接控制 SEG(段)和 GRID(位)输出,数据位“1”对应段点亮。键盘扫描功能8×4 矩阵
    发表于 05-23 10:41 1次下载

    LED驱动控制专用电路FZH181中文手册

    集成LED 驱动:支持 11段×7位 至 14段×4位 多种显示模式,适配不同数码管布局。键盘扫描:内置 10×2 矩阵键盘扫描,自动完成键
    发表于 05-23 10:39 0次下载

    ADP5588移动I/O扩展器和QWERTY键盘控制器技术手册

    ADP5588是一款I/O端口扩展器和键盘矩阵,适用于需要大型键盘矩阵和扩展I/O线路的QWERTY型电话。I/O扩展器IC可以在移动平台中解决主处理器GPIO数量有限的问题。
    的头像 发表于 05-22 11:37 678次阅读
    ADP5588移动I/O扩展器和QWERTY<b class='flag-5'>键盘</b>控制器技术手册

    ADP5587移动I/O扩展器和QWERTY键盘控制器技术手册

    ADP5587 是一款 I/O 端口扩展器和键盘矩阵,适用于需要大型键盘矩阵和扩展 I/O 线路的 QWERTY 型电话。I/O 扩展器 IC 可以在移动平台中解决主处理器 GPIO
    的头像 发表于 05-22 11:08 759次阅读
    ADP5587移动I/O扩展器和QWERTY<b class='flag-5'>键盘</b>控制器技术手册

    纳祥科技NX1722,一种带键盘扫描的8段4位 LED 驱动控制方案

    NX1722是一种带键盘扫描电路接口的 LED 驱动控制专用电路,内部集成有 MCU 输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。 NX1722性能稳定
    的头像 发表于 02-05 17:27 724次阅读
    纳祥科技NX1722,一种带<b class='flag-5'>键盘</b><b class='flag-5'>扫描</b>的8段4位 LED 驱动控制方案

    AN-660:XY矩阵键盘与MicroConverter的接口

    电子发烧友网站提供《AN-660:XY矩阵键盘与MicroConverter的接口.pdf》资料免费下载
    发表于 01-13 16:02 0次下载
    AN-660:XY<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>与MicroConverter的接口