我在想;是不是有一个更简单的方法来编码这个片段? 我的意思是现在该值被半字节检查蚕食,但我不知道为什么?
IncClock_Second:
inc clockS ; increment timerS
cpi clockS, 0x5A ; Compare timerS to 60
breq incClockMinute ; If true, jump incMinute
swap clockS ; swaps timerS register
cpi clockS, 0xA0 ; compares timerS to 10
brlo endIncSec ; branches if lower then 10 to endIncSec
incSecTen:
andi clockS, 0x0F ; does a logical AND with immediate on timerS
inc clockS ; increments timerS
swap clockS ; swaps timerS register back
ret
endIncSec:
swap clockS ; swap back
ret
我不能这样做吗?
IncClock_Second:
inc clockS
cpi clockS, 60
breq incClockMinute
ret
如果不是为什么不呢?它只是保持当前时钟第二个我是对的吗? 我需要将它发送到multisegment.java之后,字节0 1表示左边的时钟小时,然后是2 3表示左边分钟右边,4 5表示第二个左边第二个右边。 我现在不是真的把它们分开了,我是对的吗?
我的sendTime是这样的:
sendTime:
cpi state, 4 ; compares with the mode register with 4
brge sendAlarm ; if this is greater or equal to 4 then branch to sendAlarm
mov temp, clockH ; copies the value of timerH to temp temp = 0001 0010 = 18
swap temp ; swap temp tmp = 0010 0001
andi temp, 0x0F ; do a logical AND with immediate on temp 0010 0001
rcall convertToSeg ; calls converToSeg
rcall sendRS232 ; Now lets send this ;)
mov temp, clockH ; copies the value of timerH again to temp
andi temp, 0x0F ; do a logical AND with immediate on temp
rcall convertToSeg ; calls converToSeg
rcall sendRS232 ; Now lets send this ;)
mov temp, clockM ; copies the value of timerM to temp
swap temp ; swap temp
andi temp, 0x0F ; do a logical AND with immediate on temp
rcall convertToSeg ; calls converToSeg
rcall sendRS232 ; Now lets send this ;)
mov temp, clockM ; copies the value of timerMS again to temp
andi temp, 0xF ; do a logical AND with immediate on temp
rcall convertToSeg ; calls converToSeg
rcall sendRS232 ; Now lets send this ;)
mov temp, clockS ; copies the value of timerS to temp
swap temp ; swap temp
andi temp, 0x0F ; do a logical AND with immediate on temp
rcall convertToSeg ; calls converToSeg
rcall sendRS232 ; Now lets send this ;)
mov temp, clockS ; copies the value of timerS again to temp
andi temp, 0x0F ; do a logical AND with immediate on temp
rcall convertToSeg ; calls converToSeg
rcall sendRS232 ; Now lets send this ;)
mov temp, settings ; Copies the value of settings to temp SIDE NOTE : dubbelpunt aan
rcall sendRS232 ; Now lets send this ;)
endSendTime:
ret
如果您需要更多代码段,请提前致谢,请告知我们。
答案 0 :(得分:0)
看起来变量不是普通的二进制,而是BCD(二进制编码的十进制)。这意味着每个半字节都存储一个十进制数字。注意如何通过与0x5A
进行比较来检查溢出到60,这意味着数字仍然是5
但是已超出范围10
。在这种情况下,秒应该重置为0x00
,并且分钟以类似的方式递增。
代码的第二部分检查更通用的版本,从9
溢出到10
的版本,即值应该是10
的倍数。它通过交换半字节并检查结果是否大于或等于0xA0
来完成此操作。在这种情况下,高半字节被清除(从9
回绕到0
)并且低半字节(包含十位)增加1.我们知道这不会因为早期检查而溢出反对0x5A
。
而不是交换你可以掩盖低半字节并以这种方式执行检查。会更具可读性,也可能更短。
inc clockS
mov temp, clockS
andi temp, 0x0F
cpi temp, 0x0A
brne endIncSec
cpi clockS, 0x5A
breq incClockMinute
subi clockS, -6 ; propagate to tens
endIncSec:
ret
(我假设temp
和clockS
是寄存器。)