我无法在8051 Assembly中循环显示十六进制数字以进行正确的减法,
这是一个简单的代码,迭代30次,显示40到70之间的值(40,41,42,43,...... 70)
MOV A,#40H ;first value of the loop
MOV R0,#0H
MOV R1,#30 ;Number of iterations
LOOP:
ADD A,R0
DA A ;To Adjust the decimal values after each addition
INC A
DJNZ R1,LOOP
END
这是调整每个值的方式,
; 40H = 64D --(+0D)--> 64D = 40H
; 41H = 65D --(+0D)--> 65D = 41H
; 42H = 66D --(+0D)--> 66D = 42H
; 43H = 67D --(+0D)--> 67D = 43H
; 44H = 68D --(+0D)--> 68D = 44H
; 45H = 69D --(+0D)--> 69D = 45H
; 46H = 70D --(+0D)--> 70D = 46H
; 47H = 71D --(+0D)--> 71D = 47H
; 48H = 72D --(+0D)--> 72D = 48H
; 49H = 73D --(+0D)--> 73D = 49H
; 4AH = 74D --(+6D)--> 80D = 50H
但是当我想要反转循环时,即如果我想以70到40(70,69,68,67,66,65,64,...... 40)的相反顺序输出
我该怎么做?
以下是第一个数字为90
时如何工作的示例; 90H = 144D --(+0D)--> 144D = 90H
; 8FH = 143D --(-6D)--> 137D = 89H
; 8EH = 142D --(-6D)--> 136D = 88H
; 8DH = 141D --(-6D)--> 135D = 87H
; 8CH = 140D --(-6D)--> 134D = 86H
; 8BH = 139D --(-6D)--> 133D = 85H
; 8AH = 138D --(-6D)--> 132D = 84H
但由于减法后没有任何小数调整,我怎么能达到预期的结果呢?
所需的输出,
90 89 88 87 86 85 ....
答案 0 :(得分:1)
您不能减1,但可以添加99。
ADD A, #99H
DA A
答案 1 :(得分:0)
我从您的问题中了解到,您希望显示从初始值99d开始到00d结束的2位小数下计数。
我同意NovaDenizen。以下是解释:
您遇到的限制是 DA A指令在减法后不起作用。现在,您必须使用替代逻辑,其中减法操作被实现为特殊形式的加法。这个想法的直接暗示是利用补体的方法。 在10s的补码方法中,添加99相当于减去-01 。因此,这就是您的代码应该如何:
ORG 0000H
MOV P1,#99H
MOV A,#99H ; A=99h
BACK: ACALL DELAY ; Call Delay Routine
ADD A,#99H ; Realize count down action by adding 99H
(equivalent to subtracting 01)
DA A ; Decimal Adjust to realize the BCD format representation
MOV P1,A ; Display the count on P1
JNZ BACK ; Continue till the count ends with 00
SJMP $ ; termination of the program
DELAY: MOV R1,#0FFH ; Delay Routine to generate certain delay.
DEC1: MOV R2,#0FFH
DEC2: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,DEC2
DJNZ R1,DEC1
RET
END
(在Keil中运行程序并检查端口1上的输出。)
希望这会对你有所帮助。此致