基于CPLD的矩阵键盘扫描模块设计

时间:2010-12-20来源:网络


键盘扫描触发模块的时序仿真如图3所示。


在图3中,①和②之间的时间为去键盘抖动延时,为了方便仿真,此处把延时时间设定为4个周期,实际使用时,应保持在20~30 ms左右。
2.2 键盘扫描与编码输出模块(keycode)的功能与时序仿真
所谓键盘扫描,就是在键盘的KX端依次送入扫描码,以便定位被按下的键。键盘编码是对键盘扫描值译码得到按下键的按键值。
该模块完成的功能为:在扫描时序控制码SCode[3..0]和CLK的下降沿控制下依次输出4组扫描码“0111”、“1011”、“1101”、“11 10”扫描整个键盘,同时记录键盘的扫描值,将记录的4组扫描值组合成一组16位的键盘扫描值Kscan[15..0],如果Kscan[15..0]小于Kreg[15..O],将Kscan[15..0]保存于Kreg[15..0]中,当所有键放开后,对Kreg[15..0]译码产生按键编码并输出。有一个键按下,16位的键盘扫描值中有且只有一位为O,多键组合按下时,键盘扫描值中就会有多个位为‘0’,因此在键盘扫描过程中,记录最小的键盘扫描值,使得扫描模块不仅能够处理单键,而且可以处理多键组合。具体工作过程说明如下:
当SCode [3..0]=0时,KX=0000,置16位键盘扫描值Kscan[15..0]和Kreg[15..0]为全‘1’,此时无论哪一个键按下,都可使KY不全为‘1’,从而触发扫描模块工作;
当SCode[3..0]=1或2时,KX=0111,此时图1中K12~K15有按下的键时,KY对应位为‘0’,其他位为‘1’,记录KY到键盘扫描码寄存器的Kreg[15..12];
当SCode[3..0]=3或4时,KX=“1011”,此时图1中K08~K11有按下的键时,KY对应位为‘0’,其他位为‘1’,记录KY到键盘扫描码寄存器的Kreg[11..8];
当SCode[3..0]=5或6时,KX=“1101”,此时图1中K04~K07有按下的键时,KY对应位为‘0’,其他位为‘1’,记录KY到键盘扫描码寄存器的Kreg[7..4];
当SCode[3..0]=7或8时,KX=“1110”,此时图l中K00~K03有按下的键时,KY对应位为‘O’,其他位为‘1’,记录KY到键盘扫描码寄存器的Kreg[3..0];
当SCode[3..0]=9和10时,如果Kscan[15..0]各位不全为“1”且Kscan[15..0]Kreg[15..0],将Kscan[15..O]保存到Kreg[15..0];否则对Kreg[15..0]译码产生按键编码并输出;
当SCode[3..0]=11且记录Kscan[15..0]各位为全“1”时,产生键盘复位信号ReSet,结束本次键盘扫描。
键盘扫描与编码输出模块的核心模块VHDL语言实现如下:



键盘扫描与编码输出模块的时序仿真图如图4所示。


2.3 键盘编码输出模块(nread)的功能与时序仿真
在该模块中,KeyrData的最高位KeyData(7)为键盘缓存状态指示位,当KeyData(7)=‘0’时,表示键盘缓存中没有按键码:当KeyData(7)=‘1’时,表示键盘缓存中有按键码等待CPU读取。KeyData[6..0]为按下键的编码。ReSet的下降沿用于将KeyVal[6..0]存入KeyData[6..0],同时将KeyData(7)置成'1'。enKeyOut用于使能矩阵键盘输出,当enKeyOut=‘1’时,允许矩阵键盘输出按键码;当enKeyOut=‘0’时,禁止矩阵键盘输出按键码。ClrKey用于清除键盘缓存状态指示位KeyData(7),当ClrKey=‘0’时,置KeyData(7)为‘O’。
键盘编码输出模块的VHDL语言实现如下:

1 2 3

关键词: CPLD 矩阵 键盘扫描 模块设计

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版