1. 键盘编码结构
普通计算机采用的都是“编码键盘”,“编码键盘”的“编码方式”又分为“第一套”“第二套”和“第三套”。现在PC 机使用的PS/2 键盘都默认采用第二套扫描码集。扫描码有两种不同的类型:通码(make code)和断码(break code)。当一个键被按下或持续按住时,键盘的处理器会将该键的通码发送给主机;而当一个键被释放时,键盘会将该键的断码发送给主机。说得简单一点,“通码”是某按键的“按下事件”,“断码”是某按键的“释放事件”。每个按键被分配了唯一的“通码”和“断码”,如图5.22 所示。
图5.22 按键与通码值
根据键盘按键扫描码的不同,在此可将按键分为如下几类:
第一类按键,通码为1 字节,断码为0xF0+通码形式。如“A”键,其通码为0x1C,断码为0xF0 0x1C。
第二类按键,通码为2 字节0xE0+0xXX 形式,断码为0xE0+0xF0+0xXX 形式。如“right CTRL”键,其通码为0xE0 0x14,断码为0xE0 0xF0 0x14。
第三类特殊按键有两个,“print screen”键通码为0xE0 0x12 0xE0 0x7C,断码为0xE0 0xF0 0x7C 0xE0 0xF0 0x12;“pause”键通码为0x E1 0x14 0x77 0xE1 0xF0 0x14 0xF0 0x77,断码为空。
组合按键的扫描码发送按照按键发生的次序,如以下面顺序按“左SHIFT+A”键:(1)按下“左SHIFT”键,(2)按下“A”键,(3)释放“A”键,(4)释放“左SHIFT”键,那么计算机上接收到的一串数据为0x12 0x1C 0xF0 0x1C 0xF0 0x12。
2. PS/2 协议Verilog 设计实现
根据PS/2 协议的数据通信协议,在PS/2 时钟下降沿时,进行数据的串行传输。因此,要实现PS/2 的数据通信,可以采用状态机设计方法,实现模拟顺序执行操作功能,完成串行数据传输,如【代码5.9】所示。
【代码5.9】PS/2 键盘扫描设计
(www.xing528.com)
【代码5.9】主要由三部分构成。第一部分是从代码第11 行到24 行,采用电平检测方法,实现了对PS/2 时钟下降沿的捕获,即构建了“neg_ps2_clk”信号;第二部分是从第37 行到49 行,采用状态机完成了PS/2 数据传输协议,并完成PS/2 传送数据的正确接收;第三部分是从第54 行到74 行,实现了对键盘通码或断码的识别,将第二部分收到的数据进行了锁存,并完成了按键一次的标志信号的输出。
该示例代码最终可以提供按键扫描码通码的数据输出,即当有某个按键按下时,通过“scan_code”端口能输出相应按键的通码,为后续按键功能定义电路设计奠定了基础。例如,如果键盘字母“A”按下时,“scan_code”端口的值将输出为“1C”,通过该值便可以定义字母“A”键的任何功能。
3. PS/2 键盘按键功能应用示例
通过【代码5.9】的时序功能电路设计,能得到任意按键的键值通码,该通码也是区分不同按键的重要参数指标。在实际的应用中,一般不是只要求能识别到某个键被按下,而更为重要的是定义该键的功能,这样才变得有实用价值。例如,可以自己定义键盘任意键的功能,可以让字母“A”键实现对流水灯的状态控制,也可以定义该键按下时输出字母A 的ASCII 码等功能,还可以定义为其他功能。【代码5.10】为将键盘字母按键定义为对应的ASCII 码输出,这样便实现了键盘对PC 机作为输入设备同样的功能,即可以在FPGA 系统中像在PC 机中键盘的使用一样。
【代码5.10】PS/2 键盘字母ASCII 码输出设计
【代码5.10】完成了对键盘的字母键的ASCII 码定义输出,这样就可以将键盘当作普通键盘使用,按下某个字母键时,就能在字符显示设备中对应输出相应的字母符号。除此以外,还可以将键定义为其他功能,如【代码5.11】实现了字母“A”键控制变量“led”右移,字母“S”键控制变量“led”左移。
【代码5.11】自定义按键功能
参考【代码5.10】和【代码5.11】,不难发现,对按键的功能定义,都是通过一个简单的CASE 语句,对扫描通码进行相应定义实现。因此,任何按键,要实现任何功能,只需要参考【代码5.11】根据系统设计需要,自己进行定义即可。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。