本帖最后由 雾盈 于 2016-8-28 13:43 编辑
六位四则运算计算器(2)矩阵键盘扫描模块
雾盈 2016-8-26
雾盈FPGA笔记汇总目录
一、写在前面
上一篇文章我写了计算器整个设计的框架结构和设计思路,这一篇文章我们来谈谈矩阵键盘模块。
矩阵键盘扫描程序可以由多种方式来写,但是原理都是一样的。我把矩阵键盘模块分为两个小模块——矩阵键盘扫描模块和矩阵键盘消抖模块。
今天,我们这篇文章只谈第一个小模块——矩阵键盘扫描模块,下一篇文章再讲消抖模块。
 
二、矩阵键盘原理
使用矩阵键盘可节省大量I/0口,按键越多,优势越明显。
矩阵键盘原理示意图如下:
1. 键盘的工作原理:
按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。
行线(row)通过上拉电阻接到+3.3V电源上。
无按键按下时,行线(row)处于高电平的状态,而当有按键按下时,
行线(row)电平由此行线(col)相连的列线电平决定。
2.列扫描确定矩阵键盘按键位置。
第一步, 使行线(row[3:0])为FPGA的输入线(input),列线(col[3:0])为输出线(output),让列线(col[3:0]) 按照足够快的频率循环扫描输出,这段程序如下图。
第二步,列扫描
将上一步产生的列线(col[3:0])扫描,输入进矩阵键盘,
让其不断的循环扫描四列,即从第一列开始逐行的拉低各列,无论拉低哪一列其他三列都为高电平。
第三步,确定按键位置
当某一个按键按下时,行线(row)的某一行被拉低,而列线(col[3:0])在进行快速的扫描,当某一列检测到低电平的时候,就可以确定按键所在位置。
举个例子:
“5”键的检测
“5”没有被按下的时候,行线全为高阻,row[3:0] = 4’b1111 ;
当扫描列线扫描到第二列时(col[3:0]=4’b1101),若有“5”键被按下,
此时row[3:0]= 4’b1101 ;即可确定按键的位置。
第四步,译码
从寄存器中找到行值和列 值并把其合并,得到按键值,对此按键值进行编码,按照从第一行第一个一直到第四行第四个逐行进行编码,编码值从“0000” 至“1111” , 再进行译码。
译码程序如下:
其中keynum的最高位是按键有无按下的标志位。
下面为源程序:
|