矩阵键盘驱动设计

AI summary
矩阵键盘驱动设计包括独立按键和矩阵键盘的比较,强调在按键数量较少时使用独立按键,而在数量较多时使用矩阵键盘。设计中涉及硬件电路与驱动电路的关系,以及矩阵键盘的工作原理和设计分析,最后提供了练习以加深理解。
Last edited time
Sep 24, 2024 03:03 PM
Last edited by
Tags
Matrix Keyboard Design
Independent Key Characteristics
Hardware And Driver Circuits

一:常用的按键在生活中处理方式

  1. 独立按键(机械开关)
      • 特性:当按下按键时,按键不会马上稳定的接通,会伴随有一连串的抖动;
        • 当按键抬起时,按键不会马上稳定的断开,会伴随有一连串的抖动。
      • 独立按键板卡原理图:
        • notion image
      • 占用I/O资源
        • 当按键比较少时(低于10个按键),往往都会采用独立按键布局(简单)。
          特点:一个独立按键对应一个I/O;有多少按键需要多少I/O。
          当按键个数较多时(10个以上),往往不会采用独立按键布局。
  1. 矩阵键盘(机械开关)
      • 特性:当按下按键时,按键不会马上稳定的接通,会伴随有一连串的抖动;
        • 当按键抬起时,按键不会马上稳定的断开,会伴随有一连串的抖动。
      • 矩阵键盘板卡原理图:
        • notion image
      • 占用I/O资源
        • 矩阵键盘中,采用行和列来表明当前的按键(第一行第一列:第一个按键);按键的多少取决于行和列。
          独立按键I/O
          矩阵键盘I/O
          说明
          4:4
          4:4
          10:10
          10:7
          10个按键以下采用独立按键
          16::16
          16:8
          16个按键(几十按键)采用矩阵键盘
          100:100
          100:20
          上百个按键:编码芯片/接口协议
  1. 编码芯片/接口协议
    1. notion image
      接口协议:PS2/USB2.0/USB3.0协议。
      协议标准,具体可以参考器件手册。
总结:
(1)当按键个数较少时(10个以下),采用独立按键方式,价格便宜,布局简单。
(2)当按键个数较多时(16个/几十),采用矩阵键盘方式,价格便宜,布局矩阵。
(3)当按键特别多时(上百个),采用编码芯片/接口协议,价格昂贵,实现起来难。

二:硬件电路和驱动电路概念/关系

  1. 硬件电路
    1. ZX-1板卡设备原理图(LED/数码管/按键/蜂鸣器…)。
  1. 驱动电路
    1. 驱动某些设备时FPGA代码。
  1. 硬件电路和驱动电路关系
    1. notion image
      在硬件电路中输入是驱动电路的输出,硬件电路中输出则是驱动电路的输入。
      拓展:在芯片手册中,手册中端口描述方向时,在手册中是输入的,则驱动时是输出,反之,在手册中是输出的,则驱动时是输入。
      notion image

三:矩阵键盘硬件电路和原理

ZX-1板卡矩阵键盘原理图:
notion image
notion image
在键盘电路当中,当按键不按时,行信号接有上拉电阻,为逻辑1;列信号处于悬空状态。
列信号只能给确定值(0/1),让行信号进行反馈。(键盘电路:行作为输出,列作为输入)。
  1. 假设列在键盘电路中输入全部为1,表示当前按键按下;
    1. 在按键不按下时,行信号由于有上拉,所以为逻辑1;当按键有按下时,列信号为逻辑1,按下时,按键左右两边导通,会导致行信号等于列信号的值,那么按下时行信号也为逻辑1;该方式不能判断按键是否有按下。
      只能使得列信号必须输入低电平。
  1. 假设列信号全部为0(COL=4’h0),表示按键按下;
    1. 在按键不按下时,行信号由于有上拉,所以为逻辑1;当按键有按下时,列信号全部为逻辑0,按下时,按键左右两边导通,会导致行信号等于列信号的值,那么按下时行信号也为逻辑0(ROW=COL=0);假设第二行行信号反馈为0(ROW[1]=0),只能够说明第二行有按键按下,由于4列全部为逻辑0,所以不能够说明第二行哪一列有按键按下。
      只能使得列信号中有一列必须输入低电平,其它三列为高电平。
  1. 假设列信号只有1列为0(COL=4’b1110),表示按键按下;
    1. 在按键不按下时,行信号由于有上拉,所以为逻辑1;当按键有按下时,最低列信号为逻辑0(COL=4’b1110),按下时,按键左右两侧导通,会导致行信号等于列信号的值(ROW=COL=0);假设第二行反馈为逻辑0(ROW[1]=0),可以说明第二行有按键按下,由于给定的最低列为逻辑0(COL[0]=0),即第二行第一列有按键按下。
      总结:行作为键盘电路输出,列作为键盘电路输入。
      低电平列扫描,行信号进行反馈。
由键盘电路原理可以检测出具体是矩阵键盘上哪一个按键按下;具体该按键键值数据是什么,是由按键的具体位置来决定的(ROW和COL),假设第一行和第一列({ROW[0],COL[0]}),可以将其设置为0,依次类推,可以看到矩阵键盘按键编码(0~F)。
至于按键键值是什么,可以由设计人员来进行命名。

四:矩阵键盘设计分析

  1. 设计架构
    1. notion image
  1. 设计分析
      • 键盘电路过程
        • 总结:低电平列扫描,行信号进行反馈。
          第一步:判断按键是否按下,如果没有按键按下(ROW=4’b1111),等待按键按下,如果有按键按下(ROW!=4’b1111)。
          第二步:对按下的按键进行消抖,采用软件消抖(延时10ms以上);如果消抖完成,进行第三步,如果没有完成,则等待。
          第三步:对按键进行检测(低电平列扫描),看哪一行反馈为低电平。
          假设5按键按下,给COL[0]=1’b0,其余3列为高电平(COL[3:1]=3’b111),检测第一列时,由于5不在第一列,所以行信号反馈为1,那就说明按下的按键不在第一列,则换下一列进行扫描,COL[1]=1’b0,检测第二列时,由于5在当前列,所以行信号反馈为0,则检测到5按键按下,检测结束。
          第四步:记录当前按下的按键所在的位置,如果是5按键(第二行第二列),则表示为ROW_COL[7:0]={4’b1101,4’b1101},保存位置即可。
          第五步:可以对记录的按键位置进行编码(按照原理图的编码:0~F)
          第六步:判断按键是否抬起,准备抬起动作(COL=4’h0),判断行信号是否为逻辑1(ROW=4’b1111),代表矩阵键盘中没有按键处于按下状态,也可以说明按键抬起。
          第七步:对抬起的按键进行消抖,采用软件消抖(延时10ms以上);如果消抖完成,按键动作结束,如果没有完成,则等待。
          每一次按键过程满足上述1~7步骤。
      • 键盘电路实现
        • 采用FSM实现。
          notion image
      • 测试结果
        • notion image

五:练习

  1. 理解矩阵键盘原理
  1. 完成上课内容(FSM多状态)
  1. 完成下述功能(尝试完成)
    练习3分享:
    移位数据功能:
    key_data[3:0]=4’d1,4’d2,4’d3….
    显示过程:
    000000 000001 000012 000123 001234 012345 123456 234567…
    show_data[23:0]={show_data[19:0], key_data[3:0]}; //数码管显示移位数据
    仿真测试:
    notion image
    Loading...