汇编程序计时器/时钟

时间:2014-04-08 10:44:58

标签: assembly byte clock avr

我在想;是不是有一个更简单的方法来编码这个片段? 我的意思是现在该值被半字节检查蚕食,但我不知道为什么?

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

如果您需要更多代码段,请提前致谢,请告知我们。

1 个答案:

答案 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

(我假设tempclockS是寄存器。)