散转指令求助
请问各位:散转指令JMP @A+DPTR A中的值只能为偶数而不能为奇数,请问着这段程序中(红色部分)是怎样解决这个问题的 ,请各位指点
; 4*4行列扫描查键子程序 KEYWORK: MOV P1,#0FFH ; 置P1口为输入状态 CLR P1.0 ;扫描第一行(第一行为0) MOV A,P1 ;读入P1口值 ANL A,#0F0H ;低四位为0 CJNE A,#0F0H,KEYCON ;高四位不为全1(有键按下)转KEYCOON SETB P1.0 ; 扫描第二行(第二行为0) CLR P1.1 ; MOV A,P1 ; 读入P1口值 ANL A,#0F0H ; 低四位为0 CJNE A,#0F0H,KEYCON ; 高四位不为全1(有键按下)转KEYCOON SETB P1.1 ; 扫描第三行(第三行为0) CLR P1.2 ; MOV A,P1 ; 读入P1口值 ANL A,#0F0H ; 低四位为0 CJNE A,#0F0H,KEYCON ; 高四位不为全1(有键按下)转KEYCOON SETB P1.2 ; 扫描第四行(第四行为0) CLR P1.3 ; MOV A,P1 ; 读入P1口值 ANL A,#0F0H ; 低四位为0 CJNE A,#0F0H,KEYCON ; 高四位不为全1(有键按下)转KEYCOON SETB P1.3 ;结束行扫描 RET ;子程序返回 KEYCON: LCALL DL10MS ;消抖处理 MOV A,P1 ;再读入P1口值 ANL A,#0F0H ; 低四位为0 CJNE A,#0F0H,KEYCHE ; 高四位不为全1,确有键按下,转KEYCHE KEYOUT: RET ;干扰,子程序返回 KEYCHE: MOV A,P1 ;读P1口值 MOV KEYWORD,A ;放入23H暂存 CJLOOP: LCALL DISPLAY ;调显示子程序 MOV A,P1 ;读P1口值 ANL A,#0F0H ;低四位为0 CJNE A,#0F0H,CJLOOP ;高四位为全1(键还按着),转CJLOOP等待释放 MOV R7,#00H ;键释放,置R7初值为#00H(查表次数) MOV DPTR,#KEYTAB ;取键值表首址 CHEKEYLOOP: MOV A,R7 ;查表次数入A MOVC A,@A+DPTR ;查表 XRL A,KEYWORD ;查表值与P1口读入值比较 JZ KEYOK ;为0(相等)转KEYOK INC R7 ;不等,查表次数加1 CJNE R7,#10H,CHEKEYLOOP ;查表次数不超过16次转CHEKEYLOOP再查 RET ;16次到,退出 ; KEYOK: MOV A,R7 ;查表次数入A(即键号值) MOV B,A ; 放入B(键号乘3处理JMP 3字节指令) RL A ; 左移(键号乘3处理JMP 3字节指令 ADD A,B ; 相加(键号乘3处理JMP 3字节指令 MOV DPTR,#KEYFUNTAB ;取键功能散转表首址 JMP @A+DPTR ;查表 KEYFUNTAB: LJMP KEYFUN00 ; 键功能散转表。跳至0号键功能程序 LJMP KEYFUN01 ; 跳至01号键功能程序 LJMP KEYFUN02 ; 跳至02号键功能程序 LJMP KEYFUN03 LJMP KEYFUN04 LJMP KEYFUN05 LJMP KEYFUN06 LJMP KEYFUN07 LJMP KEYFUN08 LJMP KEYFUN09 LJMP KEYFUN10 LJMP KEYFUN11 LJMP KEYFUN12 LJMP KEYFUN13 LJMP KEYFUN14 LJMP KEYFUN15 ; 跳至15号键功能程序 RET ;散转出错返回 |
|