装配闹钟

时间:2014-04-07 18:04:22

标签: assembly timer clock alarm avr

我有一个问题。 如果我的闹钟= = 60我需要切换inc alarmM并重置闹钟,但我有一个问题

 increment_alarm_second:
inc alarmS                          ; increment alarmS
cpi alarmS  , 0x5A  ; 0x3C          ; Compare alarmS to 60
breq increment_alarm_minute         ; If true, jump incMinute
swap alarmS                         ; swap here to save registers ( swap nibbles )
cpi alarmS  , 0xA0                  ; compares alarmS register to an inverted 10
brlo endIncSecal                    ; branch if lower then an inverted 10 to endIncSecal

    incSecTenal:            
        andi alarmS, 0x0F           ; does an AND + increment on the alarmS register
        inc alarmS                  ; increments the alarmS register
        swap alarmS                 ; swaps alarm_s register
    ret                             ; returns from the calll

endIncSecal:                        
swap alarm_s                        ; swap back
ret

为什么是cpi alarmS,0x5A?而不是0x3C,这是60 ..

之后我们交换半字节并将其与0xA0进行比较?这是为什么?

提前致谢

1 个答案:

答案 0 :(得分:0)

该片段分别跟踪秒的数字。也就是说,第一个半字节是10秒的倍数。第二个半字节是剩下的。

当第二个半字节达到10时,它被清除并且第一个半字节递增。

如果值达到" 50和10" (即60秒)然后它被清除并且分钟增加。

此代码段的主要问题是所有这些都需要在代码中的注释中进行解释。它出乎意料地要求它。