DIR: MOV R0,#7EH ;指向缓冲区末地址
MOV A,#FEH ;扫描字,PA5为1,从左至右扫描
LOOP: MOV R2,A ;暂存扫描字
MOV DPTR,#7102H ;指向8155的PB(位选)
MOVX @DPTR,A ;输出位选码
MOV A,@R0 ;读显示缓冲区一字符
MOV DPTR,#PTRN ;指向段数据表首地址
MOVC A,@A+DPTR ;查表,得段数据
MOV DPTR,#7101H ;指向8155的PA口(段选)
MOVX @DPTR,A ;输出段数据
CALL D1MS ;延时1MS
DEC R0 ;调整指针
MOV A,R2 ;读回扫描
CLR C ;清进位标志
RLC A ;扫描字左移
JNC PASS ;结束
AJMP LOOP ;继续显示
PASS: RET ;返回
D1MS: MOV R7,#02H ;延时1ms
DMS: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,DMS
RET
PTRN:
DB 3FH,06H,5BH,4FH,66H ;段数据表,分别表示了0到9,-,0,C和灭
DB 6DH,7DH,07H,7FH,6FH
DB 40H,3FH,39H,00H
KEYI : ACALL KS1 ;调用判断是否有键闭合子程序
JNZ LK1 ;有键闭合转LK1
ACALL DIR ;调用8155动态显示子程序,延时6ms
ACALL KEYI
LK1: ACALL DIR
ACALL DIR ;调用两次显示,延时12ms
ACALL KS1
JNZ LK2
ACALL KEYI
LK2: MOV R2,#0FEH ;涣猩瑁幼畹臀豢?
MOV R4,#00H
LK3: MOV DPTR,#7102H
MOV A,R2
MOVX @DPTR,A ;B口
MOV R6,#05H ;软件延时
DK6: DJNZ R6,DK6
MOV DPTR,#7103H ;C口
MOVX A,@DPTR
JB ACC.0,LONE
MOV A,#00H
AJMP LKP
LONE: JB ACC.1, NEXT ;是第一行键?
MOV A,#06H ;1行有键闭合,首键号6进A
LKP: ADD A,R4 ;键号计算
PUSH ACC ;键号保护入栈
LK4: ACALL DIR ;判键是否已释放
ACALL KS1
JNZ LK3
POP ACC
RET
NEXT: INC R4 ;修改列号
MOV A,R3 ;平判是否已扫描到最后一列
JNB ACC.5, KND
RL A
MOV R3,A
AJMP LK4 ;6列键未扫描完再扫键盘
KND: AJMP KEYI
KS1: MOV DPTR,#7102H ;全0送8155B口
MOV A,#00H
MOVX @DPTR,A
MOV R6,#05H
DS6: DJNZ R6,DS6
MOV DPTR,#7103H ;读8155C口键入状态
MOVX A,@DPTR
CPL A
ANL A,#03H ;屏蔽高6位