请大神相助,实在不知如何做到,凭空我也想不出来啊,我只能明白如何用用C语言实现,但老师要求是汇编,网上找了一圈没有,我这水平实在有限,坐着想上几天也出不来的啊,上几周已饱受实验课的折磨,实在是有心无力了,希望有懂的人能指点指点
实验六、键盘扫描及其应用 要求 2、掌握本实验中键值编码与显示结果的关系。 3、当多键同时按下时,其优先级如何确定。 4、实现键盘功能0----F排列的行列颠倒。 5、实现按特定功能键分别显示PASS及Err 按照前几周实验看,只需在参考程序上改动就好了 三、参考程序 OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接164时钟位) DAT164 equ 0e102h ; 段控制口(接164数据位) IN equ 0e103h ; 键盘读入口 ORG 0000H LJMP STAR ORG 0030H STAR: mov sp,#80h MOV R0,#7FH ;清零00H--7FH CLR A STAR1: MOV @R0,A DJNZ R0,STAR1 WAIT: MOV DPTR,#0E100H ;8155初始化 MOV A,#03H MOVX @DPTR,A MOV 38H,#3fH MOV 39H,#06H MOV 3AH,#5bH MOV 3BH,#4fH MOV 3CH,#66H MOV 3DH,#6dH WAIT1: LCALL GETKEY ;调键值显示 LCALL MLOOP4 ;通过8155C口得到被按下键行信号 Jnb 01h, WAIT1 ;无键按下则跳转 LCALL KEY1 MOV 38H,39H MOV 39H,3AH MOV 3AH,3BH MOV 3BH,3CH MOV 3CH,3DH MOV A,R7 ANL A,#0FH MOV DPTR,#TAB1 MOVC A,@A+DPTR MOV 3DH,A SJMP WAIT1 ;========================================================================== TAB1: Q0124: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ;?.[Ofm}. Q012C: DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H ;ow|9^yq TAB2: DB 0CH, 08H, 04H, 00H, 0DH, 09H, 05H, 01H ;........ Q013C: DB 0EH, 0AH, 06H, 02H, 0FH, 0BH, 07H, 03H ;........ Q0144: DB 10H, 11H, 12H, 13H, 14H, 15H, 16H ;....... ;========================================================================== ; ;键值显示 ; GETKEY: MOV 30H,#20H ;初始显示数据定位 MOV 3EH,#00H ;初始偏移量定位 GETKEY1: MOV A,3EH SUBB A,#06H JNC GOON2 ;显示已满六位 MOV DPTR,#0E101H ; 关LED显示 CLR A MOVX @DPTR,A MOV A,#38H ;38H为显示缓冲首地址 ADD A,3EH ;3EH为地址偏移量 MOV R0,A MOV A,@R0 MOV 31H,A MOV 3FH,#00H GETKEY2: MOV A,3FH clr c SUBB A,#08H JNC GOON1 ;移位已达到八次 MOV A,31H MOV DPTR,#0E102H JNB ACC.7,KLOOP movx a,@dptr orl a,#01h anl a,#0fdh SJMP KLOOP1 ;;========================================== KLOOP: movx a,@dptr anl a,#0fch KLOOP1: MOVX @DPTR,A NOP MOVX A,@DPTR ORL A,#02H MOVX @DPTR,A NOP movx a,@dptr ANL A,#0FDH MOVX @DPTR,A MOV A,31H rl a MOV 31H,A INC 3FH SJMP GETKEY2 ;;========================================== GOON1: MOV DPTR,#0E101H MOV A,30H MOVX @DPTR,A RR A MOV 30H,A MOV R7,#01H LCALL MLOOP INC 3EH SJMP GETKEY1 GOON2: RET ;;========================================== MLOOP: MOV 35H,R7 ;延时 MLOOP1: MOV 36H ,#64H ; MLOOP2: DJNZ 36H,MLOOP2 DJNZ 35H,MLOOP1 MLOOP3: RET ;========================================================================== MLOOP4: ;查询是否有键按下 MOV DPTR,#0E101H ;关显示 ,同时将键盘列置零 CLR A CLR 01H MOVX @DPTR,A MOV DPTR,#0E103H MOVX A,@DPTR CPL A ANL A,#0FH jz s1 setb 01h s1: RET ;========================================================================== ;键盘扫描 KEY1: MOV 33H,#05H ;键盘列数 0--5 MOV 32H,#20H ;键盘列扫描初值 KEY2: MOV A,32H CPL A MOV DPTR,#0E101H MOVX @DPTR,A MOV A,32H RR A MOV 32H,A ;为下次列扫描做准备 MOV DPTR,#0E103H MOVX A,@DPTR ;读行信号 CPL A ANL A,#0FH jnz KEYDIS mov A,33H JZ S3 dec 33h sjmp key2 KEYDIS: MOV 34H,A MOV A,33H RL A ;键值=(列数*4+行数)--查表 RL A MOV 33H,A MOV A,34H JNB ACC.1,TESTKEY INC 33H SJMP TESTKEY2 TESTKEY: JNB ACC.2,TESTKEY1 INC 33H INC 33H SJMP TESTKEY2 TESTKEY1: JNB ACC.3,TESTKEY2 MOV A,#03H ADD A,33H MOV 33H,A TESTKEY2: MOV DPTR,#0E101H ;按键释放查询 CLR A MOVX @DPTR,A TESTKEY3: MOV R7,#9AH LCALL MLOOP LCALL MLOOP4 JB 01H, TESTKEY3 MOV A,33H MOV DPTR,#TAB2 MOVC A,@A+DPTR MOV R7,A CLR 01H S3: RET ;========================================================================== TESTKEY4: DB 22H ;" ;========================================================================== TESTKEY5: MOV R7,#0FFH RET ;========================================================================== END
|