原创 4位八段数码管的十进制加计数仿真(汇编语言)

2007-11-4 10:33 3803 6 6 分类: MCU/ 嵌入式

本人按照EDN-51实验板的线路,做了个4位八段数码管的十进制加计数仿真实验,程序采用汇编语言编写。此程序在仿真与EDN-51实验板上均通过。注:仿真程序与EDN实验板程序有个地方不一样,这是因为动态扫描的时间不能相同,在仿真上的时间要稍长点,EDN-51实验板上就要短一点,延时子程序STS00中的60H分别是#013H与#003H。仿真图中的数码管位驱动采用74HC04,如按EDN-51板上用想同的PNP三极管驱动,则无法正常显示。程序共分6块,STAR0为数据初始化,STAR1为0-9的数据处,STAR2为计数子程序,STAR3为动态显示子程序,STAR4为按键扫描子程序,最后一个为是延时子程序。由于EDN-51实验板上没装BCD译码器,所以编写程序比较烦琐。


程序如下:


ORG 0000H                               ;地址 0000H
       LJMP STAR0                     ;转 STAR0
ORG 0300H                              ;地址 0300H
STAR0:   CLR 00                      ;位 00 清 0
               MOV P1,#0FFH        ;#0FFH-->P1
               MOV P2,#0FH          ;#0FH-->P2
               MOV P0,#0FFH        ;#0FFH-->P0
               MOV 30H,#0C0H     ;#0C0H-->30H  0-->30H
               MOV 31H,#0C0H     ;#0C0H-->31H  0-->31H
               MOV 32H,#0C0H     ;0C0H-->32H  0-->32H
               MOV 33H,#0C0H     ;#0C0H-->33H  0-->33H
STAR1:   MOV 40H,#0C0H     ;#0C0H-->40H
               MOV 41H,#0F9H      ;#0F9H-->41H
               MOV 42H,#0A4H      ;#0A4H-->42H
               MOV 43H,#0B0H      ;#0B0H-->43H
               MOV 44H,#99H        ;#99H-->44H
               MOV 45H,#92H        ;#92H-->45H
               MOV 46H,#82H        ;#82H-->46H
               MOV 47H,#0F8H      ;#0F8H-->47H
               MOV 48H,#80H        ;#80H-->48H
               MOV 49H,#90H        ;#90H-->49H
               MOV R1,#00H          ;#00H-->R1
               MOV R2,#00H          ;#00H-->R2
               MOV R3,#00H          ;#00H-->R3
               MOV R4,#00H           ;#00H-->R4
               LJMP STAR3             ;转 STAR3
               NOP
STAR2:   INC R1    ;R1+1
U300:      CJNE R1,#00H,U301      ;R1 与 #00H 比较不等则转 U301  
                MOV 30H,40H               ;41H-->30H
                AJMP U3END                ;转 U3END
U301:      CJNE R1,#01H,U302      ;R1 与 #01H 比较不等则转 U302 
               MOV 30H,41H                ;41H-->30H
               AJMP U3END                 ;转 U3END
U302:      CJNE R1,#02H,U303      ;R1 与 #02H 比较不等则转 U303
               MOV 30H,42H                ;42H-->30H
               AJMP U3END                 ;转 U3END
U303:     CJNE R1,#03H,U304       ;R1 与 #03H 比较不等则转 U304
               MOV 30H,43H                 ;43H-->30H
               AJMP U3END                  ;转 U3END
U304:     CJNE R1,#04H,U305       ;R1 与 #04H 比较不等则转 U305  
               MOV 30H,44H                 ;44H-->30H
               AJMP U3END                  ;转 U3END
U305:     CJNE R1,#05H,U306        ;R1 与 #05H 比较不等则转 U306  
               MOV 30H,45H                   ;45H-->30H
               AJMP U3END                   ;转 U3END
U306:     CJNE R1,#06H,U307         ;R1 与 #06H 比较不等则转 U307 
               MOV 30H,46H                  ;46H-->30H
               AJMP U3END                   ; 转 U3END
U307:     CJNE R1,#07H,U308         ;R1 与 #07H 比较不等则转 U308 
               MOV 30H,47H                   ;47H-->30H
               AJMP U3END                    ;转 U3END
U308:     CJNE R1,#08H,U309         ;R1 与 #08H 比较不等则转 U309
               MOV 30H,48H                  ;48H-->30H
               AJMP U3END                   ;转 U3END
U309:     CJNE R1,#09H,U30A        ;R1 与 #09H 比较不等则转 U30A 
               MOV 30H,49H                  ;49H-->30H
               AJMP U3END                   ;转 U3END
U30A:     CJNE R1,#0AH,U310       ;R1 与 #0AH 比较不等则转 U310
U310:      MOV 30H,40H                 ;40H-->30H
               MOV R1,#00H                  ;#00H-->R1
                INC R2                              ;R2+1
               CJNE R2,#00H,U311        ;R2 与 #00H 比较不等则转 U311 
               MOV 31H,40H                  ;40H-->31H
               AJMP U3END                   ;转 U3END
U311:     CJNE R2,#01H,U312         ;R2 与 #01H 比较不等则转 U312
               MOV 31H,41H                   ;41H-->31H
               AJMP U3END                   ;转 U3END
U312:     CJNE R2,#02H,U313         ;R2 与 #02H 比较不等则转 U313
               MOV 31H,42H                  ;42H-->31H
               AJMP U3END                   ;转 U3END
U313:     CJNE R2,#03H,U314         ;R2 与 #03H 比较不等则转 U314
               MOV 31H,43H                  ;43H-->31H
               AJMP U3END                    ;转 U3END
U314:     CJNE R2,#04H,U315          ;R2 与 #04H 比较不等则转 U315
               MOV 31H,44H                   ;44H-->31H
              AJMP U3END                     ;转 U3END
U315:    CJNE R2,#05H,U316           ;R2 与 #05H 比较不等则转 U316
              MOV 31H,45H                    ;45H-->31H
              AJMP U3END                     ;转 U3END
U316:     CJNE R2,#06H,U317          ;R2 与 #06H 比较不等则转 U317
               MOV 31H,46H                    ;46H-->31H
              AJMP U3END                      ;转 U3END
U317:    CJNE R2,#07H,U318            ;R2 与 #07H 比较不等则转 U318
               MOV 31H,47H                    ;47H-->31H
              AJMP U3END                      ;转 U3END
U318:    CJNE R2,#08H,U319            ;R2 与 #08H 比较不等则转 U319
              MOV 31H,48H                      ;48H-->31H
              AJMP U3END                      ;转 U3END
U319:     CJNE R2,#09H,U31A           ;R2 与 #09H 比较不等则转 U31A
              MOV 31H,49H                      ;49H-->31H
              AJMP U3END                       ;转 U3END
U31A:    CJNE R2,#0AH,U320            ;R2 与 #0AH 比较不等则转 U320
U320:     MOV 31H,40H                      ;40H-->31H
              MOV R2,#00H                      ;#00H-->R2
              INC R3                                  ;R3+1
              CJNE R3,#00H,U321            ;R3 与 #00H 比较不等则转 U321 
              MOV 32H,40H                      ;40H-->32H
              AJMP U3END                       ;转 U3END   
U321:     CJNE R3,#01H,U322            ;R3 与 #01H 比较不等则转 U322
               MOV 32H,41H                      ;41H-->32H
               AJMP U3END                       ;转 U3END   
U322:     CJNE R3,#02H,U323             ;R3 与 #02H 比较不等则转 U323
              MOV 32H,42H                        ;42H-->32H
               AJMP U3END                        ;转 U3END   
U323:     CJNE R3,#03H,U324              ;R3 与 #03H 比较不等则转 U324
               MOV 32H,43H                       ;43H-->32H
               AJMP U3END                        ;转 U3END 


U324:      CJNE R3,#04H,U325             ;R3 与 #04H 比较不等则转 U325
               MOV 32H,44H                        ;44H-->32H
               AJMP U3END                         ;转 U3END
U325:     CJNE R3,#05H,U326              ;R3 与 #05H 比较不等则转 U326
               MOV 32H,45H                       ;45H-->32H
               AJMP U3END                        ;转 U3END
U326:     CJNE R3,#06H,U327              ;R3 与 #06H 比较不等则转 U327
               MOV 32H,46H                        ;46H-->32H
               AJMP U3END                        ;转 U3END
U327:     CJNE R3,#07H,U328              ;R3 与 #07H 比较不等则转 U328
               MOV 32H,47H                       ;47H-->32H
               AJMP U3END                        ;转 U3END
U328:     CJNE R3,#08H,U329              ;R3 与 #08H 比较不等则转 U329
               MOV 32H,48H                        ;48H-->32H
               AJMP U3END                         ;转 U3END
U329:     CJNE R3,#09H,U32A              ;R3 与 #09H 比较不等则转 U32A
               MOV 32H,49H                        ;49H-->32H
               AJMP U3END                         ;转 U3END
U32A:     CJNE R3,#0AH,U330             ;R3 与 #0AH 比较不等则转 U330   
U330:      MOV 32H,40H                       ;40H-->32H
                MOV R3,#00H                       ;#00H-->R3
                INC R4                                   ;R4+1
               CJNE R4,#00H,U331              ;R4 与 #00H 比较不等则转 U331
                MOV 33H,40H                      ;40H-->33H
                AJMP U3END                       ;转 U3END
U331:      CJNE R4,#01H,U332             ;R4 与 #01H 比较不等则转 U332
               MOV 33H,41H                       ;41H-->33H
               AJMP U3END                        ;转 U3END
U332:     CJNE R4,#02H,U333              ;R4 与 #02H 比较不等则转 U333
               MOV 33H,42H                       ;42H-->33H
               AJMP U3END                        ;转 U3END
U333:     CJNE R4,#03H,U334              ;R4 与 #03H 比较不等则转 U334
               MOV 33H,43H                        ;43H-->33H
               AJMP U3END                         ;转 U3END
U334:     CJNE R4,#04H,U335               ;R4 与 #04H 比较不等则转 U335
               MOV 33H,44H                        ;44H-->33H
               AJMP U3END                        ;转 U3END
U335:     CJNE R4,#05H,U336              ;R4 与 #05H 比较不等则转 U336
               MOV 33H,45H                       ;45H-->33H
               AJMP U3END                        ;转 U3END
U336:     CJNE R4,#06H,U337              ;R4 与 #06H 比较不等则转 U337
               MOV 33H,46H                       ;46H-->33H
               AJMP U3END                       ;转 U3END
U337:     CJNE R4,#07H,U338             ;R4 与 #07H 比较不等则转 U338
               MOV 33H,47H                      ;47H-->33H
               AJMP U3END                       ;转 U3END 
U338:     CJNE R4,#08H,U339             ;R4 与 #08H 比较不等则转 U339
               MOV 33H,48H                      ;48H-->33H
               AJMP U3END                       ;转 U3END
U339:     CJNE R4,#09H,U33A            ;R4 与 #09H 比较不等则转 U33A
               MOV 33H,49H                      ;49H-->33H
               AJMP U3END                       ;转 U3END
U33A:     CJNE R4,#0AH,U33B           ;R4 与 #0AH 比较不等则转 U33B   
U33B:      MOV 33H,40H                      ;40H-->33H
                MOV R4,#00H                      ;#00H-->R4
U3END:  RET                                        ;子程序调用返回
                NOP
STAR3:   MOV P1,#0FFH                    ;#0FFH-->P1
                MOV P1,#0F7H                    ;#0F7H-->P1
                MOV P0,30H                         ;30H-->P0
                LCALL STAR4                      ;调子程序 STAR4
                LCALL STS00                       ;调延时子程序 STS00
                MOV P1,#0FFH                     ;#0FFH-->P1
                MOV P1,#0FBH                    ;#0FBH-->P1
                MOV P0,31H                         ;31H-->P0
                LCALL STAR4                      ;调子程序 STAR4
                LCALL STS00                       ;调延时子程序 STS00 
                MOV P1,#0FFH                    ;#0FFH-->P1
                MOV P1,#0FDH                    ;#0FDH-->P1
                MOV P0,32H                         ;32H-->P0
                LCALL STAR4                      ;调子程序 STAR4
                LCALL STS00                       ;调延时子程序 STS00    
                MOV P1,#0FFH                    ;#0FFH-->P1
                MOV P1,#0FEH                     ;#0FEH-->P1
                MOV P0,33H                         ;33H-->P0
                LCALL STAR4                       ;调子程序 STAR4
                LCALL STS00                        ;调延时子程序 STS00
                SJMP STAR3                          ;转 STAR3
                NOP
STAR4:   JNB P2.0,ST1                          ;P2.0=0 转 ST1
               CLR 00                                     ;位 00 清 0
               SJMP ST3                                 ;转ST3
ST1:        JNB 00,ST2                              ;位 00=0 转 ST2
               SJMP ST3                                 ;转 ST3
ST2:        LCALL STAR2                         ;调子程序 STAR2
               SETB 00                                    ;位 00 置 1
ST3:        RET                                           ;子程序调用返回
               NOP
ORG 0100H                                            ;地址 0100H
STS00:   MOV 60H,#013H                     ;#013H-->60H  (211)
DE001:   MOV 61H,#0FFH                    ;#0FFH-->61H (255)
DE002:   DJNZ 61H,DE002                    ;61H 减 1 不等于 0 转 DE002
               DJNZ 60H,DE001                    ;60H 减 1 不等于 0 转 DE001
               RET                                          ;子程序调用返回
               NOP
STS01:   MOV 62H,#0D3H                     ;#0D3H-->62H  (211)
DE011:   MOV 63H,#0FFH                     ;#0FFH-->63H (255)
DE012:   DJNZ 63H,DE012                     ;63H 减 1 不等于 0 转 DE012
               DJNZ 62H,DE011                     ;62H 减 1 不等于 0 转 DE011
               RET     ;子程序调用返回
               NOP
STS02:   MOV 64H,#0D3H                     ;#0D3H-->64H  (211)
DE021:   MOV 65H,#0FFH                     ;#0FFH-->65H (255)
DE022:   DJNZ 65H,DE022                     ;65H 减 1 不等于 0 转 DE022
               DJNZ 64H,DE021                     ;64H 减 1 不等于 0 转 DE021
               RET                                           ;子程序调用返回
              NOP
STS03:   MOV 66H,#0D3H                     ;#0D3H-->66H  (211)
DE031:   MOV 67H,#0FFH                     ;#0FFH-->67H (255)
DE032:   DJNZ 67H,DE032                     ;67H 减 1 不等于 0 转 DE032
              DJNZ 66H,DE031                      ;66H 减 1 不等于 0 转 DE031
              RET                                            ;子程序调用返回
              NOP
STS04:   MOV 68H,#0D3H                     ;#0D3H-->68H  (211)
DE041:   MOV 69H,#0FFH                     ;#0FFH-->69H (255)
DE042:   DJNZ 69H,DE042                     ;69H 减 1 不等于 0 转 DE042
               DJNZ 68H,DE041                     ;68H 减 1 不等于 0 转 DE041
              RET                                            ;子程序调用返回
              NOP
STS05:   MOV 6AH,#0D3H                    ;#0D3H-->6AH  (211)
DE051:   MOV 6BH,#0FFH                    ;#0FFH-->6BH (255)
DE052:   DJNZ 6BH,DE052                    ;6BH 减 1 不等于 0 转 DE052
              DJNZ 6AH,DE051                    ;6AH 减 1 不等于 0 转 DE051
              RET                                           ;子程序调用返回
              NOP
STS06:   MOV 6CH,#0D3H                    ;#0D3H-->6CH  (211)
DE061:   MOV 6DH,#0FFH                    ;#0FFH-->6DH (255)
DE062:   DJNZ 6DH,DE062                    ;6DH 减 1 不等于 0 转 DE062
               DJNZ 6CH,DE061                    ;6CH 减 1 不等于 0 转 DE061
               RET                                           ;子程序调用返回
               NOP
