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。

审核编辑:郭婷


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

    关注

    144

    文章

    9016

    浏览量

    161372
  • 单片机
    +关注

    关注

    6001

    文章

    43978

    浏览量

    620877

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

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

收藏 人收藏

    评论

    相关推荐

    矩阵led扫描频率怎么调

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

    阅读矩阵键盘的应用设计原理

    矩阵键盘以行和列的网格布线(尽管它们实际上不必以那个方向布置,例如在电子钢琴键盘的例子中)。在微控制器上,行或列引脚被永久设置为输入(在本文中,我们将坚持使用行连接实现此目的),而另一组引脚(在本文中,我们将坚持使用列连接实现此
    的头像 发表于 11-28 11:09 435次阅读
    阅读<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>的应用设计原理

    ARM系统中常用的行列式键盘电路的硬件设计、键盘扫描键盘测试

    电子发烧友网站提供《ARM系统中常用的行列式键盘电路的硬件设计、键盘扫描键盘测试.doc》资料免费下载
    发表于 10-26 14:15 0次下载
    ARM系统中常用的行列式<b class='flag-5'>键盘</b>电路的硬件设计、<b class='flag-5'>键盘</b><b class='flag-5'>扫描</b>及<b class='flag-5'>键盘</b>测试

    关于51单片机的矩阵键盘扫描的两种方法的困惑求解

    时间就去扫描下按键,理论上和主程序的while(1)循环里代码是否长和消耗时间应该无关,应该是很可靠的一种按键扫描方法!但事实就不是这样,下面请看代码,很简单的哦~ //用定时器中断扫描矩阵
    发表于 10-26 08:02

    51单片机4*4矩阵键盘有什么好方法扫描识别?

    关于51单片机的4*4矩阵键盘,有什么你比较好扫描识别方法,麻烦告知一下,十分感谢!!
    发表于 10-24 06:23

    分享一个stm32矩阵键盘的程序

    分享一个stm32矩阵键盘的程序
    发表于 10-10 08:26

    stm32矩阵键盘的程序

    电子发烧友网站提供《stm32矩阵键盘的程序.zip》资料免费下载
    发表于 10-07 15:07 9次下载
    stm32<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>的程序

    扩展模块之矩阵键盘

    15V2PB63GND4PB75PB16GND7PB08PA89VDD_NODE10PB4我们来看看矩阵键盘的引脚的定义:所以我们可以得到引脚关系如下:扩展板序号矩阵键盘模块引脚2RO
    的头像 发表于 07-31 22:06 492次阅读
    扩展模块之<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>

    在Proteus软件中如何读取矩阵键盘

    矩阵键盘是读取一系列按键的有效方法,例如读取电话的拨号盘、POS机小键盘、电脑键盘,甚至是电子钢琴上的键盘
    的头像 发表于 07-19 15:26 2530次阅读
    在Proteus软件中如何读取<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>?

    今天看一下矩阵键盘怎么用。

    矩阵键盘
    YS YYDS
    发布于 :2023年07月02日 18:08:06

    20键键盘矩阵开源分享

    电子发烧友网站提供《20键键盘矩阵开源分享.zip》资料免费下载
    发表于 06-12 16:04 0次下载
    20键<b class='flag-5'>键盘</b><b class='flag-5'>矩阵</b>开源分享

    51单片机矩阵键盘扫描程序

    51单片机矩阵键盘扫描程序
    发表于 05-17 17:20 4次下载

    基于89C51单片机的矩阵键盘反转扫描源程序

    基于89C51单片机的矩阵键盘反转扫描源程序
    发表于 05-15 11:02 2次下载

    基于89C51单片机的矩阵键盘行列扫描源程序

    基于89C51单片机的矩阵键盘行列扫描源程序
    发表于 05-15 11:00 1次下载

    基于89C51单片机的矩阵键盘中断扫描源程序

    基于89C51单片机的矩阵键盘中断扫描源程序
    发表于 05-15 11:00 2次下载