8088kit用户手册资源-CSDN下载
监控程序显示按键扫描程序是8列6行 KEYTAB是37个按键,是否一致?
结论是:不完全一致,但这是由具体硬件设计和软件效率共同决定的合理取舍。
简单来说,KEYTAB中的 37 个表项(扫描码 0-36)定义了一组逻辑键值。而按键扫描程序通过8列 x 6行的矩阵扫描,产生了一个最大 48 个的物理位置空间。37 个逻辑键被“放置”在这 48 个物理位置中的 37 个上,其余位置为空。
下面进行详细分析。
1. 核心矛盾:48个物理位置 vs 37个逻辑键值
扫描程序产生物理位置:
8列 × 6行 = 48个唯一的位置编码。程序只负责检测“哪个位置的按键被按下了”,并返回一个 0-47 之间的数字,这个数字我们称之为物理扫描码。KEYTAB定义逻辑功能:KEYTAB表有 37 个表项,索引从 0 到 36。它将前 37 个物理扫描码(0-36)映射为具体的功能码(如0AH代表数字键 A,10H代表功能键 IP)。物理扫描码 37-47 在表中没有对应项。
这种“物理扫描码多,逻辑键值少”的现象,在电子设计中非常普遍。设计者会为一个最大支持 48 键的矩阵预留资源,但根据实际产品需求,只安装其中的 37 个按键。
2. 物理矩阵分析:8列 x 6行的证据
软件扫描逻辑证实了这是一个8列 x 6行的矩阵。
外层循环 (8列):
MOV CL, 8和DEC CL以及JNZ KCOL构成了一个明确的 8 次循环。ROL BH, 1指令将列扫描位掩码从00000001B逐次左移,遍历00000010B,00000100B... 直到10000000B,正好对应 PC0 到 PC7 八根列线。内层循环 (6行):
MOV CH, 6将内层循环计数器设为 6,表明对每一列,程序会检查 6 行。IN AL, DX读取的行状态寄存器PORT0的低 6 位(D0-D5)对应了行线状态。
所以,SCAN1函数返回的AH寄存器值(我们称之为物理扫描码)的计算方式如下:物理扫描码 = 当前列号 × 6 + 当前行号
由于列号范围是 0-7,行号范围是 0-5,因此物理扫描码的范围是0 到 (7×6 + 5) = 47。
3. 逻辑映射分析:37个按键的真相
KEYTAB表有 37 个表项,但并不意味着只有 37 个按键。KEYTAB负责将物理扫描码转换为逻辑内部码。
映射逻辑:
KEYTAB是一个数组,物理扫描码n直接作为索引,对应的逻辑内部码就是KEYTAB[n]。占用情况:
有效按键:
KEYTAB[0]到KEYTAB[35]都定义了非0xFF的值,表示 36 个有效按键。特殊功能:
KEYTAB[36]被定义为0x40,这个值被系统用作“检测到串口数据”的特殊标志,并非一个物理按键。保留位置:
KEYTAB[4]和KEYTAB[5]的值为0xFF,表示在物理扫描码 4 和 5 的位置上没有安装按键,或者是被禁用的预留位置。未使用区域:物理扫描码
37-47对应的 11 个位置,在KEYTAB中没有定义。这进一步说明,这些物理位置在硬件上没有被使用。
4. 不一致背后的设计原因
硬件预留:设计一块支持 48 键的通用键盘电路板,成本几乎相同。但可以根据产品定位,选择只安装 37 个按键(如 32个数字/功能键 + 几个特殊键),这是一种经济高效的设计策略。
简化软件:对软件而言,无论硬件装了 37 个还是 48 个按键,扫描
8x6矩阵的逻辑是固定且最优的。通过一个统一的查询表KEYTAB,软件可以优雅地处理“空洞”(未安装按键的位置,返回0xFF即可忽略)。效率至上:使用
列号 × 6 + 行号生成连续的物理扫描码,再通过KEYTAB直接查表,是 8088 这种简单 CPU 上能实现的最快、最高效的按键处理算法。
总结
扫描程序 (8x6):定义了硬件键盘矩阵的物理能力,可以识别 48 个不同的按键位置。
KEYTAB(37项):定义了当前产品上实际安装的 36 个物理按键 + 1 个特殊功能的逻辑功能。一致性体现在:软件通过
KEYTAB表,完美地将 37 个逻辑键值,映射到了 48 个物理位置中的 37 个位置上。对于没有映射的物理位置,KEYTAB中虽然没有项,但程序逻辑会通过范围判断将其忽略,确保了系统的稳定。
所以,48个物理位置与37个逻辑键值并不矛盾,它们是硬件能力和产品定义之间的一种平衡。这是一个非常经典且高效的嵌入式按键处理方案。