; zobrazí na displeji hodiny ; vstupním parametrem je adresa v paměti dat, kde je uložen ; potřebuje proměnné s názvem "kurzor" a "blikani" !!!! ; čas pro zobrazení ve formátu HH:MM:SS, ; kde každá číslice má svůj vlastní byte ; push adresa low ; push adresa high ; neničí obsah žádných registrů show_hodiny: ; uložím do zásobníku obsah použitých registrů push r16 push r26 ; X(L) push r27 ; X(H) push r28 ; Y(L) push r29 ; Y(H) ; načtu ze zásobníku vstupní parametry in r28, SPL in r29, SPH ldd r26, Y+9 ; parametr 1 (adresa low) ldd r27, Y+8 ; parametr 2 (adresa high) ; překopíruju návratovou adresu a původní r16 na stacku ; o 2 byty zpět (přepíšu původní vstupní parametry) ldd r16, Y+7 std Y+9, r16 ldd r16, Y+6 std Y+8, r16 ldd r16, Y+5 std Y+7, r16 ; zobrazení dvojteček na displeji ; a načtení pozice kurzoru do r28 ; (hodnota 255 = všechno svítí) lds r16, blikani cpi r16, 0 breq show_hodiny_tma call zobr_dvojtecky ldi r28, 255 jmp show_hodiny_go show_hodiny_tma: lds r28, kurzor cpi r28, 255 breq show_hodiny_zhasni_dvojtecky jmp show_hodiny_go show_hodiny_zhasni_dvojtecky: call zhasni_dvojtecky show_hodiny_go: ; zobrazení hodin na displeji ld r16, X+ cpi r28, 0 brne show_hodiny_cislice_0 ldi r16, '-' show_hodiny_cislice_0: push r16 ldi r16, 2 push r16 call show_char ld r16, X+ cpi r28, 1 brne show_hodiny_cislice_1 ldi r16, '-' show_hodiny_cislice_1: push r16 ldi r16, 3 push r16 call show_char ld r16, X+ cpi r28, 2 brne show_hodiny_cislice_2 ldi r16, '-' show_hodiny_cislice_2: push r16 ldi r16, 4 push r16 call show_char ld r16, X+ cpi r28, 3 brne show_hodiny_cislice_3 ldi r16, '-' show_hodiny_cislice_3: push r16 ldi r16, 5 push r16 call show_char ld r16, X+ cpi r28, 4 brne show_hodiny_cislice_4 ldi r16, '-' show_hodiny_cislice_4: push r16 ldi r16, 6 push r16 call show_char ld r16, X+ cpi r28, 5 brne show_hodiny_cislice_5 ldi r16, '-' show_hodiny_cislice_5: push r16 ldi r16, 7 push r16 call show_char ; obnovím ze zásobníku obsah použitých registrů pop r29 pop r28 pop r27 pop r26 pop r16 pop r16 ; 2 * pop, protože se kvůli vstup. parametrům posunul zásobník pop r16 ret ; zvýší nebo sníží hodnotu času ; vstupním parametrem je adresa v paměti dat, kde je uložen ; čas pro zobrazení ve formátu HH:MM:SS, ; kde každá číslice má svůj vlastní byte ; push adresa low ; push adresa high ; push číslice (0 = vyšší byte hodin) ; push změna (1 = plus, 255 = mínus, 0 = nic) ; neničí obsah žádných registrů zmenit_hodiny: ; ozálohuju registry do zásobníku (7 bytů) push r16 push r17 push r18 push r26 push r27 push r28 push r29 ; načtu ze zásobníku vstupní parametry in r28, SPL in r29, SPH ldd r26, Y+13 ; parametr 1 (adresa hodin low => X low) ldd r27, Y+12 ; parametr 2 (adresa hodin high => X high) ldd r16, Y+11 ; parametr 3 (pozice nastavované číslice) ldd r18, Y+10 ; parametr 4 (změna) ; překopíruju návratovou adresu a původní r16 na stacku ; o 4 byty zpět (přepíšu původní vstupní parametry) ldd r17, Y+9 std Y+13, r17 ldd r17, Y+8 std Y+12, r17 ldd r17, Y+7 std Y+11, r17 ; najedu na číslici, kterou chci nastavit ldi r17, 0 add r26, r16 adc r27, r17 zmenit_hodiny_cyklus: ; je pozice platná? cpi r16, 6 brsh zmenit_hodiny_konec ; vypočítám novou hodnotu číslice ld r17, X add r17, r18 ; rozvětvení programu podle číslice cpi r16, 0 breq zmenit_hodiny_0 cpi r16, 1 breq zmenit_hodiny_1 cpi r16, 2 breq zmenit_hodiny_2_a_4 cpi r16, 3 breq zmenit_hodiny_3_a_5 cpi r16, 4 breq zmenit_hodiny_2_a_4 cpi r16, 5 breq zmenit_hodiny_3_a_5 ; konec procedury zmenit_hodiny_konec: pop r29 pop r28 pop r27 pop r26 pop r18 pop r17 pop r16 pop r16 pop r16 pop r16 ; 4 * pop, protože se kvůli vstup. parametrům posunul zásobník pop r16 ret ; obsluha jednotlivých číslic ; (v r16 je pozice, v r17 je nová hodnota číslice) ; (do r18 uložím maximální hodnotu číslice) zmenit_hodiny_0: adiw XH:XL, 1 ld r18, X ; hodiny - pravá číslice sbiw XH:XL, 1 cpi r18, '4' brsh zmenit_hodiny_max_1 ldi r18, '2' jmp zmenit_hodiny_go zmenit_hodiny_max_1: ldi r18, '1' jmp zmenit_hodiny_go zmenit_hodiny_1: sbiw XH:XL, 1 ld r18, X ; hodiny - levá číslice adiw XH:XL, 1 cpi r17, '0' brlo zmenit_hodiny_1_podteceni cpi r18, '2' ; 0x a 1x => max x9, ale 2x => max x3 jmp zmenit_hodiny_1_spolecne zmenit_hodiny_1_podteceni: cpi r18, '0' ; 00 => 23 ale 10 => 09 a 20 => 19 zmenit_hodiny_1_spolecne: breq zmenit_hodiny_max_3 ldi r18, '9' jmp zmenit_hodiny_go zmenit_hodiny_max_3: ldi r18, '3' jmp zmenit_hodiny_go zmenit_hodiny_2_a_4: ldi r18, '5' jmp zmenit_hodiny_go zmenit_hodiny_3_a_5: ldi r18, '9' jmp zmenit_hodiny_go ; společná část programu pro všechny číslice ; (v r16 je pozice, v r17 je nová hodnota číslice, ; v r18 je maximální hodnota číslice) zmenit_hodiny_go: cpi r17, '0' brlo zmenit_hodiny_podteceni cp r17, r18 breq zmenit_hodiny_ok brlo zmenit_hodiny_ok ; přetečení ldi r17, '0' ; nová hodnota číslice st X, r17 ; uložím sbiw XH:XL, 1 ; posunu X na další číslici dec r16 ; posun pozice ldi r18, 1 ; další číslici zvětšit o jedničku jmp zmenit_hodiny_cyklus ; podtečení zmenit_hodiny_podteceni: mov r17, r18 ; nová hodnota číslice st X, r17 ; uložím sbiw XH:XL, 1 ; posunu X na další číslici dec r16 ; posun pozice ldi r18, 255 ; další číslici zmenšit o jedničku jmp zmenit_hodiny_cyklus ; OK zmenit_hodiny_ok: st X, r17 ; uložím novou číslici jmp zmenit_hodiny_konec ; zkopíruje čas z adresy "X" na adresu "Y" ; ničí pouze obsah registrů X a Y kopiruj_cas: push r16 ld r16, X+ st Y, r16 ld r16, X+ std Y+1, r16 ld r16, X+ std Y+2, r16 ld r16, X+ std Y+3, r16 ld r16, X+ std Y+4, r16 ld r16, X+ std Y+5, r16 pop r16 ret