📄 t8.asm
字号:
NAME t8 ;8255键盘实验
PA EQU 0CFA0H
PB EQU PA+1
PC0 EQU PB+1
PCTL EQU PC0+1
CSEG AT 4000H
LJMP START
CSEG AT 4100H
START: MOV 42H,#0FFH ;42H中放显示的字符码,初值为0FFH
STA1: MOV DPTR,#PCTL ;设置控制字,ABC口工作于方式0
;AC口输出而B口用于输入
MOV A,#82H
MOVX @DPTR,A
LINE: MOV DPTR,#PC0 ;将字符码从C口输出显示
MOV A,42H
CPL A
MOVX @DPTR,A
CLR A
MOV DPTR,#PA ;从A口输出全零到键盘的列线
MOVX @DPTR,A
MOV DPTR,#PB ;从B口读入键盘行线值
MOVX A,@DPTR
MOV 40H,A ;行线值存于40H中
CPL A ;取反后如为全零
;表示没有键闭合,继续扫描
JZ LINE
MOV R7,#10H ;有键按下,延时10MS去抖动
DL0: MOV R6,#0FFH
DL1: DJNZ R6,DL1
DJNZ R7,DL0
MOV DPTR,#PCTL ;重置控制字,让A为输入,BC为输出
MOV A,#90H
MOVX @DPTR,A
MOV A,40H
MOV DPTR,#PB ;刚才读入的行线值取出从B口送出
MOVX @DPTR,A
MOV DPTR,#PA ;从A口读入列线值
MOVX A,@DPTR
MOV 41H,A ;列线值存于41H中
CPL A ;取反后如为全零
JZ STA1 ;表示没有键按下
MOV DPTR,#TABLE ;TABLE表首地址送DPTR
MOV R7,#18H ;R7中置计数值16
MOV R6,#00H ;R6中放偏移量初值
TT: MOVX A,@DPTR ;从表中取键码前半段字节,行线值与实
CJNE A,40H,NN1 ;际输入的行线值相等吗?不等转NN1
INC DPTR ;相等,指针指向后半字节,即列线值
MOVX A,@DPTR ;列线值与实际输入的列线值
CJNE A,41H,NN2 ;相等吗?不等转NN2
MOV DPTR,#CHAR ;相等,CHAR表基址和R6中的偏移量
MOV A,R6 ;取出相应的字符码
MOVC A,@A+DPTR
MOV 42H,A ;字符码存于42H
BBB: MOV DPTR,#PCTL ;重置控制字,让AC为输出,B为输入
MOV A,#82H
MOVX @DPTR,A
AAA: MOV A,42H ;将字符码从C口送到二极管显示
MOV DPTR,#PC0
CPL A
MOVX @DPTR,A
JMP STA1 ;转START
NN1: INC DPTR ;指针指向后半字节即列线值
NN2: INC DPTR ;指针指向下一键码前半字节即行线值
INC R6 ;CHAR表偏移量加一
DJNZ R7,TT ;计数值减一,不为零则转TT继续查找
JMP BBB
TABLE: DW 0FE06H,0FD06H,0FB06H,0F706H,0EF06H,0DF06H,0BF06H,07F06H ;TABLE为键值表,每个键位占
DW 0FE05H,0FD05H,0FB05H,0F705H,0EF05H,0DF05H,0BF05H,07F05H ;两个字节,第一个字节为行
DW 0FE03H,0FD03H,0FB03H,0F703H,0EF03H,0DF03H,0BF03H,07F03H ;线值,第二个为列线值
CHAR: DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ;字符码表
DB 0AH,0BH,0CH,0DH,0EH,0FH,10H,11H,12H,13H
DB 14H,15H,16H,17H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -