8255扫描键盘、显示程序 利用8255可编程并行口做一个扫描键盘实验, 把按键输入的键码,显示在由8279控制的七段数码管上。 8255PA口做键盘输入线,PB口作扫描线。 D8255 EQU 8506H ;8255状态/数据口地址 D8255A EQU 8500H ;8255 PA口地址 D8255B EQU 8502H ;8255 PB口地址 Z8279 EQU 8701H ;8279状态口地址 D8279 EQU 8700H ;8279数据口地址 DISPTR EQU 08H ;当前显示位置 KEYVAL EQU 09H ;读到的键码 ORG 0000H LJMP START ORG 0040H MAIN: MOV SP,#60H LCALL DELAY ;延时 MOV DISPTR,#30H ;显示缓冲区头指针 MOV DPTR,#D8255 MOV A,#90H ;置8255状态 ;方式0,PB,PC口输出,PA口输入 MOVX @DPTR,A MOV DPTR,#Z8279 ;置8279命令字 MOV A,#0D3H MOVX @DPTR,A ;清LED显示 MOV A,#00H MOVX @DPTR,A MOV A,#38H MOVX @DPTR,A MOV A,#0D1H KB_DIS: LCALL RD_KB ;读键盘 MOV A,#0FFH CJNE A,KEYVAL,DISBUF ;判读到键 SJMP KB_DIS ;没有则继续读键 DISBUF: LCALL DISP ;把键移入显存 LCALL DELAY ;延时消抖 LCALL DELAY SJMP KB_DIS DISP: ;显存依次前移 MOV R1,#31H ;在最后加入新键值 MOVE: MOV A,@R1 DEC R1 MOV @R1,A INC R1 INC R1 CJNE R1,#38H,MOVE MOV 37H,KEYVAL MOV KEYVAL,#0FFH MOV DPTR,#Z8279 MOV A,#90H MOVX @DPTR,A MOV R0,#08H MOV R1,#30H MOV DPTR,#D8279 LP: MOV A,@R1 MOVX @DPTR,A INC R1 DJNZ R0,LP RET RD_KB: ;键盘扫描 MOV A,#02H ;扫描第一行 MOV DPTR,#D8255B MOVX @DPTR,A MOV DPTR,#D8255A MOVX A,@DPTR MOV R1,#00H CJNE A,#0FFH,KEYCAL ;判键是否按下 MOV A,#01H ;扫描第二行 MOV DPTR,#D8255B MOVX @DPTR,A MOV DPTR,#D8255A MOVX A,@DPTR MOV R1,#08H CJNE A,#0FFH,KEYCAL SJMP NOKEY ;无键按下 KEYCAL: ;计算键码 MOV R0,#08H SHIFT: RRC A JNC CALC INC R1 DJNZ R0,SHIFT CALC: ;换算显示码 MOV DPTR,#DL_DAT MOV A,R1 MOVC A,@A+DPTR MOV KEYVAL,A RET NOKEY: MOV KEYVAL,#0FFH ;返回无键标志 RET DELAY: MOV R0,#0H ;延时子程序 DELAY1: MOV R1,#0H DJNZ R1,$ DJNZ R0,DELAY1 RET DL_DAT: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0,1,2,3,4,5,6,7 DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8,9,A,B,C,D,E,F END