8088单板机监控程序解读(四) 分析监控程序的按键扫描代码8088kit用户手册资源-CSDN下载监控程序的按键扫描代码位于SCAN1函数源码第 1107-1180 行采用动态扫描方式同时驱动 6 位数码管显示和检测 32 个按键。硬件基础根据手册和原理图第 34 页按键和数码管的硬件连接端口地址功能PORT10001H数码管位选选择哪一位点亮同时用于键盘列扫描输出PORT20002H数码管段选显示什么字符输出到 7 段数码管PORT00100H键盘行输入读取哪一行按键被按下bit7 也用于 UART RXD键盘矩阵4 列 × 8 行 32 个按键但实际只用了部分对应 KEYTAB 表SCAN1 函数完整源码分析1107 C616 B300 MOV BL,0 ; BL 列计数器0-3 1108 C618 B701 MOV BH,1 ; BH 列扫描掩码初始 0000 0001B 1109 C61A B4FF MOV AH,-1 ; AH 返回值-1 表示无按键 1110 C61C B108 MOV CL,8 ; CL 总列数4列×2实际是 8 次循环外层循环扫描 4 列1113 C61E KCOL: 1114 C61E 8AC7 MOV AL,BH ; 取当前列掩码 1115 C620 F6D0 NOT AL ; 取反因为列选可能是低电平有效 1116 C622 E601 OUT PORT1,AL ; 输出到位选端口选中当前列关键这里复用了数码管的位选信号作为键盘的列扫描输出。当某一位为低电平时该列被选中按键的行线可以读出。显示当前列的数码管内容1120 C624 8A04 MOV AL,[SI] ; 从显示缓冲区读取该位的段码 1121 C626 E602 OUT PORT2,AL ; 输出到段选端口显示字符 1123 C628 247F AND AL,7FH ; 屏蔽小数点位位7 1124 C62A 3C06 CMP AL,6 ; 检查是否是 - 符号段码 06H 1125 C62C 7504 JNZ SKIP10 1126 C62E B503 MOV CH,3 ; 如果是 -短延时 3 1127 C630 EB02 JMP DELAY1 1128 C632 B50A SKIP10: MOV CH,10 ; 否则延时 10 1129 C634 FECD DELAY1: DEC CH 1130 C636 75FC JNZ DELAY1这段是显示延时让数码管点亮一段时间保证亮度。不同字符延时不同-符号笔画少亮度高所以延时短。关闭显示消隐1137 C638 B000 MOV AL,0 ; 熄灭所有段 1138 C63A E602 OUT PORT2,AL关闭显示是为了避免在按键扫描时产生鬼影。等待显示稳定1141 C63C B51E MOV CH,30 ; 延时 30 1142 C63E FECD DELAY3: DEC CH 1143 C640 75FC JNZ DELAY3内层循环扫描当前列的 8 行1148 C642 B506 MOV CH,6 ; 扫描 6 行实际只用了 6 行 1149 C644 BA0001 MOV DX,PORT0 ; 读行输入端口 1150 C647 EC IN AL,DX 1151 C648 DD08 KROW: RCR AL,1 ; 循环右移一位检查最低位 1152 C64A 7202 JC NOKEY ; 如果该位为 1无按键跳转 1153 C64C 8AE3 MOV AH,BL ; 有按键保存当前列号到 AH 1154 C64E FEC3 NOKEY: INC BL ; BL行号递增 1155 C650 FECD DEC CH ; 行计数器减 1 1156 C652 75F4 JNZ KROW ; 继续扫描下一行按键编码最终AH 列号0-3×8 行号0-7范围 0-31。切换到下一列1162 C654 DD07 ROL BH,1 ; 列掩码左移切换到下一列0001→0010→0100→1000 1163 C656 46 INC SI ; 显示缓冲区指针后移指向下一位 1164 C657 FEC9 DEC CL ; 列计数器减 1 1165 C659 75C3 JNZ KCOL ; 4 列未扫完继续检查串口数据1170 C65B BA0001 MOV DX,PORT0 1171 C65E EC IN AL,DX 1172 C65F A880 TEST AL,80H ; 测试 RXD 位bit7 1173 C661 7502 JNZ no_serial ; 为高空闲无串口数据 1174 C663 B424 MOV AH,36 ; 有串口数据返回特殊扫描码 36 1175 C665 90 no_serial: NOP 1176 C666 C3 RET返回AH 0-35有按键返回按键扫描码AH 36有串口数据AH 255 (FFH)无按键扫描时序图循环 4 次每列一次 ┌─────────────────────────────────────────────────────────┐ │ 选中列 N输出到 PORT1 │ │ 显示该列对应位的数码管输出段码到 PORT2 │ │ 延时保持显示 │ │ 关闭显示PORT20 │ │ 延时消隐 │ │ 循环 6-8 次每行一次 │ │ 读取 PORT0 │ │ 测试该行是否有按键按下 │ └─────────────────────────────────────────────────────────┘ 切换到下一列SI显示缓冲区指针后移按键扫描码到内部码的转换扫描得到AH0-35后主程序通过查表KEYTAB转换为内部功能码243 COD4 BE69CA MOV SI,KEYTAB ; KEYTAB 表地址 244 COD7 8AC4 MOV AL,AH ; 扫描码 245 COD9 B400 MOV AH,0 246 COD8 03F0 ADD SI,AX ; SI KEYTAB 扫描码 247 CODD 2E SEG CS 248 CODE 8A04 MOV AL,[SI] ; 读取内部码KEYTAB 表源码第 1985-2022 行定义了每个按键对应的功能码例如扫描码 0 →10HIP 键扫描码 1 →11HREG 键扫描码 2 →12HDATA 键扫描码 3 →13HADDR 键...设计特点总结特点说明时分复用数码管显示和键盘扫描共用同一套硬件通过时间片分离动态扫描6 位数码管轮流点亮利用视觉暂留效果矩阵扫描4 列 × 8 行矩阵键盘节省 I/O 引脚消隐处理切换列时先关闭显示避免鬼影串口检测键盘扫描同时也检测 UART 数据实现“伪中断”式串口接收返回值设计AH255 无按键AH0-35 有按键AH36 有串口数据这是一个非常经典的嵌入式系统键盘/显示扫描设计充分利用了 8088 的 I/O 端口硬件简洁但功能完整。