请查看下面有没有问题,有问题请指出来,谢谢...
;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
此帖出自
小平头技术问答
一周热门 更多>