📄 key_led.asm
字号:
;FILENAME:KEY_LED.ASM
;内容:小键盘按键识别数码管移位显示
DELAY MACRO N1,N2 ;延时
MOV AH,86H
MOV CX,N1
MOV DX,N2
INT 15H
ENDM
DATA SEGMENT
MESG DB 'READY .... ',0DH,0AH,'$'
TAB1 DW 17FH,1BFH,1DFH,1EFH,1FEH ;0~4键值
DW 1FDH,1FBH,1F7H,27FH,2BFH ;5~9键值
TAB2 DB 3FH,06H,5BH,4FH,66H ;0~4字形码
DB 6DH,7DH,07H,7FH,6FH ;5~9字形码
ORIGIN DB 1
BUF DB 0,0,0,0,0,0,? ;显示缓冲区
LINE DB 11111110B ;行扫描初值
A_8255 EQU 220H ;8255 A口地址
B_8255 EQU 221H ;8255 B口地址
CON_8255 EQU 223H ;8255控制口地址
LED_S EQU 201H ;数码管段选口地址
LED_B EQU 200H ;数码管位选口地址
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AH,9
MOV DX,OFFSET MESG
INT 21H
CALL I8255 ;8255初始化
DISP: CALL DISPLAY ;扫描显示6位数
MOV DX,A_8255
MOV AL,0
OUT DX,AL ;0?A口
MOV DX,B_8255
IN AL,DX ;读B口
AND AL,03H ;列值?AL;
CMP AL, 03H
JE DISP ;无键闭合,转
DELAY 1,3880H ;有键闭合,延时80ms
LAST1: MOV DX,A_8255 ;以下逐行扫描
MOV AL,LINE
OUT DX, AL ;行扫描值?A口
MOV DX,B_8255
IN AL,DX ;读B口,列值?AL
SHR AL, 1
JNC OK1 ;PB0列线为0,转OK1
SHR AL,1
JNC OK2 ;PB1列线为0,转OK2
ROL LINE, 1 ;形成下一个行扫描值
JC LAST1
JMP DISP ;非法键入,转显示
OK1: MOV AH, 2 ;列值2?AH
JMP NEXT
OK2: MOV AH, 1 ;列值1?AH
NEXT: MOV AL, LINE ;行值?AL
CMP AX, 2F7H ;AX=F键的键值?
JE EXIT ;是F键闭合,转退出
MOV SI, OFFSET TAB1
MOV DI, OFFSET TAB2
MOV CX, 10
AGAIN: CMP AX, [SI] ;查键值表
JE OK
ADD SI, 2
INC DI
LOOP AGAIN
JMP DISP ;非法键入,转显示
OK: MOV AL, [DI] ;取字形码
MOV BUF + 6,AL ;送BUF+6单元
MOV SI, OFFSET BUF + 1
MOV DI, OFFSET BUF
MOV CX, 6 ;BUF+1~BUF+6单元
CLD ;6位字形码
REP MOVSB ;上移1个单元
JMP DISP
EXIT: MOV AH, 4CH
INT 21H
DISPLAY PROC ;扫描显示6位数
MOV BX, OFFSET BUF
LAST2: MOV AL, [BX]
MOV DX,LED_S
OUT DX, AL ;输出字形码
MOV AL, ORIGIN
MOV DX, LED_B
OUT DX, AL ;定位显示
DELAY 0,1000 ;延时1ms
INC BX
SAL ORIGIN, 1
TEST ORIGIN, 40H
JZ LAST2
MOV ORIGIN , 1
RET
DISPLAY ENDP
I8255 PROC
MOV DX,CON_8255 ;预置
MOV AL, 10000010B ;A口方式0输出
OUT DX,AL ;B口方式0输入
RET
I8255 ENDP
CODE ENDS
END BEG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -