新手求5个按键控制4位数码管的汇编程序和原理图!

2019-07-18 13:34发布

   ORG  0000H
  lJMP START
  ORG  0030H
START:         MOV  30H,#00H ;第一位LED数存放30H
  MOV  31H,#00H ;第二位LED数存放31H
  MOV  32H,#00H ;第三位LED数存放32H
                MOV             33H,#00H        ;第四位LED数存放33H
  
START1: LCALL DISP
  JNB  P3.0,FUN0 ;按键1按下,转键1处理子程序
  JNB  P3.1,FUN1 ;按键2按下,转键2处理子程序
         JNB  P3.2,FUN2 ;按键3按下,转键3处理子程序
  JNB  P3.3,FUN3 ;按键4按下,转键4处理子程序
                JNB  P3.4,FUN3 ;按键5按下,转键5处理子程序
  JNB  F0,START1 ;无按键按下,标志位为0,重判
     
FUN0: LCALL DL10MS                  ;键1按下,开始处理。调用延时20MS子程序
  JB  P3.0,START1 ;返回再判,防抖
  LCALL DISP          ;显示
  JNB  P3.0,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放
  SETB F0   ;曾经有按键按下,标志位置1 
  LCALL FUN00          ;调用按键1功能子程序
  AJMP START1          ;跳转判定按键状态
FUN1: LCALL DL10MS                   ;延时10MS,防抖
  JB  P3.1,START1 ;再判
  LCALL DISP           ;显示。三字节指令
   JNB  P3.1,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放。这样可使按下键时,LED不熄灭。
  SETB F0   ;曾经有键按下,标志位置1
  LCALL FUN11          ;调用按键2功能子程序
  AJMP START1           ;跳转判定按键状态
FUN2: LCALL DL10MS                  ;延时10MS
  JB  P3.2,START1 ;再判
  LCALL DISP          ;显示。三字节指令
  JNB  P3.2,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放。这样可使按下键时,LED不熄灭。
  SETB F0   ;曾经有键按下,标志位置1
  LCALL FUN22          ;调用按键3功能子程序
  AJMP START1          ;跳转判定按键状态
FUN3: LCALL DL10MS                  ;延时10MS
  JB  P3.3,START1 ;再判
  LCALL DISP           ;显示 。三字节指令
  JNB  P3.3,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放。这样可使按下键时,LED不熄灭。
  SETB F0   ;曾经有键按下,标志位置1
  LJMP START          ;转回重新开始
FUN4: LCALL DL10MS                  ;延时10MS
  JB  P3.4,START1 ;再判
  LCALL DISP           ;显示 。三字节指令
  JNB  P3.4,$-3 ;等待释放,键未释放,跳至上一条,继续显示并等待键释放。这样可使按下键时,LED不熄灭。
  SETB F0   ;曾经有键按下,标志位置1
  LJMP START          ;转回重新开始
FUN00: INC  30H   ;30H内数加1
  MOV  A,30H  ;30H内数送A
  CJNE A,#0AH,OUT         ;30H内数未到0AH,返回判定按键状态。
  MOV  30H,#00H ;30H数加到0AH,清30H
  CLR  F0  ;标志位置0
  RET    ;返回调用
FUN11: INC  31H  
  MOV  A,31H
  CJNE A,#0AH,OUT
  MOV  31H,#00H
  CLR  F0
  RET
FUN22: INC  32H
  MOV  A,32H
  CJNE A,#0AH,OUT
  MOV  32H,#00H
  CLR  F0
                RET
FUN33: INC  33H  
  MOV  A,33H
  CJNE A,#0AH,OUT
  MOV  33H,#00H
  CLR  F0
OUT: RET

DISP:
  MOV  A,30H  ;第一位数送A
  MOV  DPTR,#TAB ;码表首地址
  MOVC  A,@A+DPTR ;取字形码送A
  MOV  P1,A  ;字形码送P1口
  SETB  P2.4  ;开第一位LED
  ACALL  DL1MS  ;延时
  CLR  P2.4  ;关第一位,防止鬼影
  
  MOV  A,31H  ;第二位数送A
  MOV  DPTR,#TAB ;码表首地址
  MOVC  A,@A+DPTR ;取字形码送A
  MOV  P1,A  ;字形码送P1口
  SETB  P2.5  ;开第二位LED
  ACALL  DL1MS  ;延时
  CLR  P2.5  ;关第二位,防止鬼影
  MOV  A,32H  ;第三位数送A
  MOV  DPTR,#TAB ;码表首地址
  MOVC  A,@A+DPTR ;取字形码送A
  MOV  P1,A  ;字形码送P1口
  SETB  P2.6  ;开第三位LED
  ACALL  DL1MS  ;延时
  CLR  P2.6  ;关第三位,防止鬼影
               
                MOV  A,33H  ;第四位数送A
  MOV  DPTR,#TAB ;码表首地址
  MOVC  A,@A+DPTR ;取字形码送A
  MOV  P1,A  ;字形码送P1口
  SETB  P2.7  ;开第四位LED
  ACALL  DL1MS  ;延时
  CLR  P2.7  ;关第四位,防止鬼影  
  
  RET   ;返回调用
DL1MS:         MOV  R2,#2uj
  MOV  R1,#256  ;二字节指令
  DJNZ R1,$   ;二字节指令
  DJNZ R2,$-4   ;R2不为0,转上2条指令
  RET
DL10MS:   MOV  R3,#10
  LCALL DL1MS   ;三字节指令
  DJNZ R3,$-3   ;R3不为0,转上一条指令
  RET
;共阳8段LED
TAB: DB  0C0H,0F9H,0A4H,0B0H,099H ;"0"~"4"
        DB  092H,082H,0F8H,080H,090H ;"5"~"9"
      
  END


求帮忙看下这个为什么不行!菜鸟不懂啊
QQ截图20121127110428.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。