| 散转指令求助 
 
 | 请问各位:散转指令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                   ;散转出错返回
 | 
 |