📄 keyboard.asm
字号:
ioport equ 5400h-280h
DATA SEGMENT
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA ENDS
STACK SEGMENT STACK
DW 50 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV DX,ioport+2B1H ;控制端口地址
MOV AL,00000000B ;键盘显示方式命令字 左进显示16个字符
OUT DX,AL
MOV AL,00101010B ;分频基频为100KHz
OUT DX,AL
MOV AL,11010011B ;清除命令
OUT DX,AL
MOV AL,10010000B ;写显示RAM,地址自动加1
OUT DX,AL
;PRES: MOV DX,ioport+2B1H
;MOV AL,10010000B ;写显示RAM,地址自动加1
;OUT DX,AL
MOV CX,6
O: MOV DX,ioport+2B1H
IN AL,DX
TEST AL,1H
JE O ;检测是否有键值输入
MOV DX,ioport+2B0H ;数据端口地址
IN AL,DX ;把键值送入AL
MOV BL,AL
AND AL,38H ;得到hang号
;MOV ,3
SHR AL,1 ;得到行号
SHR AL,1
SHR AL,1
CMP AL,1
JNE NZ ;不是第一行,跳转NZ,判断是否为第零列
MOV AL,BL
AND AL,07H ;得到具体键值
XOR AH,AH ;清0
MOV DX,ioport+2B0H ; ;数据端口
MOV BX,OFFSET TABLE
XLAT ;显示
OUT DX,AL ;循环显示6次
LOOP O ;继续检测键值
NZ: CMP AL,0 ;检查是否为第零列
JNE ISP ;不是第零列也不是第一行,跳转ISP
MOV AL,BL
AND AL,07H ;得到具体键值
XOR AH,AH
ADD AX,08H ;把第一列键值加8,变成第二行键值
MOV DX,ioport+2B0H
MOV BX,OFFSET TABLE
XLAT ;显示
OUT DX,AL ;循环显示6次
LOOP O ;等待键盘输入
ISP: MOV AL,BL
AND AL,07H ;判断是0-7列中的哪一列
CMP AL,02H ;比较是否为第二行
JNE O ;输入为第二行,则继续检测键值
MOV AH,4CH
INT 21H
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -