一个16位二进制计数器,循环计数。以十进制方式显示出来。

2019-03-24 19:51发布

请查看下面有没有问题,有问题请指出来,谢谢...


;31H、30H单元构成16位二进制计数器
;程序将16位二进制计数器以十进制方式显示
;显示缓冲定义:
ten_thousand         EQU 36H
thousand            EQU 35H
hundred             EQU 34H
ten                        EQU 33H
ones                    EQU 32H
;显示控制
;P1.0:个位,P1.1:十位,P1.2:百位,P1.3:千位,P1.4:万位。
;显示数据口:P2

        ORG 0000H
        AJMP main

        ORG 0100H
main:        MOV P1,#0
        LCALL delay
        MOV 30H,#0        ;清计数器
        MOV 31H,#0
loop:        MOV R3,30H        ;取计数器内容
        MOV R2,31H
        ACALL bin_bcd2       
        LCALL save_show_buffer
        LCALL show        ;显示
        ACALL delay
        INC 30H                ;计数器+1
        MOV A,30H
        JNZ loop2
        INC 31H
loop2:        AJMP loop        ;循环

;程序入口:(R2R3)=十六位二进制
;程序出口:(R4R5R6)=BCD
bin_bcd2:
        CLR  A
        MOV  R4,A
        MOV  R5,A
        MOV  R6,A        ;0→R4R5R6
        MOV  R7,#16        ;循环次数=16
loop1:        CLR  C
        MOV  A,R3
        RLC  A
        MOV  R3,A
        MOV  A,R2
        RLC  A
        MOV  R2,A        ;bi →Cy
    RET

;        MOV  A,R6
;        ADDC  A,R6        ;×2+bi
;        DA  A
;        MOV  R6,A
;        MOV  A,R5
;        ADDC  A,R5        ;×2+进位
;        DA  A
;        MOV  R5,A
;        MOV  A,R4
;        ADDC  A,R4        ;×2+进位
;        DA  A
;        MOV  R4,A
;        DJNZ  R7,loop1
;        RET
disp_code:
        ADD  A,#1            ;RET指令的字节数为1
        MOVC  A,@A+PC
        RET
        DB 0AH,6FH,8CH,2CH,69H,38H,18H,6EH,08H,28H
        RET
save_show_buffer:
;将十进制数放入显示缓冲
        MOV ten_thousand,R4       
        MOV A,R5
        SWAP A
        ANL A,#0FH
        MOV thousand,A
        MOV A,R5
        ANL A,#0FH
        MOV hundred,A
        MOV A,R6
        SWAP A
        ANL A,#0FH
        MOV ten,A
        MOV A,R6
        ANL A,#0FH
        MOV ones,A       
        RET

show:
;显示个位
;----------------------
        MOV A, ones
        ACALL  disp_code
        MOV P2,A
        SETB P1.0
        CLR P1.0
;显示十位
;----------------------
        MOV A, ten
        ACALL  disp_code
        MOV P2,A
        SETB P1.1
        CLR P1.1
;显示百位
;----------------------
        MOV A, hundred
        ACALL  disp_code
        MOV P2,A
        SETB P1.2
        CLR P1.2
;显示千位
;----------------------
        MOV A, thousand
        ACALL  disp_code
        MOV P2,A
        SETB P1.3
        CLR P1.3
;显示万位
;----------------------
        MOV A, ten_thousand
        ACALL  disp_code
        MOV P2,A
        SETB P1.4
        CLR P1.4
        RET

delay:
    del:mov R7,#200
   del1:mov R6,#123
            NOP
    del2:DJNZ R6,del2
             DJNZ R7,del1
               RET
END 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。