📄 keyled1.asm
字号:
;BH-KEY-LED.ASM
DATA SEGMENT
DA55 EQU 318H ;8255 A端口
DB55 EQU 319H ;8255 B端口
CTL EQU 31BH ;8255控制口
OUTBIT EQU 310H ;位选码控制口
OUTSEG EQU 311H ;段码控制口
TABLE DW 0101H,0102H,0104H,0108H,0110H,0120H,0140H,0180H
DW 0201H,0202H,0204H,0208H,0210H,0220H,0240H,0280H
DW 0401H,0402H,0404H,0408H ;键值表
XSM DB 39H,5EH,79H,71H,7CH,77H,6FH,7FH,66H,6DH,7DH,07H,4FH,5BH,06H,3FH ;LED共阴极显示码:CDEFBA9845673210
SHUZHI DB 'C,D,E,F,B,A,9,8,4,5,6,7,3,2,1,0'
CRT DB 'PLEASE INPUT THE NUMBER IN THE SMALL KEYBOARD! ',0AH,0DH,'$'
LEDBUF DB 10 DUP(?) ;显示缓冲区
NUM DB 6 DUP(?) ;显示的数据
COUNT DB ?
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
STA DW 50 DUP(?)
STACK ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET CRT
MOV AH,09
INT 21H
MOV BX,OFFSET LEDBUF
MOV AH,01H ;从左边开始显示
AGAIN: CALL KEY
CALL DISPLAYLED
JMP AGAIN
MOV AX,4C00H ; 返回DOS
INT 21H
RET
MAIN ENDP
DELAY PROC NEAR ;延时子程序
PUSH AX
PUSH CX
MOV AL,0
MOV CX,AX
LOOP $
POP CX
POP AX
RET
DELAY ENDP
DISPLAYLED PROC NEAR
MOV BX,OFFSET LEDBUF
MOV CL,6 ; 共6个八段管
MOV AH,01H ; 从左边开始显示
DLOOP:
MOV DX,OUTBIT
MOV AL,0
OUT DX,AL ; 关所有八段管
MOV AL,[BX]
MOV DX,OUTSEG
OUT DX,AL
MOV AL,AH
MOV DX,OUTBIT
OUT DX,AL ; 显示一位八段管
PUSH AX
MOV AH,1
CALL DELAY
POP AX
SHL AH,1
INC BX
DEC CL
JNZ DLOOP
MOV DX,OUTBIT
MOV AL,0
OUT DX,AL ; 关所有八段管
RET
DISPLAYLED ENDP
KEY PROC NEAR ;出口参数DL; 按键的ASCII码
LP1: MOV AL,82H ;输入方式状态字,8255 A口输出, B口输入
MOV DX,CTL
OUT DX,AL ;设置8255方式控制字
;PA口输出,PB口输入
WAIT1: MOV AL,00
MOV DX,DA55
OUT DX,AL ;PA口输出00
MOV DX,DB55
IN AL,DX ;从PB口获得列值
CMP AL,0FFH
JZ WAIT1 ;没有按键按下,等待
PUSH AX ;保存列值, 列值压栈
PUSH AX
MOV CX,1000H ;延时,去抖动
LP2: LOOP LP2
MOV DX,CTL
MOV AL,90H ;设置8255方式控制字
OUT DX,AL ;PA口输入,PB口输出
MOV DX,DB55
POP AX
OUT DX,AL ;从PB口输出列值
MOV DX,DA55
IN AL,DX ;(AL) IS ROW DATA行值
POP BX
MOV AH,BL ;(AH) IS COL DATA列值
NOT AX
MOV SI,OFFSET TABLE
MOV DI,OFFSET XSM
MOV BP,OFFSET SHUZHI
MOV CX,16 ;共16个键
LP3: CMP AX,[SI] ;CMP (COL,ROW) WITH EVERY WORD 查键值表
JZ LP4 ;IN THE TABLE
DEC CX
JZ LP1 ;查完键值表未查到
ADD SI,2
INC DI
INC BP
JMP LP3
LP4: MOV AL,[DI]
MOV LEDBUF,AL
PUSH DX ;所按键的ASCII码压堆栈保存
MOV AL,82H
MOV DX,CTL
OUT DX,AL ;设置8255方式控制字
;PA口输出,PB口输入
WAIT2: MOV AL,00
MOV DX,DA55
OUT DX,AL ;PA口输出 00
MOV DX,DB55
IN AL,DX ;从PB口读入列值
CMP AL,0FFH
JNZ WAIT2 ;WAIT UNTIL THE KEY IS UP等待按下的键未抬起
POP DX ;DL放按键的ASCII码
RET
KEY ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -