矩阵键盘驱动设计
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
一:常用的按键在生活中处理方式
- 独立按键(机械开关)
- 特性:当按下按键时,按键不会马上稳定的接通,会伴随有一连串的抖动;
- 独立按键板卡原理图:
- 占用I/O资源
当按键抬起时,按键不会马上稳定的断开,会伴随有一连串的抖动。
当按键比较少时(低于10个按键),往往都会采用独立按键布局(简单)。
特点:一个独立按键对应一个I/O;有多少按键需要多少I/O。
当按键个数较多时(10个以上),往往不会采用独立按键布局。
- 矩阵键盘(机械开关)
- 特性:当按下按键时,按键不会马上稳定的接通,会伴随有一连串的抖动;
- 矩阵键盘板卡原理图:
- 占用I/O资源
当按键抬起时,按键不会马上稳定的断开,会伴随有一连串的抖动。
矩阵键盘中,采用行和列来表明当前的按键(第一行第一列:第一个按键);按键的多少取决于行和列。
独立按键I/O | 矩阵键盘I/O | 说明 |
4:4 | 4:4 | |
10:10 | 10:7 | 10个按键以下采用独立按键 |
16::16 | 16:8 | 16个按键(几十按键)采用矩阵键盘 |
100:100 | 100:20 | 上百个按键:编码芯片/接口协议 |
- 编码芯片/接口协议
接口协议:PS2/USB2.0/USB3.0协议。
协议标准,具体可以参考器件手册。
总结:
(1)当按键个数较少时(10个以下),采用独立按键方式,价格便宜,布局简单。
(2)当按键个数较多时(16个/几十),采用矩阵键盘方式,价格便宜,布局矩阵。
(3)当按键特别多时(上百个),采用编码芯片/接口协议,价格昂贵,实现起来难。
二:硬件电路和驱动电路概念/关系
- 硬件电路
ZX-1板卡设备原理图(LED/数码管/按键/蜂鸣器…)。
- 驱动电路
驱动某些设备时FPGA代码。
- 硬件电路和驱动电路关系
在硬件电路中输入是驱动电路的输出,硬件电路中输出则是驱动电路的输入。
拓展:在芯片手册中,手册中端口描述方向时,在手册中是输入的,则驱动时是输出,反之,在手册中是输出的,则驱动时是输入。
三:矩阵键盘硬件电路和原理
ZX-1板卡矩阵键盘原理图:
在键盘电路当中,当按键不按时,行信号接有上拉电阻,为逻辑1;列信号处于悬空状态。
列信号只能给确定值(0/1),让行信号进行反馈。(键盘电路:行作为输出,列作为输入)。
- 假设列在键盘电路中输入全部为1,表示当前按键按下;
在按键不按下时,行信号由于有上拉,所以为逻辑1;当按键有按下时,列信号为逻辑1,按下时,按键左右两边导通,会导致行信号等于列信号的值,那么按下时行信号也为逻辑1;该方式不能判断按键是否有按下。
只能使得列信号必须输入低电平。
- 假设列信号全部为0(COL=4’h0),表示按键按下;
在按键不按下时,行信号由于有上拉,所以为逻辑1;当按键有按下时,列信号全部为逻辑0,按下时,按键左右两边导通,会导致行信号等于列信号的值,那么按下时行信号也为逻辑0(ROW=COL=0);假设第二行行信号反馈为0(ROW[1]=0),只能够说明第二行有按键按下,由于4列全部为逻辑0,所以不能够说明第二行哪一列有按键按下。
只能使得列信号中有一列必须输入低电平,其它三列为高电平。
- 假设列信号只有1列为0(COL=4’b1110),表示按键按下;
在按键不按下时,行信号由于有上拉,所以为逻辑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)。
至于按键键值是什么,可以由设计人员来进行命名。
四:矩阵键盘设计分析
- 设计架构
- 设计分析
- 键盘电路过程
- 键盘电路实现
- 测试结果
总结:低电平列扫描,行信号进行反馈。
第一步:判断按键是否按下,如果没有按键按下(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实现。
五:练习
- 理解矩阵键盘原理
- 完成上课内容(FSM多状态)
- 完成下述功能(尝试完成)
练习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]}; //数码管显示移位数据
仿真测试:
Loading...