;**************************Beginn Routine zum Stellen der Weckzeit******************************************************************************* set_alert_by_keys: push r16 push r17 mov r16, ind_flag andi r16, 0b01000000 ; nur wenn Bit 6 des Anzeige-Registers gesetzt ist, wird das Stellen der Weckzeit aktiviert breq set_alert_by_keys_end mov r17, temp4 ; kopiere den Inhalt von temp4, also von key_press (dem Zustand der Tasten am Taster_Port) in Register r16 lds r16, dt_alert_select ; lade den Wert für die Anzahl der über Taster 2 zu stellenden Größen in das Register r16 andi r17, 0b00000010 ; nur der zweite der Tasterzustände findet Berücksichtigung breq set_alert_by_keys_01 ; alert_select: lsr r16 ; schiebe r16 nach rechts, so dass sich der Wert von r16 halbiert dec r16 brne alert_select_01 ldi r16, 2 lsl r16 ; schiebe r16 nach links, so dass sich der Wert von r16 verdoppelt sts dt_alert_select, r16 ; sonst wird dt_alert_select wieder auf den Anfangswert 2 gesetzt alert_select_01: lsl r16 ; schiebe r16 nach links, so dass sich der Wert von r16 verdoppelt sts dt_alert_select, r16 set_alert_by_keys_01: mov r17, temp4 ; kopiere den Inhalt von temp4, also von key_press (dem Zustand der Tasten am Taster_Port) in das Register r17 andi r17, 0b00000100 ; Ist Taster 3 (Zahlenwert 2^2 also 4) gedrückt? lsr r17 ; schiebe r17 zweimal nach rechts, damit ein Tastendruck mit dem Zahlenwert 2 gekennzeichnet wird lsr r17 add r17, r16 ; füge zu r17 den Wert für die aktuell zu stellende Größe hinzu --> z.B. Taster 2 erste Positon 2 + Taster 1 gedrückt 2+1=3 set_alert_by_keys_02: cpi r17, 5 ; Wenn Taster 2 die erste Position hat und Taster 3 gedrückt wird, werden die Minuten der Weckzeit erhöht brne set_alert_by_keys_03 lds r16, dt_wake_minute ; lade die Minuten der Weckzeit aus dem SRAM von der Stelle "dt_wake_minute" in das Register r16 inc r16 cpi r16, 60 ; wenn 60 Minuten erreicht wurden, werden diese Minuten wieder auf den Wert 0 gesetzt brne no_alert_minute_reset clr r16 no_alert_minute_reset: sts dt_wake_minute, r16 ; die Minuten der Weckzeit werden wieder zurück von r16 in das SRAM an die Stelle "dt_wake_minute" geschrieben ori ind_flag, 0b00000001 ; das Ereignis soll einmal am LCD ausgegeben --> Bit 0 im Anzeige-Register wird also gesetzt set_alert_by_keys_03: cpi r17, 3 ; Wenn Taster 2 die zweite Position hat und Taster 3 gedrückt wird, werden die Stunden der Weckzeit erhöht brne set_alert_by_keys_04 lds r16, dt_wake_hour ; lade die Stunden der Weckzeit aus dem SRAM von der Stelle "dt_wake_hour" in das Register r16 inc r16 cpi r16, 24 ; wenn 24 Stunden erreicht wurden, werden diese Stunden wieder auf den Wert 0 gesetzt brne no_alert_hour_reset clr r16 no_alert_hour_reset: sts dt_wake_hour, r16 ; die Stunden der Weckzeit werden wieder zurück von r16 in das SRAM an die Stelle "dt_wake_hour" geschrieben ori ind_flag, 0b00000001 ; das Ereignis soll einmal am LCD ausgegeben --> Bit 0 im Anzeige-Register wird also gesetzt set_alert_by_keys_04: cpi r17, 1 ; Wenn Taster 2 die zweite Position hat und Taster 3 gedrückt wird, werden die Stunden der Weckzeit erhöht brne set_alert_by_keys_end lds r16, dt_wake_hour ; lade die Stunden der Weckzeit aus dem SRAM von der Stelle "dt_wake_hour" in das Register r16 subi r16, -5 cpi r16, 24 ; wenn 24 Stunden erreicht wurden, werden diese Stunden wieder auf den Wert 0 gesetzt brne no_alert_hour2_reset clr r16 no_alert_hour2_reset: sts dt_wake_hour, r16 ; die Stunden der Weckzeit werden wieder zurück von r16 in das SRAM an die Stelle "dt_wake_hour" geschrieben ori ind_flag, 0b00000001 ; das Ereignis soll einmal am LCD ausgegeben --> Bit 0 im Anzeige-Register wird also gesetzt set_alert_by_keys_end: pop r17 pop r16 ret ;**************************Ende Routine zum Stellen der Weckzeit*********************************************************************************