; Nejjednodussi LED budik ; 4-ciferny displej ; ATtiny2313A / 2313 / 2313V ; krystal 4 MHz ; DANYK ; http://danyk.cz/avr_bud.html .NOLIST .INCLUDE "tn2313def.inc" .LIST .DEF NULA=R3 ; 0 .DEF JAS=R12 .DEF MULTREG=R13 .DEF ZVONI=R14 ; .DEF DELREG=R15 ;deleni 100Hz na 1Hz .DEF REG=R16 ;docasny registr 1 .DEF REG2=R17 ;docasny registr 2 .DEF CIF1=R18 ; .DEF CIF2=R19 ; .DEF CIF3=R20 ; .DEF CIF4=R21 ; .DEF SEK1=R22 ;sekundy .DEF SEK2=R23 ;10ky sekund .DEF MIN1=R24 ;minuty .DEF MIN2=R25 ;10ky minut .DEF HOD1=R26 ;hodiny .DEF HOD2=R27 ;10ky hodin .DEF TECKY=R28 .DEF MODREG=R29 ;registr modu .EQU STAV_TLAC=0x0060 ;předchozí stav tlačítek .EQU PRODL_TLAC=0x0061 ;odpočítává prodlevu tlač. do další reakce .EQU DEN1=0x0062 .EQU DEN2=0x0063 .EQU MESIC1=0x0064 .EQU MESIC2=0x0065 .EQU AUTOCAS=0x0066 .EQU AUTOCASP=0x0067 .EQU ROK1=0x0068 .EQU ROK2=0x0069 .EQU DEN_TYDNE=0x006A .EQU DOBA_TLAC=0x006B ;doba stisku tlacitka mod .EQU BUDIK1=0x006C .EQU BUDIK2=0x006D .EQU BUDIK3=0x006E .EQU BUDIK4=0x006F .EQU BUDIK_MOD=0x0070 .EQU SMER=DDRB ;PORT displeje - anod segmentů .EQU PORT=PORTB .EQU SMER2=DDRD ;PORT multiplexu - katod segmentů, tlačítek .EQU PORT2=PORTD .EQU PINY2=PIND .CSEG .ORG 0 RJMP START ; sem skoci program pri preruseni .ORG OC1Aaddr RJMP CITAC .ORG OC1Baddr RJMP ZHASNI START: ;nastaví port jako výstup, přednastaví log 1 LDI REG,0xFF OUT SMER,REG OUT PORT,REG ;nastaví bity 0,1,4,5 jako výstup ;nastaví bity 2,3 jako vstup a aktivuje vnitřní pullup odpory LDI REG,0b01110011 OUT SMER2,REG LDI REG,0b00001100 OUT PORT2,REG LDI REG,LOW(RAMEND) OUT SPL,REG ; vynuluje/presnastavi registry CLR ZVONI LDI REG,100 MOV DELREG,REG LDI MODREG,1 MOV MULTREG,MODREG MOV JAS,MODREG CLR NULA CLR REG CLR REG2 MOVW SEK1,REG MOVW MIN1,REG MOVW HOD1,REG MOVW CIF1,REG MOVW CIF3,REG STS AUTOCASP,REG ;čas už byl posunut (0-ne, 1-ano) STS DEN2,REG ;datum STS MESIC2,REG ;datum STS STAV_TLAC,REG STS PRODL_TLAC,REG STS BUDIK_MOD,REG STS BUDIK1,REG STS BUDIK2,REG STS BUDIK3,REG STS BUDIK4,REG LDI REG,1 STS AUTOCAS,REG ;automatický čas (0-ne, 1-ano) STS DEN1,REG ;datum STS MESIC1,REG ;datum STS ROK2,REG ;rok - vyšší cifra (posledního dvojčíslí) STS DEN_TYDNE,REG ;den v týdnu LDI REG,4 STS ROK1,REG ;rok - nižší cifra (posledního dvojčíslí) ; NASTAVENI CASOVACU A PRERUSENI OUT TCCR0A,NULA ; vypne citac OUT TCCR0B,NULA ; vypne citac LDI REG,17 ; nastavi porovnavanou hodnotu (urci f pipani) OUT OCR0A,REG ; LDI REG,1 ; nastavi porovnavanou hodnotu () OUT OCR0B,REG ; LDI REG,0b00000000 ; nastavi c/c na nulovani pri dosazeni porovnavane... OUT TCCR1A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00001010 ; 4MHz :8 :1250 = 400Hz OUT TCCR1B,REG LDI REG,HIGH(1249) ; nastavi porovnavanou hodnotu OUT OCR1AH,REG ; -horní byte z 16-bit čísla LDI REG,LOW(1249) ; nastavi porovnavanou hodnotu OUT OCR1AL,REG ; -dolní byte z 16-bit čísla ; Bacha! dělí se n+1, nikoliv n LDI REG,0b01100000 ; povoli preruseni citace OUT TIMSK,REG ; (bit 5 povoli citac1B, bit 6 povoli citac1A) LDI REG,0b00100000 ;povoli uspani (sleep) a nastavi mód idle OUT MCUCR,REG ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG SEI ;povoli globalni preruseni ;hlavní smyčka SMYCKA: SLEEP RJMP SMYCKA ZHASNI: LDI REG,0b00001100 OUT PORT2,REG OUT PORT,NULA RETI CITAC: ;preruseni (400Hz) RCALL MULT DEC MULTREG BRNE HOP LDI REG,4 MOV MULTREG,REG RCALL MOD RCALL TLACITKA RCALL PIPANI_A_JAS DEC DELREG ;deleni f/100 BRNE HOP LDI REG,100 MOV DELREG,REG ; RCALL PRIDEJS ;1x za sekundu inkrementuje cas HOP: RETI PIPANI_A_JAS: ;PIPANI LDI REG,1 CP ZVONI,REG LDI REG,0b00000000 ; vypne CTC a OC0B LDI REG2,0b00000000 ; zastavi citac BRNE NEZVONI SBRC DELREG,6 RJMP NEZVONI SBRC DELREG,3 RJMP NEZVONI LDI REG,0b00010010 ; CTC, OC0B aktivni, toggle LDI REG2,0b00000011 ; preddeli 64 SBI SMER2,5 RJMP ZVONENI NEZVONI: CBI SMER2,5 ZVONENI: OUT TCCR0A,REG ; OUT TCCR0B,REG2 ; ;JAS LDI ZL,LOW(TAB_JAS) LDI ZH,HIGH(TAB_JAS) ADD ZL,JAS ADC ZH,NULA IJMP TAB_JAS: RJMP JAS_0 RJMP JAS_1 RJMP JAS_2 RJMP JAS_3 RJMP JAS_4 RJMP JAS_5 RJMP JAS_6 JAS_0: JAS_1: LDI REG,HIGH(1250) ; nastavi porovnavanou hodnotu OUT OCR1BH,REG ; -horní byte z 16-bit čísla LDI REG,LOW(1250) ; nastavi porovnavanou hodnotu OUT OCR1BL,REG ; -dolní byte z 16-bit čísla RJMP JAS_KONEC JAS_2: LDI REG,HIGH(625) ; nastavi porovnavanou hodnotu OUT OCR1BH,REG ; -horní byte z 16-bit čísla LDI REG,LOW(625) ; nastavi porovnavanou hodnotu OUT OCR1BL,REG ; -dolní byte z 16-bit čísla RJMP JAS_KONEC JAS_3: LDI REG,HIGH(312) ; nastavi porovnavanou hodnotu OUT OCR1BH,REG ; -horní byte z 16-bit čísla LDI REG,LOW(312) ; nastavi porovnavanou hodnotu OUT OCR1BL,REG ; -dolní byte z 16-bit čísla RJMP JAS_KONEC JAS_4: LDI REG,HIGH(156) ; nastavi porovnavanou hodnotu OUT OCR1BH,REG ; -horní byte z 16-bit čísla LDI REG,LOW(156) ; nastavi porovnavanou hodnotu OUT OCR1BL,REG ; -dolní byte z 16-bit čísla RJMP JAS_KONEC JAS_5: LDI REG,HIGH(78) ; nastavi porovnavanou hodnotu OUT OCR1BH,REG ; -horní byte z 16-bit čísla LDI REG,LOW(78) ; nastavi porovnavanou hodnotu OUT OCR1BL,REG ; -dolní byte z 16-bit čísla RJMP JAS_KONEC JAS_6: LDI REG,HIGH(34) ; nastavi porovnavanou hodnotu OUT OCR1BH,REG ; -horní byte z 16-bit čísla LDI REG,LOW(34) ; nastavi porovnavanou hodnotu OUT OCR1BL,REG ; -dolní byte z 16-bit čísla ;RJMP JAS_KONEC JAS_KONEC: RET ;tenhle zázrak dělá počítání do 23:59:59 PRIDEJS: INC SEK1 ;zvýší SEK1 CPI SEK1,10 ;ověří, jestli tam neni 10 BRLO KONEC ;pokud ne, celé to končí LDI SEK1,0 ;pokud ano, vynuluje jí to INC SEK2 ;a zvýší SEK2 CPI SEK2,6 ;ověří, jestli tam neni 6 BRLO KONEC ;pokud ne, celé to končí LDI SEK2,0 ;pokud ano, vynuluje jí to ;PRIDEJM: INC MIN1 ;zvýší MIN1 CPI MIN1,10 ;ověří, jestli tam neni 10 BRLO KONECATEST ;pokud ne, celé to končí LDI MIN1,0 ;pokud ano, vynuluje jí to INC MIN2 ;a zvýší MIN2 CPI MIN2,6 ;ověří, jestli tam neni 6 BRLO KONECATEST ;pokud ne, celé to končí LDI MIN2,0 ;pokud ano, vynuluje jí to ;PRIDEJH: INC HOD1 ; zvýší cifru HOD1 RCALL TAUTOCAS ;automatický čas CPI HOD1,10 ;ověří, jestli tam neni 10 BRLO KONTR24 ;pokud ne, skočí na kontrolu 24 LDI HOD1,0 ;pokud ano, vynuluje jí to INC HOD2 ;a zvýší cifru 6 KONTR24: CPI HOD1,4 ;kontrola, zda cifra HOD1 není 4 BRLO KONECATEST CPI HOD2,2 ;a zda současně cifra HOD2 není 2 BRLO KONECATEST LDI HOD1,0 ;pokud ano, je 24 hodin, dojde k... LDI HOD2,0 ;...nulování obou cifer RCALL DALSIDEN RCALL DALSIDENT KONECATEST: RCALL BUDIKTEST KONEC: RET ;tenhle zázrak dělá počítání dne a měsíce DALSIDEN: LDS REG,DEN1 ;načte jednotky dnů INC REG ;iknrementuje je to STS DEN1,REG ;uloží CPI REG,10 ;zjistí, jestli už to není 10 BRLO KONTR31A ;pokud ne, pokračuje kontrolou, zda není konec měsíce STS DEN1,NULA ;jinak se vynuluje...a uloží LDS REG,DEN2 ;načtou se desítky dnů INC REG ;inkrementujou se STS DEN2,REG ;uloží se KONTR31A: ;kontrola konce měsíce RCALL KOLIKMADNI;zde se volá cosi, co vrácí počet dnů aktuálního měsíce LDS REG,DEN2 ;načtou se desítky dnů CP REG,REG2 ;porovnají s max. desítkama dnů daného měsíce BRLO KONECDENA ;pokud nepřekročily maximum,konec RCALL KOLIKMADNI; LDS REG2,DEN1 ;načte jednotky dnů CP REG2,REG ;porovná je s maximální hodnotou daného měsíce BRLO KONECDENA ;pokud nepřekročily, konec LDI REG,1 ;pokud ano, tak jednotky dnů = 1 STS DEN1,REG ;uloží STS DEN2,NULA ;a desítky dnů = 0 (uloží) DALSIMESIC: ;zvýšení měsíce LDS REG,MESIC1 INC REG STS MESIC1,REG CPI REG,10 BRLO KONTR12A STS MESIC1,NULA LDS REG,MESIC2 INC REG STS MESIC2,REG KONTR12A: LDS REG,MESIC2 CPI REG,1 BRLO KONECDENA LDS REG,MESIC1 CPI REG,3 BRLO KONECDENA LDI REG,1 STS MESIC1,REG STS MESIC2,NULA RCALL DALSIROK KONECDENA: RET ;počítání roku DALSIROK: LDS REG,ROK1 INC REG STS ROK1,REG CPI REG,10 BRLO KONECROKN STS ROK1,NULA LDS REG,ROK2 INC REG STS ROK2,REG CPI REG,10 BRLO KONECROKN STS ROK2,NULA KONECROKN: RET DALSIDENT: ;zvýšení dne v týdnu (1-pondělí až 7-neděle) LDS REG,DEN_TYDNE INC REG STS DEN_TYDNE,REG CPI REG,8 BRLO KONECDENT LDI REG,1 STS DEN_TYDNE,REG KONECDENT: RET KOLIKMADNI: ;tenhle zázrak vrací max. počet dnů akt. měsíce + 1 LDS REG,MESIC1 LDS REG2,MESIC2 CPI REG2,0 BREQ DO9 SUBI REG,253 ;pricte 3 DO9: ;měsíce 10-12 jsou stejné jako 3-5, proto tu nejsou. LDI ZL,LOW(MESIC_SKOK) LDI ZH,HIGH(MESIC_SKOK) ADD ZL,REG ADC ZH,NULA IJMP MESIC_SKOK: RJMP MESIC00 RJMP MESIC01 RJMP MESIC02 RJMP MESIC03 RJMP MESIC04 RJMP MESIC05 RJMP MESIC06 RJMP MESIC07 RJMP MESIC08 RJMP MESIC09 MESIC00: MESIC01: LDI REG2,3 LDI REG,2 RET MESIC02: RCALL JEPRESTUPNY CPI REG2,0 BRNE PRESTUNOR LDI REG2,2 LDI REG,9 RET PRESTUNOR: LDI REG2,3 LDI REG,0 RET MESIC03: LDI REG2,3 LDI REG,2 RET MESIC04: LDI REG2,3 LDI REG,1 RET MESIC05: LDI REG2,3 LDI REG,2 RET MESIC06: LDI REG2,3 LDI REG,1 RET MESIC07: LDI REG2,3 LDI REG,2 RET MESIC08: LDI REG2,3 LDI REG,2 RET MESIC09: LDI REG2,3 LDI REG,1 RET JEPRESTUPNY: ;zjišťuje, zda je přestupný rok (ano - REG2=1) LDS REG2,ROK2 LDS REG,ROK1 ANDI REG2,0b00000001 CPI REG2,1 BRNE LICHADES SUBI REG,254 ;pricte 2 LICHADES: LDI REG2,1 CPI REG,0 BREQ PRESTUP CPI REG,4 BREQ PRESTUP CPI REG,8 BREQ PRESTUP LDI REG2,0 PRESTUP: RET TAUTOCAS: ;kontrola, zda nemá automaticky změnit čas LDS REG,AUTOCAS ;je zapnutý automatický čas? CPI REG,0 BREQ POSUNNE LDS REG,DEN2 ;desítky dnů CPI REG,0 BREQ POSUNNE CPI REG,1 BREQ POSUNNE CPI REG,3 BREQ POSUNDAL LDS REG,DEN1 ;jednotky dnů CPI REG,5 BRLO POSUNNE POSUNDAL: LDS REG,DEN_TYDNE ;den v týdnu CPI REG,7 BRNE POSUNNE LDS REG,MESIC1 ;jednotky měsíce CPI REG,3 BREQ POSUNLET LDS REG,MESIC1 CPI REG,0 BREQ POSUNZIM RJMP POSUNNE POSUNLET: ;pokud je 02 hodin, posune na 03 CPI HOD1,2 BRNE POSUNNE CPI HOD2,0 BRNE POSUNNE LDI HOD1,3 LDI HOD2,0 RET POSUNZIM: ;pokud je 02 hodin, posune na 03 LDS REG,AUTOCASP ;je zapnutý automatický čas? CPI REG,1 BREQ POSUNNE CPI HOD1,3 BRNE POSUNNE CPI HOD2,0 BRNE POSUNNE LDI HOD1,2 LDI HOD2,0 LDI REG,1 STS AUTOCASP,REG RET POSUNNE: STS AUTOCASP,NULA RET BUDIKTEST: ;zjištuje, zda má nastat alarm - porovná s akt. časem LDS REG,BUDIK_MOD CPI REG,0 BREQ NEBUDIT CPI REG,1 BREQ TESTUJBUDIK CPI REG,3 BREQ TESTUJBUDIK LDS REG,DEN_TYDNE ;zjistí den v týdnu CPI REG,6 BRSH NEBUDIT TESTUJBUDIK: LDS REG,BUDIK1 CP REG,MIN1 LDS REG,BUDIK2 CPC REG,MIN2 LDS REG,BUDIK3 CPC REG,HOD1 LDS REG,BUDIK4 CPC REG,HOD2 BRNE NEBUDIT LDI REG,1 MOV ZVONI,REG ;zapne budik LDS REG,BUDIK_MOD CPI REG,1 ;pokud je budik jednoraz., po spusteni signalu ho to vypne BRNE NEBUDIT STS BUDIK_MOD,NULA NEBUDIT: RET TLACITKA: ;Zjištění stavu tlačítek. f je 64Hz LDS REG,PRODL_TLAC ;počítadlo prodlevy do další reakce CPI REG,0 BREQ UZJE0 DEC REG STS PRODL_TLAC,REG UZJE0: LDS REG2,STAV_TLAC ;Do REG2 načte předchozí stav tlačítek IN REG,PIND ;Zjistí stav tlačítek ANDI REG,0b00001100 STS STAV_TLAC,REG ;Uloží ho pro příští test CP REG2,REG ;pokud předchozí stav = současný, TL už nereaguje znovu BREQ NEREAGOVAT LDS REG2,PRODL_TLAC ;pokud neuplynula minimální prodleva, nereaguje znovu CPI REG2,0 BRNE NEREAGOVAT SBRS REG,3 RJMP NA_TLAC1 SBRS REG,2 RJMP NA_TLAC2 RJMP NEREAGOVAT NA_TLAC1: RCALL TLAC1 RJMP NEREAGOVAT NA_TLAC2: RCALL TLAC2 NEREAGOVAT: LDI REG2,2 ;určuje prodlevu do další reakce (x 10ms) ;stisknutí/držení tlačítka nastaví prodlevu do další reakce SBRS REG,2 STS PRODL_TLAC,REG2 SBRS REG,3 STS PRODL_TLAC,REG2 LDS REG2,DOBA_TLAC SBRS REG,2 INC REG2 STS DOBA_TLAC,REG2 LDS REG2,PRODL_TLAC CPI REG2,0 BRNE PRODL_NE0 LDI REG2,0 STS DOBA_TLAC,REG2 PRODL_NE0: LDS REG2,DOBA_TLAC CPI REG2,100 BRNE NE100 RCALL TLAC2_D NE100: RET MOD: CLR TECKY LDI ZL,LOW(MOD_SKOK) LDI ZH,HIGH(MOD_SKOK) ADD ZL,MODREG ADC ZH,NULA IJMP MOD_SKOK: RJMP MOD0 RJMP MOD1 RJMP MOD2 RJMP MOD3 RJMP MOD4 RJMP MOD5 RJMP MOD6 RJMP MOD7 RJMP MOD8 RJMP MOD9 RJMP MOD10 RJMP MOD11 RJMP MOD12 RJMP MOD13 RJMP MOD14 RJMP MOD15 RJMP MOD16 MOD0: MOD1: MOVW CIF1,MIN1 MOVW CIF3,HOD1 LDI TECKY,0b011 RET MOD2: SBRS SEK1,0 RJMP UDAJ3_1 ;UDAJ3_2: LDS CIF1,MESIC1 LDS CIF2,MESIC2 SBRS CIF2,0 LDI CIF2,10 LDS CIF3,DEN1 LDS CIF4,DEN2 LDI TECKY,0b110 RET UDAJ3_1: MOVW CIF1,MIN1 MOVW CIF3,HOD1 LDI TECKY,0b011 RET MOD3: CPI SEK1,0 BREQ UDAJ2 CPI SEK1,5 BREQ UDAJ2 CPI SEK1,3 BREQ UDAJ1 CPI SEK1,4 BREQ UDAJ1 CPI SEK1,8 BRSH UDAJ1 ;UDAJ3: LDS CIF1,MESIC1 LDS CIF2,MESIC2 SBRS CIF2,0 LDI CIF2,10 LDS CIF3,DEN1 LDS CIF4,DEN2 LDI TECKY,0b110 RET UDAJ2: LDS CIF1,DEN_TYDNE LDS CIF2,DEN_TYDNE ORI CIF1,128 ORI CIF2,128 LDI CIF3,10 LDI CIF4,10 RET UDAJ1: MOVW CIF1,MIN1 MOVW CIF3,HOD1 LDI TECKY,0b011 RET MOD4: LDI CIF1,10 LDS CIF2,BUDIK_MOD CPI CIF2,2 BREQ BUD_M2 CPI CIF2,3 BRNE BUD_M_HOTOVO BUD_M3: LDI CIF2,7 RJMP BUD_M_HOTOVO BUD_M2: LDI CIF2,5 BUD_M_HOTOVO: SBRC DELREG,4 LDI CIF2,10 LDI CIF3,12 LDI CIF4,11 LDI TECKY,0b010 RET MOD5: RCALL NACTI_BUDIK SBRC DELREG,4 LDI CIF1,10 LDI TECKY,0b011 RET MOD6: RCALL NACTI_BUDIK SBRC DELREG,4 LDI CIF2,10 LDI TECKY,0b011 RET MOD7: RCALL NACTI_BUDIK SBRC DELREG,4 LDI CIF3,10 SBRC DELREG,4 LDI CIF4,10 LDI TECKY,0b011 RET MOD8: LDI CIF4,11 LDI CIF3,13 SBRS DELREG,4 LDS CIF2,AUTOCAS SBRC DELREG,4 LDI CIF2,10 LDI CIF1,10 LDI TECKY,0b010 RET MOD9: SBRS DELREG,4 LDI CIF4,2 SBRC DELREG,4 LDI CIF4,10 SBRS DELREG,4 LDI CIF3,0 SBRC DELREG,4 LDI CIF3,10 SBRS DELREG,4 LDS CIF2,ROK2 SBRC DELREG,4 LDI CIF2,10 SBRS DELREG,4 LDS CIF1,ROK1 SBRC DELREG,4 LDI CIF1,10 RET MOD10: LDS CIF3,DEN1 LDS CIF4,DEN2 SBRS DELREG,4 LDS CIF1,MESIC1 SBRS DELREG,4 LDS CIF2,MESIC2 SBRC DELREG,4 LDI CIF1,10 SBRC DELREG,4 LDI CIF2,10 SBRS CIF2,0 LDI CIF2,10 LDI TECKY,0b110 RET MOD11: LDS CIF1,MESIC1 LDS CIF2,MESIC2 SBRS CIF2,0 LDI CIF2,10 SBRS DELREG,4 LDS CIF3,DEN1 SBRS DELREG,4 LDS CIF4,DEN2 SBRC DELREG,4 LDI CIF3,10 SBRC DELREG,4 LDI CIF4,10 LDI TECKY,0b110 RET MOD12: LDI CIF4,10 LDI CIF3,10 LDS CIF1,DEN_TYDNE LDS CIF2,DEN_TYDNE ORI CIF1,128 ORI CIF2,128 SBRC DELREG,4 LDI CIF1,10 SBRC DELREG,4 LDI CIF2,10 RET MOD13: MOVW CIF1,SEK1 SBRS DELREG,4 LDI CIF1,10 SBRS DELREG,4 LDI CIF2,10 MOVW CIF3,MIN1 LDI TECKY,0b011 RET MOD14: MOVW CIF1,MIN1 SBRC DELREG,4 LDI CIF1,10 MOVW CIF3,HOD1 LDI TECKY,0b011 RET MOD15: MOVW CIF1,MIN1 SBRC DELREG,4 LDI CIF2,10 MOVW CIF3,HOD1 LDI TECKY,0b011 RET MOD16: MOVW CIF1,MIN1 LDI CIF3,10 LDI CIF4,10 SBRS DELREG,4 MOVW CIF3,HOD1 LDI TECKY,0b011 RET NACTI_BUDIK: LDS CIF1,BUDIK1 LDS CIF2,BUDIK2 LDS CIF3,BUDIK3 LDS CIF4,BUDIK4 RET ; tlačítko narizovani (+) TLAC1: CP ZVONI,NULA BREQ TL1_REAG CLR ZVONI RET TL1_REAG: LDI ZL,LOW(MOD_NAR_SKOK) LDI ZH,HIGH(MOD_NAR_SKOK) ADD ZL,MODREG ADC ZH,NULA IJMP MOD_NAR_SKOK: RJMP MOD0_NAR RJMP MOD1_NAR RJMP MOD2_NAR RJMP MOD3_NAR RJMP MOD4_NAR RJMP MOD5_NAR RJMP MOD6_NAR RJMP MOD7_NAR RJMP MOD8_NAR RJMP MOD9_NAR RJMP MOD10_NAR RJMP MOD11_NAR RJMP MOD12_NAR RJMP MOD13_NAR RJMP MOD14_NAR RJMP MOD15_NAR RJMP MOD16_NAR MOD0_NAR: ;sem se to nikdy nedostane MOD1_NAR: MOD2_NAR: MOD3_NAR: DEC JAS BRNE JAS_ZPET LDI REG,6 MOV JAS,REG JAS_ZPET: RET MOD4_NAR: LDS REG,BUDIK_MOD INC REG CPI REG,4 BRLO KONEC_BM CLR REG KONEC_BM: STS BUDIK_MOD,REG RET MOD5_NAR: LDS REG,BUDIK1 INC REG ; zvýší cifru BUDIK1 CPI REG,10 ;ověří, jestli tam neni 10 BRLO MINB_DO_10 CLR REG ;pokud ano, vynuluje jí to MINB_DO_10: STS BUDIK1,REG RCALL BUDIKTEST RET MOD6_NAR: LDS REG,BUDIK2 INC REG ; zvýší cifru BUDIK2 CPI REG,6 ;ověří, jestli tam neni 6 BRLO MINB_DO_6 CLR REG ;pokud ano, vynuluje jí to MINB_DO_6: STS BUDIK2,REG RCALL BUDIKTEST RET MOD7_NAR: LDS REG,BUDIK3 LDS REG2,BUDIK4 INC REG CPI REG,10 BRLO KONTRB24 CLR REG INC REG2 KONTRB24: CPI REG2,2 BRLO KONECHB CPI REG,4 BRLO KONECHB CLR REG CLR REG2 KONECHB: STS BUDIK3,REG STS BUDIK4,REG2 RCALL BUDIKTEST RET MOD8_NAR: LDS REG,AUTOCAS INC REG CPI REG,2 BRLO KONECACV LDI REG,0 KONECACV: STS AUTOCAS,REG RET MOD9_NAR: RCALL DALSIROK RET MOD10_NAR: LDS REG,MESIC1 INC REG STS MESIC1,REG CPI REG,10 BRLO KONTR12 STS MESIC1,NULA LDS REG,MESIC2 INC REG STS MESIC2,REG KONTR12: LDS REG,MESIC2 CPI REG,1 BRLO KONECDENM LDS REG,MESIC1 CPI REG,3 BRLO KONECDENM LDI REG,1 STS MESIC1,REG STS MESIC2,NULA KONECDENM: RET MOD11_NAR: LDS REG,DEN1 ;načte jednotky dnů INC REG ;iknrementuje je to STS DEN1,REG ;uloží CPI REG,10 ;zjistí, jestli už to není 10 BRLO KONTR31 ;pokud ne, pokračuje kontrolou, zda není konec měsíce STS DEN1,NULA ;jinak se vynuluje...a uloží LDS REG,DEN2 ;načtou se desítky dnů INC REG ;inkrementujou se STS DEN2,REG ;uloží se KONTR31: ;kontrola konce měsíce RCALL KOLIKMADNI;zde se volá cosi, co vrácí počet dnů aktuálního měsíce LDS REG,DEN2 ;načtou se desítky dnů CP REG,REG2 ;porovnají s max. desítkama dnů daného měsíce BRLO KONECDENH ;pokud nepřekročily maximum,konec RCALL KOLIKMADNI; LDS REG2,DEN1 ;načte jednotky dnů CP REG2,REG ;porovná je s maximální hodnotou daného měsíce BRLO KONECDENH ;pokud nepřekročily, konec LDI REG,1 ;pokud ano, tak jednotky dnů = 1 STS DEN1,REG ;uloží STS DEN2,NULA ;a desítky dnů = 0 (uloží) KONECDENH: RET MOD12_NAR: LDS REG,DEN_TYDNE INC REG ; zvýší DEN_TYDNE CPI REG,8 ;ověří, jestli tam neni 8 BRLO TYDEN_DO_7 LDI REG,1 ;pokud ano, skoci opet na 1 TYDEN_DO_7: STS DEN_TYDNE,REG RET MOD13_NAR: LDI REG,0b00111110 OR DELREG,REG LDI SEK1,0 INC SEK2 ; zvýší cifru MIN2 CPI SEK2,6 ;ověří, jestli tam neni 6 BRLO SEK_DO_6 LDI SEK2,0 ;pokud ano, vynuluje jí to SEK_DO_6: RET MOD14_NAR: INC MIN1 ; zvýší cifru MIN1 CPI MIN1,10 ;ověří, jestli tam neni 10 BRLO MIN_DO_10 LDI MIN1,0 ;pokud ano, vynuluje jí to MIN_DO_10: RCALL BUDIKTEST RET MOD15_NAR: INC MIN2 ; zvýší cifru MIN2 CPI MIN2,6 ;ověří, jestli tam neni 6 BRLO MIN_DO_6 LDI MIN2,0 ;pokud ano, vynuluje jí to MIN_DO_6: RCALL BUDIKTEST RET MOD16_NAR: INC HOD1 ; zvýší cifru HOD1 CPI HOD1,10 ;ověří, jestli tam neni 10 BRLO KONTR24A ;pokud ne, skočí na kontrolu 24 LDI HOD1,0 ;pokud ano, vynuluje jí to INC HOD2 ;a zvýší cifru 6 KONTR24A: CPI HOD1,4 ;kontrola, zda cifra HOD1 není 4 BRLO KONECATESTA CPI HOD2,2 ;a zda současně cifra HOD2 není 2 BRLO KONECATESTA LDI HOD1,0 ;pokud ano, je 24 hodin, dojde k... LDI HOD2,0 ;...nulování obou cifer KONECATESTA: RCALL BUDIKTEST RET ; tlačítko "mod" TLAC2: MOV REG,ZVONI CLR ZVONI CPI REG,0 BRNE MODKONEC DEC MODREG BRNE MODKONEC LDI MODREG,7 MODKONEC: RET ; tlacitko "mod" dlouze TLAC2_D: LDI MODREG,16 RET MULT: CLR NULA LDI REG,0b00001100 OUT PORT2,REG MOV REG,MULTREG ;CPI REG,1 ;BREQ MULT1 CPI REG,2 BREQ MULT2 CPI REG,3 BREQ MULT3 CPI REG,4 BREQ MULT4 ;Bity 2 a 3 jsou stále 1 kvůli pullup odporům vstupů tlačítek. ;MULT1: MOV REG,CIF1 SBRS CIF1,7 RCALL ZOBRAZ SBRC CIF1,7 RCALL ZOBRAZDEN1 SBRC TECKY,2 ANDI REG,127 ;tohle rozsvěcí tečku na nejvyšším bitu OUT PORT,REG SBI PORT2,0 RET MULT2: MOV REG,CIF2 SBRS CIF2,7 RCALL ZOBRAZ SBRC CIF2,7 RCALL ZOBRAZDEN2 SBRC TECKY,0 ANDI REG,127 ;tohle rozsvěcí tečku na nejvyšším bitu OUT PORT,REG SBI PORT2,1 RET MULT3: MOV REG,CIF3 RCALL ZOBRAZ SBRC TECKY,1 ANDI REG,127 ;tohle rozsvěcí tečku na nejvyšším bitu OUT PORT,REG SBI PORT2,4 RET MULT4: MOV REG,CIF4 CPI REG,0 BRNE CIF4_NE0 LDI REG,10 CIF4_NE0: RCALL ZOBRAZ LDS REG2,BUDIK_MOD CPI REG2,0 BREQ BUDIK_LED_NE ANDI REG,127 ;tohle rozsvěcí tečku na nejvyšším bitu BUDIK_LED_NE: CPI MODREG,5 BRLO BLIKBUDLEDNE CPI MODREG,8 BRSH BLIKBUDLEDNE ORI REG,128 SBRS DELREG,4 ANDI REG,127 ;tohle rozsvěcí tečku na nejvyšším bitu BLIKBUDLEDNE: OUT PORT,REG SBI PORT2,6 RET ZOBRAZ: CPI REG,14 BRSH ZOBRAZ_MIMO LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) RJMP SKOC ZOBRAZDEN1: SUBI REG,128 CPI REG,8 BRSH ZOBRAZ_MIMO LDI ZH,HIGH(2*TABULKA_DEN1) LDI ZL,LOW(2*TABULKA_DEN1) RJMP SKOC ZOBRAZDEN2: SUBI REG,128 CPI REG,8 BRSH ZOBRAZ_MIMO LDI ZH,HIGH(2*TABULKA_DEN2) LDI ZL,LOW(2*TABULKA_DEN2) ;RJMP SKOC SKOC: ADD ZL,REG ADC ZH,NULA LPM REG,Z RET ZOBRAZ_MIMO: LDI REG,0b11111110 RET TABULKA: .DB 0b11000000,0b11111001 ;0, 1 .DB 0b10100100,0b10110000 ;2, 3 .DB 0b10011001,0b10010010 ;4, 5 .DB 0b10000010,0b11111000 ;6, 7 .DB 0b10000000,0b10010000 ;8, 9 .DB 0b11111111,0b10001000 ;Nic, A .DB 0b11000111,0b11100011 ;L, u TABULKA_DEN1: .DB 0b11111111,0b10100011 ;Nevyuzito, o .DB 0b10000111,0b10000111 ;t, t .DB 0b10000111,0b10001000 ;t, A .DB 0b10100011,0b10000110 ;o, E TABULKA_DEN2: .DB 0b11111111,0b10001100 ;Nevyuzito, P .DB 0b11000001,0b10010010 ;U, S .DB 0b11000110,0b10001100 ;C, P .DB 0b10010010,0b10101011 ;S, n