键盘分编码键盘和非编码键盘。键盘上闭合键的辨认由专用的硬件编码器完成,并发生键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来辨认的称为非编码键盘。
在一般嵌入式运用中,用的最多的对错编码键盘,也有用到编码键盘的。非编码键盘又分为独立键盘和队伍式(又称为矩阵式)键盘。所谓独立式键盘,即嵌入式CPU(或称MCU)的一个GPIO口对应一个按键输入,这个输入值的凹凸状况便是键值。矩阵键盘用于收集键值的GPIO是复用的,一般分为行和列收集,例如4*4矩阵键盘就只需求队伍各4个按键就能够了,矩阵键盘的操控较独立键盘要杂乱得多,本试验未触及,所以对其原理不做详细介绍。
独立按键一般有2组管脚,尽管市面上咱们常常看到有4个管脚的按键,但它们一般是两两导通的,这2组管脚在按键未被按下时是断开的,在按键被按下时则是导通的。基于此原理,咱们一般会把按键的一个管脚接地,另一个管脚上拉到VCC,而且也衔接到GPIO。这样,在按键未被按下时,GPIO的衔接状况为上拉到VCC,则键值为1;按键被按下时,GPIO尽管仍是上拉到VCC,但一起被导通的另一个管脚拉到地了,所以它的键值实际上是0。
咱们的SF-CY4开发板上有一组4*4矩阵键盘。经过P12的PIN1-2短接时,其实S1/S2/S3/S4能够作为独立按键运用,它的一端接地,另一端在上拉的一起衔接到FPGA的I/O口。当I/O口的电平为高(1)时,阐明按键没有被按下,当I/O口的电平为低(0)时,阐明按键被按下了。这是8.4节中咱们的运用方法。在本实例中,咱们不再只局限于独立按键这么low的运用了,这儿咱们将要把一切16个按键都运用起来,完成咱们真实的矩阵按键功用。要做矩阵按键,那么咱们首要要承认把自己的SF-CY4开发板上插座P12的PIN2-3用跳线帽短接。矩阵按键的原理图如图8.85所示。
图8.85 矩阵按键原理图
接续上面的原理图,咱们来看看矩阵按键的键值怎么取得。
一般,咱们将这个矩阵按键分为两组信号,即列信号(包含BUT0/BUT1/BUT2/BUT3)和行信号(BUT4/BUT5/BUT6/BUT7)。列信号作为FPGA的输入信号,行信号作为FPGA的输出信号。
若FPGA输出的行信号为高电平时,不管是否有按键被按下,列信号输入到FPGA的电平一直为高电平,这是无法完成任何的矩阵按键值收集的;若FPGA输出的行信号为低电平时,没有按键按下,那么列信号会坚持高电平(因为有上拉),有键按下时,则因为按键将行、列信号短接,那么列信号的电平会因为行信号而被拉低,经过这种方法,咱们就能够到达键值的检测。
可是,或许咱们还有疑问,4个行信号若一起拉低,那么恣意一个4X4按键被按下,一切的列信号也都会拉低啊,这只能判别是否有按键被按下,详细哪一个按键被按下就不得而知了。的确如此,解决办法也很简单,咱们在同一时间只能拉低4个行信号中的一个,那么它就将按键状况定位到详细的行,这样就好像独立按键相同能够直接定位到这一行按键中的哪个按键被按下了。在完成上,咱们会让4个行信号循环的拉低,同一时间有且只要一个行信号输出为低电平,这便是咱们所说的“键盘扫描”原理。
本实例完成矩阵按键值的收集(即判别16个按键的哪个被按下了),然后经过数码管显现按键值(显现值为16进制的0-F),数码管最低位显现最终一次的键值,高3位显现之前的值,即每按下一次按键,数码管的键值右移一位。
如图8.86所示,用8个信号检测16个按键值,有点难度,不过原理上一节咱们现已讲过。从功用上,咱们首要对4个作为输入的列信号进行按键消抖处理,然后顺次输出不同的行信号值,以此找到有键按下时的特别列信号值,这样便能收集键值,送往数码管显现。
图8.86 矩阵按键扫描实例功用框图
工程结构如图8.87所示,cy4.v为顶层模块,不做逻辑,只做信号接口界说和衔接。anykeyscan.v模块完成行信号输出;sigkeyscan.v完成列信号的按键消抖和键值收集;seg7.v为数码管驱动模块。
图8.87 矩阵按键扫描实例模块层次