📄 8155控制led显示和键盘扫描程序.asm
字号:
;键盘和8155的PA和PB口相连,PA口的地址为7F01H
;键盘扫描程序如下:
ORG 0000H
AJMP START
ORG 0100
START: MOV 40H,#70H ;键列扫描码,分别从第一列到第四列
MOV 41H,#0B0H
MOV 42H,#0D0H
MOV 43H,#0E0H
MOV 44H,#71H ;0的键值码
MOV 45H,#0B1H
MOV 46H,#0D1H
MOV 47H,#0E1H
MOV 48H,#72H
MOV 49H,#0B2H
MOV 4AH,#0D2H
MOV 4BH,#0E2H
MOV 4CH,#74H
MOV 4DH,#0B4H
MOV 4EH,#0D4H
MOV 4FH,#0E4H
MOV 50H,#78H
MOV 51H,#0B8H
MOV 52H,#0D8H
MOV 53H,#0E8H
MOV 60H,#00H ;存入键码
MOV R0,#61H
LOK0: MOV A,#0 ;显示缓冲区清0
MOV @R0,A
INC R0
CJNE R0,#65H,LOK0
MOV DPTR,#7F00H
MOV A,#43H ;定义PA,PB口为输出,PC口为输入
MOVX @DPTR,A
LOK1: LCALL DISP
LCALL SAO_MIAO ;调用键盘扫描程序
SJMP LOK1
DISP:
MOV R0,#64H ;显示数码存放在74H~77H(BCD形式)
MOV R4,#7FH ;把显示位码取到R4
LOK2:
MOV A,@R0
MOV 65H,A ;把显示数码取到65H单元
ACALL DISP_A_BIT
ACALL DELAY
MOV A,R4
RR A ;下一位码
MOV R4,A
DEC R0 ;下一显示数码
CJNE R0,#60H,LOK2
RET
DISP_A_BIT:
MOV DPTR,#TABLE
MOV A,65H
MOVC A,@A+DPTR ;取段码:TABLE+x
MOV DPTR,#7F01H ;从PA口输出码值
MOVX @DPTR,A
MOV DPTR,#7F02H ;从PB口输出位码
MOV A,R4
MOVX @DPTR,A
RET
DELAY: MOV 66H,#2
LOK3: MOV 67H,#0FFH
DJNZ 67H,$
DJNZ 66H,LOK3
RET ;延迟(2us*255+2us)*2=1Ms
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,8CH
SAO_MIAO:
ACALL UP_DOWN
JNZ LOK4
TIP1: ACALL DISP
AJMP SAO_MIAO
LOK4: ACALL DISP
ACALL DISP
ACALL UP_DOWN
JNZ LOK5
AJMP TIP1
LOK5: MOV R0,#40H ;设R0为键扫描码入口地址
LOK6: MOV DPTR,#7F02H ;从PB口输出扫描码
MOV A,@R0
MOVX @DPTR,A
MOV DPTR,#7F03H ;从PC口输入行的状态
MOVX A,@DPTR
CPL A
ANL A,#0FH
JZ RIGHT_MOVE
ADD A,@R0
MOV 60H,A
MOV R5,#00H ;键值置初值
MOV R1,#44H ;键码首地址送R1,查键值
CMP: CLR C
MOV A,60H
SUBB A,@R1
JNZ LOK7
LOK8: LCALL DISP
LCALL UP_DOWN
JNZ LOK8
MOV A,R5
MOV 64H,63H
MOV 63H,62H
MOV 62H,61H
MOV 61H,A
RET
LOK7: INC R5
INC R1
AJMP CMP
RIGHT_MOVE:
INC R0 ;修改列扫描码
CJNE R0,#44H,LOK6
AJMP SAO_MIAO
UP_DOWN:
MOV DPTR,#7F02H
MOV A,#00H ;从PB口输出00H
MOVX @DPTR,A
MOV DPTR,#7F03H ;从PC口输入
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -