4X4矩阵键盘及显示电路设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4X4矩阵键盘与显示电路设计
FPGA在数字系统设计中的广泛应用,影响到了生产生活的各个方面。
在FPGA 的设计开发中,VHDL语言作为一种主流的硬件描述语言,具有设计效率高,可靠性好,易读易懂等诸多优点。
作为一种功能强大的FPGA数字系统开发环境,Altera公司推出的Quar-tUSⅡ,为设计者提供了一种与结构无关的设计环境,使设计者能方便地进行设计输入、快速处理和器件编程,为使用VHDL语言进行FPGA设计提供了极大的便利。
矩阵键盘作为一种常用的数据输入设备,在各种电子设备上有着广泛的应用,通过7段数码管将按键数值进行显示也是一种常用的数据显示方式。
在设计机械式矩阵键盘控制电路时,按键防抖和按键数据的译码显示是两个重要方面。
本文在QuartusⅡ开发环境下,采用VHDL语言设计了一种按键防抖并能连续记录并显示8次按键数值的矩阵键盘与显示电路。
一、矩阵键盘与显示电路设计思路
矩阵键盘与显示电路能够将机械式4×4矩阵键盘的按键值依次显示到8个7段数码管上,每次新的按键值显示在最右端的第O号数码管上,原有第0~6号数码管显示的数值整体左移到第1~7号数码管上显示,见图1。
总体而言,矩阵键盘与显示电路的设计可分为4个局部:
(1)矩阵键盘的行与列的扫描控制和译码。
该设计所使用的键盘是通过将列扫描信号作为输入信号,控制行扫描信号输出,然后根据行与列的扫描结果进行译码。
(2)机械式按键的防抖设计。
由于机械式按键在按下和弹起的过程中均有5~10 ms的信号抖动时间,在信号抖动时间内无法有效判断按键值,因此按键的防抖设计是非常关键的,也是该设计的一个重点。
(3)按键数值的移位存放。
由于该设计需要在8个数码管上依次显示前后共8次按键的数值,因此对已有数据的存储和调用也是该设计的重点所在。
(4)数码管的扫描和译码显示。
由于该设计使用了8个数码管,因此需要对每个数码管进行扫描控制,并根据按键值对每个数码管进行7段数码管的译码显示。
二、矩阵键盘与显示电路的实现
本文所设计的矩阵键盘与显示电路的电路符号如图2所示。
其中,clk为时钟信号输入端(频率可为1 024~32 768Hz);start为清零控制端;kbrow为列扫描信号输入端;kbeol为行扫描信号输出端;scan为数码管地址扫描信号输出端;seg7为数码管显示信号输出端。
图1 矩阵键盘与显示电路原理图
图2 矩阵键盘与显示电路的电路符号
如图1所示,全部代码由7个进程(process)组成。
其中,进程P1和P2用于对列扫描输入信号kbrow进行读取,并通过或非运算产生行扫描使能控制信号en 对行扫描输出信号kbcol进行控制,并生成一个与kbcol对应的状态信号state。
假设没有按键被按下(即kbrow="0000"),那么en= '1',行扫描输出信号kbcol 不断循环扫描各行;假设有按键被按下,en=‘O’,那么行扫描停止,并锁存当前
kbcol的值。
进程P1和P2的代码如下:
P1:process(clk,kbrow)
begin
en < =not (kbrow(0) or kbrow(1) or kbrow(2) or kbrow(3));
if(cle’event and clk =‘1’) then
if en =‘1’ then count < =count +1;
end if;
end if;
end process;
P2:process(clk)
begin
if clk’event and clk =‘1’ then
case count is
when “00”= >kbcol < =“0001”;
state < =“00”;
when “01” = >kbcol < =“0010”;
state < =“01”;
when “10” = >kbcol < =“0100”;
state < =“10”;
when “11” = >kbcol < =“1000”;
state < =“11”;
when others = >kbcol < =“1111”;
end case;
end if;
end process;
进程P3使用“case…when〞语句,根据状态信号state的值(即kbcol的值)和列扫描输入信号kbrow的值进行按键值译码,生成一个4位二进制按键数值信号dat,用以记录当前按键值。
例如,当kbcol=“0010〞,kbrow=“0001〞时,“B〞键按下,dat=“1011〞。
进程P3的代码在此不再赘述。
进程P4和P5用于按键的防抖和按键值的移位存放。
通过将行扫描使能控制信号en不断赋给一个8位二进制变量reg8,再将reg8赋给8位二进制信号key,实现对按键状态的记录,然后通过对key的各位数值进行与运算,生成防抖控制信号fnq。
一旦有按键按下,en=‘O’,那么即便是按键在抖动,key中至少也有1位数值为‘0’,从而使fnq=‘O’。
只有当按键再次弹起,并且在连续8个时钟周期内不再有新的按键按下,key的数值全为‘1’,那么fnq=‘1’,fnq产生一个上升沿,从而触发按键数值信号dat进入数值存放信号temp(32位二进制数)的第0~3位,并将temp原来的第0~27位左移到第4~31位,实现1次按键按下的数值存储。
进程P4和P5的代码如下:
P4:process〔clk〕
Variable reg8 :std_logic_vector(7 downto 0);
BEGIN
If(clk’ event and clk = ‘1’) then
Reg8 : =reg8(6 downto 0) &en;
end if;
key < =reg8;
end process;
fnq <=key(0) and key(1) and key(2) and key(3)
and key(4) and key(5) and key(6) and key(7);
P5:process(fnq ,star)
BEGIN
IF star=’0’ then
temp <=“00000000000000000000000000000000”;
elsif(fnq’event and fnq =‘1’) then
temp < =temp (27 downto 0) &dat;
end if;
end process;
进程P6用于将数值存放信号temp的32位二进制数分配给8个数码管,从而生成数码管地址扫描输出scan,以与数码管数值信号data(4位2进制数)。
进程P6代码如下:
P6:process(clk,temp,cnt8)
begin
if clk event and clk=‘1’ then cnt8<=cnt8+1;
end if;
case cnt8 is
when 0 = >scan < =“000”;data < =temp(3 downto 0);
when 1 = >scan < =“000”;data < =temp(7 downto 4);
when 2 = >scan < =“000”;data < =temp(11 downto 8);
when 3 = >scan < =“000”;data < =temp(15 downto 12);
when 4 = >scan < =“000”;data < =temp(19 downto 16);
when 5 = >scan < =“000”;data < =temp(23 downto 20);
when 6 = >scan < =“000”;data < =temp(27 downto 24);
when 7 = >scan < =“000”;data < =temp(31 downto 28);
when others =>null;
end case;
end process
进程P7用于将数码管数值信号data译码成为7段数码管显示输出seg7,进程P7的代码在此不再赘述。
值得注意的是,本文设计的矩阵键盘与显示电路在按键防抖和数据存放局部设计得更加简洁可靠,实现的功能更加强大,其具有如下特点:
(1)为了实现按键防抖,本文采用对按键状态连续记录的方式,即在按键弹起后连续8个时钟周期均无按键信号才确认1次按键有效,从而防止了按键按下和弹起过程中的数据抖动,相比于使用计数器从按键按下开始计数,直到5~10 ms后才让按键有效的防抖方式,这里设计的按键防抖更加可靠,且可有效防止长时间按下按键产生的重复数据输出,使每次按键无论时间长短均可且只会产生1次数据输出。
另外,当电路采用32 768 Hz以上的时钟作为系统时钟时,可以通过增加按键状态连续记录的时钟周期数,实现可靠的防抖。
(2)该设计采用一个32位一维数组temp作为数据存放器,使用移位存放方式,实现了对连续8次按键数据的存储和调用,从而可以在8个数码管上连续显
示数据。
三、仿真结果分析
本文设计的矩阵键盘与显示电路在QliartusⅡ开发环境下进行了仿真验证。
其中,按键防抖功能的仿真波形如图3所示。
仿真结果分析如下:
(1)clk为时钟输入信号,作为系统时钟;
(2)start为清零控制端,当其为高电平时,按键有效;
(3)kbrow为列扫输入信号,kbcol为行扫输出信号,图3中对kbrow[1]的输入波形进行设置,模拟了“A〞键按下和弹起的过程;
(4)fnq为防抖控制信号,scan为数码管地址扫描输出,seg7为数码管显示输出。
由图3可知,只有在按键弹起后,才有数据输出,从而实现防抖功能。
图2 矩阵键盘与显示电路按键防抖仿真波形
四、总结
本文设计4X4矩阵键盘与显示电路在QuartusⅡ开发环境下进行仿真验证后,下载到实验箱中进行了硬件验证。
实验证明,当电路的系统时钟频率在 1 024~32 768 Hz范围内时,电路均可稳定运行,按键防抖可靠、功能完整。
当系统时钟频率低于1 024 Hz时,需要减少防抖记录时钟周期的个数,否那么容易错过短时按键动作;当系统时钟频率高于32 768 Hz时,需要增加防抖记录时钟周期的个数,以确保可靠的按键防抖。