STS07:   MOV 6EH,#0D3H                     ;#0D3H-->6EH  (211)
DE071:   MOV 6FH,#0FFH                     ;#0FFH-->6FH (255)
DE072:   DJNZ 6FH,DE072                     ;6FH 减 1 不等于 0 转 DE072
              DJNZ 6EH,DE071                      ;6EH 减 1 不等于 0 转 DE071
              RET                                            ;子程序调用返回
              NOP
STS08:   MOV 70H,#0D3H                     ;#0D3H-->70H  (211)
DE081:   MOV 71H,#0FFH                     ;#0FFH-->71H (255)
DE082:   DJNZ 71H,DE082                     ;71H 减 1 不等于 0 转 DE082
               DJNZ 70H,DE081                     ;70H 减 1 不等于 0 转 DE081
               RET                                           ;子程序调用返回
               NOP
STS09:   MOV 72H,#0D3H                     ;#0D3H-->72H  (211)
DE091:   MOV 73H,#0FFH                     ;#0FFH-->73H (255)
DE092:   DJNZ 73H,DE092                     ;73H 减 1 不等于 0 转 DE092
               DJNZ 72H,DE091                     ;72H 减 1 不等于 0 转 DE091
               RET                                           ;子程序调用返回
               NOP
STS0A:   MOV 74H,#0D3H                    ;#0D3H-->74H  (211)
DE0A1:   MOV 75H,#0FFH                    ;#0FFH-->75H (255)
DE0A2:   DJNZ 75H,DE0A2                   ;75H 减 1 不等于 0 转 DE0A2
                DJNZ 74H,DE0A1                  ;74H 减 1 不等于 0 转 DE0A1
                RET                                         ;子程序调用返回
                NOP
STS0B:   MOV 76H,#0D3H                    ;#0D3H-->76H  (211)
DE0B1:   MOV 77H,#0FFH                    ;#0FFH-->77H (255)
DE0B2:   DJNZ 77H,DE0B2                    ;77H 减 1 不等于 0 转 DE0B2
               DJNZ 76H,DE0B1                    ;76H 减 1 不等于 0 转 DE0B1
               RET                                           ;子程序调用返回
               NOP
STS0C:   MOV 78H,#0D3H                    ;#0D3H-->78H  (211)
DE0C1:   MOV 79H,#0FFH                    ;#0FFH-->79H (255)
DE0C2:   DJNZ 79H,DE0C2                   ;79H 减 1 不等于 0 转 DE0C2
                DJNZ 78H,DE0C1                   ;78H 减 1 不等于 0 转 DE0C1
                RET                                          ;子程序调用返回
                NOP
STS0D:   MOV 7AH,#0D3H                    ;#0D3H-->7AH  (211)
DE0D1:   MOV 7BH,#0FFH                    ;#0FFH-->7BH (255)
DE0D2:   DJNZ 7BH,DE0D2                   ;7BH 减 1 不等于 0 转 DE0D2
               DJNZ 7AH,DE0D1                   ;7AH 减 1 不等于 0 转 DE0D1
               RET                                           ;子程序调用返回
               NOP
STS0E:   MOV 7CH,#0D3H                   ;#0D3H-->7CH  (211)
DE0E1:   MOV 7DH,#0FFH                   ;#0FFH-->7DH (255)
DE0E2:   DJNZ 7DH,DE0E2                   ;7DH 减 1 不等于 0 转 DE0E2
               DJNZ 7CH,DE0E1                   ;7CH 减 1 不等于 0 转 DE0E1
               RET                                          ;子程序调用返回
               NOP
STS0F:   MOV 7EH,#0D3H                    ;#0D3H-->7EH  (211)
DE0F1:   MOV 7FH,#0FFH                    ;#0FFH-->7FH (255)
DE0F2:   DJNZ 7FH,DE0F2                    ;7FH 减 1 不等于 0 转 DE0F2
               DJNZ 7EH,DE0F1                    ;7EH 减 1 不等于 0 转 DE0F1
               RET                                           ;子程序调用返回
               NOP
               END                                          ;结束


 


程序共用293句,如有哪位更简练的编程方法请发表意见,共同学习。上传2个压缩包,一个是仿真上的,另一个是EDN-51板上的。


点击下载


 


点击下载



 

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条