; 6-místné VFD (LED) hodiny s příjmem DCF-77 ; ATmega8A / 8L / 8 ; krystal 4 MHz ; Vytvořeno 30. III. 2016, upraveno 3. V. 2022 ; Autor: DANYK ; danyk.cz/avr_vfd.html ; danyk.cz/avr_dcf.html .NOLIST .INCLUDE "m8def.inc" .LIST ; Registry .DEF DELKA_N=R0 ; .DEF DELKA_A=R1 ; .DEF FILTR=R2 ; .DEF MAX=R3 ;0xFF .DEF DELREG2=R4 ;deleni II .DEF JAS=R5 ;jas displeje .DEF PROVOZ1=R6 ; .DEF PROVOZ2=R7 ; .DEF PROVOZ3=R8 ; .DEF CASDAT=R9 ; stridave zobrazeni casu a data .DEF MULT=R10 ; multiplex .DEF NULA=R11 ; 0 .DEF CIF1=R12 ; cifra 1 (vpravo) .DEF CIF2=R13 ; .DEF ZVONI=R14 ; .DEF DELREG=R15 ;deleni z 16Hz na 1Hz .DEF REG=R16 ;docasny registr 1 .DEF REG2=R17 ;docasny registr 2 .DEF CIF3=R18 ; .DEF CIF4=R19 ; .DEF CIF5=R20 ; .DEF CIF6=R21 ; cifra 6 (vlevo) .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 ;stav tecek .DEF MODREG=R29 ;registr módu ; Konstanty .EQU KONST_FILTR=49 ; SRAM .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 POSUV1=0x0071 .EQU POSUV2=0x0072 .EQU POSUV3=0x0073 .EQU POSUV4=0x0074 .EQU POSUV5=0x0075 .EQU DCF_ZAP=0x0076 .EQU POSLED1=0x0077 .EQU POSLED2=0x0078 .EQU POSLED3=0x0079 .EQU POSLED4=0x007A .EQU POSLED5=0x007B .EQU POSLED6=0x007C .EQU SERVIS1=0x007D .EQU SERVIS2=0x007E .EQU SERVIS_D=0x007F .EQU SERVIS_STAV=0x0080 .EQU NOC=0x0081 .EQU PRVNI_SYNCH=0x0082 .EQU A_MIN1=0x0083 .EQU A_MIN2=0x0084 .EQU A_HOD1=0x0085 .EQU A_HOD2=0x0086 .EQU A_DEN1=0x0087 .EQU A_DEN2=0x0088 .EQU A_MESIC1=0x0089 .EQU A_MESIC2=0x008A .EQU A_ROK1=0x008B .EQU A_ROK2=0x008C .EQU A_DEN_TYDNE=0x008D .EQU B_MIN1=0x008E .EQU B_MIN2=0x008F .EQU B_HOD1=0x0090 .EQU B_HOD2=0x0091 .EQU B_DEN1=0x0092 .EQU B_DEN2=0x0093 .EQU B_MESIC1=0x0094 .EQU B_MESIC2=0x0095 .EQU B_ROK1=0x0096 .EQU B_ROK2=0x0097 .EQU B_DEN_TYDNE=0x0098 .EQU JAZ=0x0099 ; EEPROM .EQU EE_BYTE1=95 .EQU EE_BYTE2=96 .EQU EE_BYTE3=97 .EQU EE_JAS=98 .EQU EE_MOD=99 .EQU EE_NOC=100 .EQU EE_AUTOCAS=101 .EQU EE_BUDIK34=102 .EQU EE_BUDIK2=103 .EQU EE_BUDIK1=104 .EQU EE_BUDIK_MOD=105 .EQU EE_JAZ=106 ; Porty .EQU SMER=DDRD .EQU PORT=PORTD .EQU PINY=PIND .EQU SMER2=DDRC .EQU PORT2=PORTC .EQU SMER3=DDRB .EQU PORT3=PORTB .EQU PINY3=PINB .CSEG .ORG 0 RJMP START ; vnejsi preruseni INT0 - signal DCF .ORG INT0addr CLR FILTR RETI ; vnitřní přerušení čítacem 2 - output compare .ORG OC2addr RJMP CITAC2 ; vnitřní přerušení čítacem 2 - přetečení .ORG OVF2addr RJMP PRETECENI2 ; vnitřní přerušení čítacem 1 - CTC .ORG OC1Aaddr RJMP CITAC1 ; vnitřní přerušení čítacem 0 - přetečení .ORG OVF0addr RJMP PRETECENI0 START: CLI ;nastaví port D ;výstupy aktivní 0 pro anody-segmenty VFD přes PNP / katody LED displeje spol. anoda přímo ;kromě PD2 (INT0) = vstup s pullup odporem LDI REG,0b11111011 OUT SMER,REG LDI REG,0b11111111 OUT PORT,REG ;nastaví port C - výstupy pro mřížky VFD přes PNP / anody LED displeje spol. anoda přes PNP LDI REG,0b111111 OUT SMER2,REG LDI REG,0b111111 OUT PORT2,REG ;nastaví port B - 0, 1 vstupy pro tlačítka, 3 propojka mazání EEPROM ;2 - výstup sirény (je mimo alarm nastaven na pullup) ;5 - výstup pro anodu VFD / katodu LED - tečku LDI REG,0b100000 OUT SMER3,REG LDI REG,0b111111 OUT PORT3,REG LDI REG,LOW(RAMEND) OUT SPL,REG LDI REG,HIGH(RAMEND) OUT SPH,REG ; vynuluje/presnastavi registry CLR FILTR DEC FILTR CLR DELKA_N CLR DELKA_A CLR ZVONI CLR TECKY LDI REG,15 MOV DELREG,REG LDI REG,19 MOV DELREG2,REG ;LDI MODREG,1 LDI REG,5 MOV MULT,REG ;LDI REG,5 ;MOV JAS,REG SER REG MOV MAX,REG CLR NULA CLR REG CLR REG2 MOVW SEK1,REG MOVW MIN1,REG MOVW HOD1,REG MOVW CIF1,REG MOVW CIF3,REG MOVW CIF5,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 DOBA_TLAC,REG ;STS BUDIK_MOD,REG ;STS BUDIK1,REG ;STS BUDIK2,REG ;STS BUDIK3,REG ;STS BUDIK4,REG STS POSUV1,REG STS POSUV2,REG STS POSUV3,REG STS POSUV4,REG STS POSUV5,REG STS SERVIS1,REG STS SERVIS2,REG STS SERVIS_D,REG STS SERVIS_STAV,REG STS PRVNI_SYNCH,REG STS JAZ,REG LDI REG,1 MOV CASDAT,REG ;STS AUTOCAS,REG ;automaticky letni cas (0-ne, 1-ano) STS DEN1,REG ;datum STS MESIC1,REG ;datum STS DEN_TYDNE,REG ;den v týdnu STS DCF_ZAP,REG ;zapnuti synchronizace s DCF STS ROK2,REG ;rok - vyssi cifra (posledniho dvojcisli) LDI REG,6 STS ROK1,REG ;rok - nizsi cifra (posledniho dvojcisli) LDI REG,9 STS POSLED1,REG STS POSLED3,REG STS POSLED5,REG STS POSLED6,REG LDI REG,5 STS POSLED2,REG STS POSLED4,REG ; NASTAVENI CASOVACU A JEJICH PRERUSENI ;-------------------------------------------- LDI REG,0b00000010 ; preddeli 8 OUT TCCR0,REG ; LDI REG,0b00000000 ; nastavi c/c na nulovani pri dosazeni porovnavane... OUT TCCR1A,REG ; ...hodnoty (tzv. CTC), OC1A,B nevyuzity, preddeleni 8 LDI REG,0b00001010 ; ... OUT TCCR1B,REG ; ... LDI REG,HIGH(31249) ; nastavi porovnavanou hodnotu-horni byte OUT OCR1AH,REG ; LDI REG,LOW(31249) ; nastavi porovnavanou hodnotu-dolni byte OUT OCR1AL,REG ; deli se n+1 LDI REG,0b00000011 ; normal mode, preddeli 32 OUT TCCR2,REG ; LDI REG,254 ; nastavi porovnavanou hodnotu (f se deli n+1) OUT OCR2,REG ; citac 2 LDI REG,0b11010001 ; povoli preruseni OCIE2, TOIE2, OCIE1A a TOIE0 OUT TIMSK,REG ; ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG ;povoli preruseni INT0 LDI REG,0b01000000 OUT GICR,REG ;Sleep mode = Idle, citlivost INT0 - sestupna hrana LDI REG,0b10000010 OUT MCUCR,REG ;zjisti, zda je EEPROM pocitadla provoz. hodin pripravena (bajt EE_BYTE3 neni 0xFF). ;pokud bajt EE_BYTE3 = 0xFF, nastavi vsechny bajty na 0x00. CEKEJ_EE_INIC: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC LDI REG,EE_BYTE3 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR CPI REG,0xFF BRNE NEMAZAT_EE RCALL MAZAT_CELOU_EE NEMAZAT_EE: ;zjisti, zda je EEPROM jas OK (bajt EE_JAS je 0 - 5). ;pokud ne, nastavi ho na 3 CEKEJ_EE_INIC2: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC2 LDI REG,EE_JAS OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN JAS,EEDR LDI REG,6 CP JAS,REG BRLO JAS_OK LDI REG,3 MOV JAS,REG EE_JAS_INIC_CEK: SBIC EECR,EEWE RJMP EE_JAS_INIC_CEK LDI REG,EE_JAS OUT EEARL,REG OUT EEARH,NULA OUT EEDR,JAS SBI EECR,EEMWE SBI EECR,EEWE JAS_OK: ;zjisti, zda je EEPROM mod OK (bajt EE_MOD je 1 nebo 2). ;pokud ne, nastavi ho na 1 CEKEJ_EE_INIC5: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC5 LDI REG,EE_MOD OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN MODREG,EEDR LDI REG,1 CP MODREG,REG BREQ MOD_OK LDI REG,2 CP MODREG,REG BREQ MOD_OK LDI REG,1 MOV MODREG,REG EE_MOD_INIC_CEK: SBIC EECR,EEWE RJMP EE_MOD_INIC_CEK LDI REG,EE_MOD OUT EEARL,REG OUT EEARH,NULA OUT EEDR,MODREG SBI EECR,EEMWE SBI EECR,EEWE MOD_OK: ;zjisti, zda je EEPROM jazyk OK (bajt EE_JAZ je 0 až 1). ;pokud ne, nastaví ho na 0 CEKEJ_EE_INIC10: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC10 LDI REG,EE_JAZ OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR LDI REG,2 CP REG2,REG BRLO JAZ_OK LDI REG2,0 EE_JAZ_INIC_CEK: SBIC EECR,EEWE RJMP EE_JAZ_INIC_CEK LDI REG,EE_JAZ OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE JAZ_OK: STS JAZ,REG2 ;zjisti, zda je EEPROM nocni OK (bajt EE_NOC je 0 az 2). ;pokud ne, nastavi ho na 0 CEKEJ_EE_INIC8: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC8 LDI REG,EE_NOC OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR LDI REG,3 CP REG2,REG BRLO NOC_OK LDI REG2,0 EE_NOC_INIC_CEK: SBIC EECR,EEWE RJMP EE_NOC_INIC_CEK LDI REG,EE_NOC OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE NOC_OK: STS NOC,REG2 ;zjisti, zda je EEPROM autocas OK (bajt EE_AUTOCAS je 0 az 1). ;pokud ne, nastavi ho na 1 CEKEJ_EE_INIC9: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC9 LDI REG,EE_AUTOCAS OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR LDI REG,2 CP REG2,REG BRLO AUTOCAS_OK LDI REG2,1 EE_AUTOCAS_INIC_CEK: SBIC EECR,EEWE RJMP EE_AUTOCAS_INIC_CEK LDI REG,EE_AUTOCAS OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE AUTOCAS_OK: STS AUTOCAS,REG2 ;zjisti, zda budik v EEPROM je OK ;(bajt EE_BUDIK1 a EE_BUDIK3 je 0 - 9). ;(bajt EE_BUDIK2 je 0 - 5). ;(bajt EE_BUDIK4 je 0 - 2). ;pokud ne, nastavi na vychozi hodnotu ;budik - mod CEKEJ_INIC_A_BUDIK_MOD: SBIC EECR,EEWE RJMP CEKEJ_INIC_A_BUDIK_MOD LDI REG,EE_BUDIK_MOD OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR CPI REG2,4 BRLO INIC_OK_BUDIK_MOD LDI REG2,0 ;vychozi hodnota CEKEJ_INIC_B_BUDIK_MOD: SBIC EECR,EEWE RJMP CEKEJ_INIC_B_BUDIK_MOD LDI REG,EE_BUDIK_MOD OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE INIC_OK_BUDIK_MOD: STS BUDIK_MOD,REG2 ;budik 1 CEKEJ_INIC_A_BUDIK1: SBIC EECR,EEWE RJMP CEKEJ_INIC_A_BUDIK1 LDI REG,EE_BUDIK1 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR CPI REG2,10 BRLO INIC_OK_BUDIK1 LDI REG2,0 ;vychozi hodnota CEKEJ_INIC_B_BUDIK1: SBIC EECR,EEWE RJMP CEKEJ_INIC_B_BUDIK1 LDI REG,EE_BUDIK1 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE INIC_OK_BUDIK1: STS BUDIK1,REG2 ;budik 2 CEKEJ_INIC_A_BUDIK2: SBIC EECR,EEWE RJMP CEKEJ_INIC_A_BUDIK2 LDI REG,EE_BUDIK2 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR CPI REG2,6 BRLO INIC_OK_BUDIK2 LDI REG2,0 ;vychozi hodnota CEKEJ_INIC_B_BUDIK2: SBIC EECR,EEWE RJMP CEKEJ_INIC_B_BUDIK2 LDI REG,EE_BUDIK2 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE INIC_OK_BUDIK2: STS BUDIK2,REG2 ;budik 34 CEKEJ_INIC_A_BUDIK34: SBIC EECR,EEWE RJMP CEKEJ_INIC_A_BUDIK34 LDI REG,EE_BUDIK34 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR CPI REG2,24 BRLO INIC_OK_BUDIK34 LDI REG2,0 ;vychozi hodnota CEKEJ_INIC_B_BUDIK34: SBIC EECR,EEWE RJMP CEKEJ_INIC_B_BUDIK34 LDI REG,EE_BUDIK34 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE INIC_OK_BUDIK34: CLR REG CPI REG2,10 BRLO HODBUD_DO_10 SUBI REG2,10 INC REG CPI REG2,10 BRLO HODBUD_DO_10 SUBI REG2,10 INC REG HODBUD_DO_10: STS BUDIK3,REG2 STS BUDIK4,REG /* ;TEST !!!! ;pouze pro nahrani zkusebnich dat do EEPROM, jinak nechat zakoment. LDI REG2,EE_BYTE3 SMYCKA_A: SBIC EECR,EEWE RJMP SMYCKA_A OUT EEARL,REG2 OUT EEARH,NULA LDI REG,0 ;data do byte3 OUT EEDR,REG SBI EECR,EEMWE SBI EECR,EEWE LDI REG2,EE_BYTE2 SMYCKA_B: SBIC EECR,EEWE RJMP SMYCKA_B OUT EEARL,REG2 OUT EEARH,NULA LDI REG,0 ;data do byte2 OUT EEDR,REG SBI EECR,EEMWE SBI EECR,EEWE LDI REG2,EE_BYTE1 SMYCKA_C: SBIC EECR,EEWE RJMP SMYCKA_C OUT EEARL,REG2 OUT EEARH,NULA LDI REG,196 ;data do vsech byte1 OUT EEDR,REG SBI EECR,EEMWE SBI EECR,EEWE DEC REG2 BRBC 2,SMYCKA_C */ ;hlavní smyčka SMYCKA: SEI ;povoli globalni preruseni SLEEP RJMP SMYCKA DCF_TAKT: ;inkrementuje delku neaktivniho CPSE DELKA_N,MAX INC DELKA_N ;zjisti, zda je aktivni nebo ne LDI REG,KONST_FILTR CP FILTR,REG BRSH NEAKTIVNI ;----------------------------------------- ;AKTIVNI: ;inkrementuje delku aktivniho CPSE DELKA_A,MAX INC DELKA_A STS SERVIS_STAV,NULA RET ;----------------------------------------- ;neaktivni NEAKTIVNI: MOV REG2,DELKA_A CLR DELKA_A CPI REG2,4 ;min delka kratkeho BRLO NEAKT_KONEC CPI REG2,117 ;prilis dlouhy pulz BRSH NECO_MOC_DLOUHEHO LDI REG,1 STS SERVIS_STAV,REG MOV REG,DELKA_N ADD REG,REG2 BRCS PRETECENI_DELKY CPI REG,88 ;potlaceni predcasneho pulzu BRLO NEAKT_KONEC PRETECENI_DELKY: LDI REG,2 STS SERVIS_STAV,REG ;prida bit do posuvneho registru podle delky pulzu v REG2 RCALL DO_POSUV_REG LDI REG,147 ;hranice mezera / dvojita mezera CP DELKA_N,REG BRLO NENI_CELA_MIN LDI REG,245 ;hranice mezera / dvojita mezera CP DELKA_N,REG BRSH NECO_MOC_DLOUHEHO LDI REG,3 STS SERVIS_STAV,REG ;vyhodnoti prijaty kod RCALL PRIJEM NECO_MOC_DLOUHEHO: CLR REG STS POSUV1,REG STS POSUV2,REG STS POSUV3,REG STS POSUV4,REG STS POSUV5,REG NENI_CELA_MIN: CLR DELKA_N NEAKT_KONEC: RET ;prida bit do posuvneho registru podle delky pulzu v REG2 DO_POSUV_REG: LDS REG,POSUV5 LSR REG STS POSUV5,REG LDS REG,POSUV4 ROR REG STS POSUV4,REG LDS REG,POSUV3 ROR REG STS POSUV3,REG LDS REG,POSUV2 ROR REG STS POSUV2,REG LDS REG,POSUV1 ROR REG STS POSUV1,REG STS SERVIS_D,NULA CPI REG2,17 ;hranice kratky/dlouhy BRLO LOG_NULA LDS REG,POSUV5 ORI REG,0b10000000 STS POSUV5,REG LDI REG,1 STS SERVIS_D,REG LOG_NULA: ;servisni indikator LDS REG,SERVIS1 INC REG STS SERVIS1,REG CPI REG,10 BRLO KONEC_SERVIS STS SERVIS1,NULA LDS REG,SERVIS2 INC REG STS SERVIS2,REG CPI REG,10 BRLO KONEC_SERVIS LDI REG,18 STS SERVIS2,REG KONEC_SERVIS: RET PRIJEM: LDS REG,DCF_ZAP SBRS REG,0 RJMP CHYBA ;kontrola parity a spravnosti prijmu ;bit 0 musi byt 1 LDS REG2,POSUV1 SBRS REG2,0 RJMP CHYBA ;bit 39 musi byt 0 LDS REG2,POSUV5 SBRC REG2,7 RJMP CHYBA ;parita minut LDS REG,POSUV1 LDS REG2,POSUV2 LSR REG2 ROR REG MOV REG2,REG ;test parity SWAP REG EOR REG2,REG MOV REG,REG2 LSR REG2 LSR REG2 EOR REG,REG2 MOV REG2,REG LSR REG2 EOR REG,REG2 SBRC REG,0 RJMP CHYBA ;parita hodin LDS REG,POSUV2 ANDI REG,0b11111110 MOV REG2,REG ;test parity SWAP REG EOR REG2,REG MOV REG,REG2 LSR REG2 LSR REG2 EOR REG,REG2 MOV REG2,REG LSR REG2 EOR REG,REG2 SBRC REG,0 RJMP CHYBA ;parita data LDS REG,POSUV3 LDS REG2,POSUV4 EOR REG,REG2 LDS REG2,POSUV5 EOR REG,REG2 MOV REG2,REG SWAP REG EOR REG2,REG MOV REG,REG2 LSR REG2 LSR REG2 EOR REG,REG2 MOV REG2,REG LSR REG2 EOR REG,REG2 SBRC REG,0 RJMP CHYBA ;test minut 0-9 LDS REG,POSUV1 LSR REG ANDI REG,0b1111 CPI REG,10 BRLO MINUTY_OK RJMP CHYBA MINUTY_OK: ;test desitky minut 0-5 LDS REG,POSUV1 LSR REG SWAP REG ANDI REG,0b0111 CPI REG,6 BRLO MINUTY2_OK RJMP CHYBA MINUTY2_OK: ;test hodin 0-23 (jednotky 0-9) LDS REG2,POSUV2 LSR REG2 MOV REG,REG2 ANDI REG,0b1111 SWAP REG2 ANDI REG2,0b0011 CPI REG,10 BRSH CHYBA CPI REG,4 LDI REG,2 CPC REG2,REG BRSH CHYBA ;test dne 1-31 (jednotky 0-9) LDS REG2,POSUV3 MOV REG,REG2 ANDI REG,0b1111 SWAP REG2 ANDI REG2,0b0011 CPI REG,10 BRSH CHYBA CP REG,NULA CPC REG2,NULA BREQ CHYBA CPI REG,2 LDI REG,3 CPC REG2,REG BRSH CHYBA ;test den_v_tydnu 1-7 LDS REG,POSUV3 LDS REG2,POSUV4 LSL REG ROL REG2 LSL REG ROL REG2 ANDI REG2,0b0111 CPI REG2,0 BREQ CHYBA ;test mesice 1-12 (jednotky 0-9) LDS REG2,POSUV4 LSR REG2 MOV REG,REG2 ANDI REG,0b1111 SWAP REG2 ANDI REG2,0b0001 CPI REG,10 BRSH CHYBA CP REG,NULA CPC REG2,NULA BREQ CHYBA CPI REG,3 LDI REG,1 CPC REG2,REG BRSH CHYBA ;test roku (0-9) (0-9) LDS REG,POSUV4 LDS REG2,POSUV5 LSL REG ROL REG2 LSL REG ROL REG2 MOV REG,REG2 ANDI REG,0b1111 SWAP REG2 ANDI REG2,0b1111 CPI REG,10 BRSH CHYBA CPI REG2,10 BRSH CHYBA ; prijat dobry vzorek RCALL DOBRY_VZOREK CHYBA: RET ;vzorek B pokročí o 1 min, porovná ho to pak s následujícím vzorkem A pro kontrolu ;(kromě úplně prvního nařízení) VZOREK_POKROCI: LDS REG,B_MIN1 INC REG ;zvýší B_MIN1 STS B_MIN1,REG CPI REG,10 ;ověří, jestli tam neni 10 BRLO POKROCI_KONEC ;pokud ne, celé to končí STS B_MIN1,NULA ;pokud ano, vynuluje jí to LDS REG,B_MIN2 INC REG ;a zvýší B_MIN2 STS B_MIN2,REG CPI REG,6 ;ověří, jestli tam neni 6 BRLO POKROCI_KONEC ;pokud ne, celé to končí STS B_MIN2,NULA ;pokud ano, vynuluje jí to LDS REG,B_HOD1 INC REG ; zvýší cifru B_HOD1 STS B_HOD1,REG CPI REG,10 ;ověří, jestli tam neni 10 BRLO POKROCI_KONTR24 ;pokud ne, skočí na kontrolu 24 STS B_HOD1,NULA ;pokud ano, vynuluje jí to LDS REG,B_HOD2 INC REG ;a zvýší B_HOD2 STS B_HOD2,REG POKROCI_KONTR24: LDS REG,B_HOD1 CPI REG,4 ;kontrola, zda cifra B_HOD1 není 4 BRLO POKROCI_KONEC LDS REG,B_HOD2 CPI REG,2 ;a zda současně cifra B_HOD2 není 2 BRLO POKROCI_KONEC STS B_HOD1,NULA ;pokud ano, je 24 hodin, dojde k... STS B_HOD2,NULA ;...nulování obou cifer POKROCI_KONEC: RET ;prijat dobry vzorek DOBRY_VZOREK: ;ulozi vzorek do A RCALL ULOZIT_VZOREK ;zjisti, zda je to prvni dobry vzorek. Pokud ano, nastavi se bez porovnavani s predchozim LDS REG,PRVNI_SYNCH CPI REG,0 BRNE PRVNI_SYNCH_NE RCALL NASTAVIT LDI REG,1 STS PRVNI_SYNCH,REG RJMP UZ_NEPOROVNAVAT PRVNI_SYNCH_NE: ; pokud to není první dobrý vzorek, porovná vzorek ; A (nynější) a B (předchozí). Pokud jsou stejné, hodiny se nastaví. LDS REG,A_MIN1 LDS REG2,B_MIN1 CP REG,REG2 LDS REG,A_MIN2 LDS REG2,B_MIN2 CPC REG,REG2 LDS REG,A_HOD1 LDS REG2,B_HOD1 CPC REG,REG2 LDS REG,A_HOD2 LDS REG2,B_HOD2 CPC REG,REG2 LDS REG,A_DEN1 LDS REG2,B_DEN1 CPC REG,REG2 LDS REG,A_DEN2 LDS REG2,B_DEN2 CPC REG,REG2 LDS REG,A_MESIC1 LDS REG2,B_MESIC1 CPC REG,REG2 LDS REG,A_MESIC2 LDS REG2,B_MESIC2 CPC REG,REG2 LDS REG,A_ROK1 LDS REG2,B_ROK1 CPC REG,REG2 LDS REG,A_ROK2 LDS REG2,B_ROK2 CPC REG,REG2 LDS REG,A_DEN_TYDNE LDS REG2,B_DEN_TYDNE CPC REG,REG2 BRNE RUZNE_VZORKY RCALL NASTAVIT RUZNE_VZORKY: UZ_NEPOROVNAVAT: ;zkopíruje minulý vzorek z A do B LDS REG,A_MIN1 STS B_MIN1,REG LDS REG,A_MIN2 STS B_MIN2,REG LDS REG,A_HOD1 STS B_HOD1,REG LDS REG,A_HOD2 STS B_HOD2,REG LDS REG,A_DEN1 STS B_DEN1,REG LDS REG,A_DEN2 STS B_DEN2,REG LDS REG,A_MESIC1 STS B_MESIC1,REG LDS REG,A_MESIC2 STS B_MESIC2,REG LDS REG,A_ROK1 STS B_ROK1,REG LDS REG,A_ROK2 STS B_ROK2,REG LDS REG,A_DEN_TYDNE STS B_DEN_TYDNE,REG RET ULOZIT_VZOREK: ;uloží_minuty LDS REG2,POSUV1 LSR REG2 MOV REG,REG2 ANDI REG,0b1111 SWAP REG2 ANDI REG2,0b0111 STS A_MIN1,REG STS A_MIN2,REG2 ;ulozi hodiny LDS REG2,POSUV2 LSR REG2 MOV REG,REG2 ANDI REG,0b1111 SWAP REG2 ANDI REG2,0b0011 STS A_HOD1,REG STS A_HOD2,REG2 ;ulozi den LDS REG2,POSUV3 MOV REG,REG2 ANDI REG,0b1111 STS A_DEN1,REG SWAP REG2 ANDI REG2,0b0011 STS A_DEN2,REG2 ;ulozi den v tydnu LDS REG,POSUV3 LDS REG2,POSUV4 LSL REG ROL REG2 LSL REG ROL REG2 ANDI REG2,0b0111 STS A_DEN_TYDNE,REG2 ;ulozi mesic LDS REG2,POSUV4 LSR REG2 MOV REG,REG2 ANDI REG,0b1111 STS A_MESIC1,REG SWAP REG2 ANDI REG2,0b0001 STS A_MESIC2,REG2 ;ulozi rok LDS REG,POSUV4 LDS REG2,POSUV5 LSL REG ROL REG2 LSL REG ROL REG2 MOV REG,REG2 ANDI REG,0b1111 STS A_ROK1,REG SWAP REG2 ANDI REG2,0b1111 STS A_ROK2,REG2 RET ; Nastaví hodiny podle přijatého údaje NASTAVIT: ;vynuluje sekundy CLR SEK1 CLR SEK2 LDI REG,14 MOV DELREG,REG ;nastavi minuty LDS MIN1,A_MIN1 LDS MIN2,A_MIN2 ;nastavi hodiny LDS HOD1,A_HOD1 LDS HOD2,A_HOD2 ;nastavi den LDS REG,A_DEN1 STS DEN1,REG LDS REG,A_DEN2 STS DEN2,REG ;nastavi den v tydnu LDS REG,A_DEN_TYDNE STS DEN_TYDNE,REG ;nastavi mesic LDS REG,A_MESIC1 STS MESIC1,REG LDS REG,A_MESIC2 STS MESIC2,REG ;nastavi rok LDS REG,A_ROK1 STS ROK1,REG LDS REG,A_ROK2 STS ROK2,REG ;vynuluje pocitadlo casu od posledni uspesne synchronizace STS POSLED1,NULA STS POSLED2,NULA STS POSLED3,NULA STS POSLED4,NULA STS POSLED5,NULA STS POSLED6,NULA ;testuje budik RCALL BUDIKTEST RCALL JAS_MOD_DO_EE LDI REG,4 STS SERVIS_STAV,REG STS SERVIS1,NULA STS SERVIS2,NULA RET PRETECENI0: ;1953 Hz ;zjisteni stavu vstupu DCF IN REG,PINY SBRS REG,2 CLR FILTR ;inkrementace filtru, zastaví se na 255 CPSE FILTR,MAX INC FILTR DEC DELREG2 ;dělení / 20 BRPL DEL2_HOP LDI REG,19 MOV DELREG2,REG RCALL DCF_TAKT RCALL TLACITKA DEL2_HOP: SBRS ZVONI,1 ;budík zní/nezní RETI SBRS DELREG2,0 SBI PORT3,2 ;budik signal nabezna hrana SBRC DELREG2,0 CBI PORT3,2 ;budik signal sestupna hrana RETI PRETECENI2: ;600 Hz LDI REG,46 OUT TCNT2,REG OUT PORT2,MAX OUT PORT,MAX SBI PORT3,5 ;vypne tečky DEC MULT ;delení z 600 na 100 Hz BRPL MHOP LDI REG,5 MOV MULT,REG MHOP: RETI CITAC2: LDI ZL,LOW(MULT_SKOK) LDI ZH,HIGH(MULT_SKOK) ADD ZL,MULT ADC ZH,NULA IJMP MULT_SKOK: RJMP MULT0 RJMP MULT1 RJMP MULT2 RJMP MULT3 RJMP MULT4 RJMP MULT5 MULT0: LDI ZH,HIGH(2*TABULKA_ZNAK) LDI ZL,LOW(2*TABULKA_ZNAK) ADD ZL,CIF1 ADC ZH,NULA LPM REG,Z OUT PORT,REG ;tečka signalizující signál LDI REG2,KONST_FILTR CP FILTR,REG2 BRSH NEAKTIVNI_T ;SBRC TECKY,0 CBI PORT3,5 ;zapne tečku NEAKTIVNI_T: CPSE REG,MAX CBI PORT2,0 ;zapne mřížku VFD (anodu LED cifry) RETI MULT1: LDI ZH,HIGH(2*TABULKA_ZNAK) LDI ZL,LOW(2*TABULKA_ZNAK) ADD ZL,CIF2 ADC ZH,NULA LPM REG,Z OUT PORT,REG SBRC TECKY,1 CBI PORT3,5 ;zapne tečku CPSE REG,MAX CBI PORT2,1 ;zapne mřížku VFD (anodu LED cifry) RETI MULT2: LDI ZH,HIGH(2*TABULKA_ZNAK) LDI ZL,LOW(2*TABULKA_ZNAK) ADD ZL,CIF3 ADC ZH,NULA LPM REG,Z OUT PORT,REG SBRC TECKY,2 CBI PORT3,5 ;zapne tečku CPSE REG,MAX CBI PORT2,2 ;zapne mřížku VFD (anodu LED cifry) RETI MULT3: LDI ZH,HIGH(2*TABULKA_ZNAK) LDI ZL,LOW(2*TABULKA_ZNAK) ADD ZL,CIF4 ADC ZH,NULA LPM REG,Z OUT PORT,REG SBRC TECKY,3 CBI PORT3,5 ;zapne tečku CPSE REG,MAX CBI PORT2,3 ;zapne mřížku VFD (anodu LED cifry) RETI MULT4: LDI ZH,HIGH(2*TABULKA_ZNAK) LDI ZL,LOW(2*TABULKA_ZNAK) ADD ZL,CIF5 ADC ZH,NULA LPM REG,Z OUT PORT,REG SBRC TECKY,4 CBI PORT3,5 ;zapne tečku CPSE REG,MAX CBI PORT2,4 ;zapne mřížku VFD (anodu LED cifry) RETI MULT5: LDI ZH,HIGH(2*TABULKA_ZNAK) LDI ZL,LOW(2*TABULKA_ZNAK) ADD ZL,CIF6 ADC ZH,NULA LPM REG,Z OUT PORT,REG SBRC TECKY,5 CBI PORT3,5 ;zapne tečku CPSE REG,MAX CBI PORT2,5 ;zapne mřížku VFD (anodu LED cifry) RETI ;přerušení (16Hz) CITAC1: ;zdroj prerusovaneho tonu pro budik SBRS ZVONI,0 ;pokud neni budik RJMP NEPIPAT ;nepipa LDI REG,4 CP DELREG,REG BRLO NEPIPAT SBRC DELREG,0 RJMP NEPIPAT ; zapne ton SBI SMER3,2 ;nastavi PB2 jako vystup (behem pipnuti) LDI REG,0b00000010 OR ZVONI,REG RJMP PIPATO ;vypne ton NEPIPAT: LDI REG,0b11111101 AND ZVONI,REG CBI SMER3,2 ;nastavi PB1 jako vstup (aby bylo uplne ticho) SBI PORT3,2 ;a zapne pullup PIPATO: DEC DELREG ;deleni f/16 (16 Hz na 1 Hz) BRPL HOP LDI REG,15 MOV DELREG,REG RCALL PRIDEJS ;1x za sekundu inkrementuje čas RCALL PRIDEJ_POSLED ;1x za sekundu inkrementuje čas od poslední úspěšné. synchr. CLR NULA SER REG MOV MAX,REG DEC CASDAT ;dělení f/7 (1 Hz na 1/7 Hz) BRNE HOP LDI REG,7 MOV CASDAT,REG HOP: RCALL MOD ;obnoví údaje na displeji podle aktuálního módu SBRS DELREG,0 RETI ;jas a nocni jas MOV REG2,JAS LDS REG,NOC CPI REG,0 BREQ NOC_NE CPI HOD1,1 LDI REG,2 CPC HOD2,REG BRSH NOC_ANO CPI HOD1,5 CPC HOD2,NULA BRLO NOC_ANO RJMP NOC_NE NOC_ANO: LDS REG,NOC SUB REG2,REG BRCC JAS_CARRY_NE CLR REG2 JAS_CARRY_NE: NOC_NE: LDI ZH,HIGH(2*TABULKA_JAS) LDI ZL,LOW(2*TABULKA_JAS) ADD ZL,REG2 ADC ZH,NULA LPM REG,Z OUT OCR2,REG RETI ;tohle smaze (vynuluje) EEPROM pocitadla provoznich hodin na 0x00 !!!!!!!! ;pokud uz nejsou bajty 0x00 MAZAT_CELOU_EE: ;před mazáním vypne displej OUT PORT2,MAX OUT PORT,MAX SBI PORT3,5 ;vypne tečky LDI REG2,EE_BYTE3 SMYCKA_MAZ_EE: SBIC EECR,EEWE RJMP SMYCKA_MAZ_EE OUT EEARL,REG2 OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR CPI REG,0 BREQ NEMUSI_MAZAT SMYCKA_MAZ_EE2: SBIC EECR,EEWE RJMP SMYCKA_MAZ_EE2 OUT EEARL,REG2 OUT EEARH,NULA OUT EEDR,NULA SBI EECR,EEMWE SBI EECR,EEWE NEMUSI_MAZAT: DEC REG2 BRPL SMYCKA_MAZ_EE RET ;Pocitadlo provoznich hodin (pocita po 7-8 minutach) POC_PROVOZNI: ;prevede minuty z BCD na cislo, ulozi do REG MOV REG,MIN2 LSL REG LSL REG ADD REG,MIN2 LSL REG ADD REG,MIN1 ;zjisti, zda nastala zapocitavana osmina hodiny ;pokud ano, do REG2 ulozi hodnotu 0-7, jinak 255 LDI ZH,HIGH(2*TABULKA_PROV) LDI ZL,LOW(2*TABULKA_PROV) ADD ZL,REG ADC ZH,NULA LPM REG2,Z ;pokud 255, konci CPI REG2,255 BRNE ZAPOCITAVANA RCALL JAS_MOD_DO_EE ;ulozi nastaveni do EEPROM RET ZAPOCITAVANA: ;prevede hodiny z BCD na cislo, ulozi do REG MOV REG,HOD2 LSL REG LSL REG ADD REG,HOD2 LSL REG ADD REG,HOD1 ;prevede hodiny na 12hodinovy tvar (hodnota je v rozmezi 0 - 11) v REG CPI REG,12 BRLO DO_12 SUBI REG,12 DO_12: ;do REG se dostane adresa 0 az EE_BYTE1 podle toho, kolikata ;hodina v 12-hodinovem modu a osmina hodiny nastala LSL REG LSL REG LSL REG ADD REG,REG2 ;nacte spodni bajt z EEPROM - ulozeny v kruhu CEKEJ_EE_CTE: SBIC EECR,EEWE RJMP CEKEJ_EE_CTE OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR ;inkrementuje ho INC REG2 ;ulozi spodni bajt do EEPROM - ulozeny v kruhu CEKEJ_EE_PISE: SBIC EECR,EEWE RJMP CEKEJ_EE_PISE OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE CPI REG2,0 ;test preteceni spodniho bajtu BRNE EE_CARRY_NE LDI REG,EE_BYTE2 ;adresa prostredniho bajtu ;nacte prostredni bajt z EEPROM CEKEJ_EE_CTE2: SBIC EECR,EEWE RJMP CEKEJ_EE_CTE2 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR ;inkrementuje ho INC REG2 ;ulozi prostredni bajt do EEPROM CEKEJ_EE_PISE2: SBIC EECR,EEWE RJMP CEKEJ_EE_PISE2 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE CPI REG2,0 ;test preteceni prostredniho bajtu BRNE EE_CARRY_NE LDI REG,EE_BYTE3 ;adresa horniho bajtu ;nacte horni bajt z EEPROM CEKEJ_EE_CTE3: SBIC EECR,EEWE RJMP CEKEJ_EE_CTE3 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR ;inkrementuje ho INC REG2 ;test preteceni horniho bajtu CPI REG2,255 BRNE HORNI_NEPRETEK LDI REG2,254 HORNI_NEPRETEK: ;ulozi horni bajt do EEPROM CEKEJ_EE_PISE3: SBIC EECR,EEWE RJMP CEKEJ_EE_PISE3 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE EE_CARRY_NE: RET ;pocitani casu od posledni synchronizace PRIDEJ_POSLED: LDS REG,POSLED1 INC REG STS POSLED1,REG CPI REG,10 BRLO KONEC_POSL STS POSLED1,NULA LDS REG,POSLED2 INC REG STS POSLED2,REG CPI REG,6 BRLO KONEC_POSL STS POSLED2,NULA LDS REG,POSLED3 INC REG STS POSLED3,REG CPI REG,10 BRLO KONEC_POSL STS POSLED3,NULA LDS REG,POSLED4 INC REG STS POSLED4,REG CPI REG,6 BRLO KONEC_POSL STS POSLED4,NULA LDS REG,POSLED5 INC REG STS POSLED5,REG CPI REG,10 BRLO KONEC_POSL STS POSLED5,NULA LDS REG,POSLED6 INC REG STS POSLED6,REG CPI REG,10 BRLO KONEC_POSL LDI REG,9 STS POSLED1,REG STS POSLED3,REG STS POSLED5,REG STS POSLED6,REG LDI REG,5 STS POSLED2,REG STS POSLED4,REG KONEC_POSL: 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 ; zacatek - zapis provoznich hodin v XX:XX:30 CPI SEK2,3 BRNE NE_X30 RCALL POC_PROVOZNI ;pocitadlo provoznich hodin RCALL VZOREK_POKROCI NE_X30: 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ů aktualniho 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 (pokud 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ý letní č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: ;posun na letní čas - 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: ;posun na zimní čas - pokud je 03 hodin, posune na 02 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 jednorazovy, po spusteni signalu ho to deaktivuje. BRNE NEBUDIT STS BUDIK_MOD,NULA RCALL NASTAVENI_DO_EE NEBUDIT: RET TLACITKA: ;Zjištění stavu tlačítek. 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,PINY3 ;Zjistí stav tlačítek ANDI REG,0b11 STS STAV_TLAC,REG ;Uloží ho pro příští test CP REG2,REG ;pokud předchozí stav = současný, tlac. už nereaguje znovu BREQ NEREAGOVAT LDS REG2,PRODL_TLAC ;pokud neuplynula minimální prodleva, nereaguje znovu CPI REG2,0 BRNE NEREAGOVAT SBRS REG,1 RJMP NA_TLAC1 SBRS REG,0 RJMP NA_TLAC2 RJMP NEREAGOVAT NA_TLAC1: RCALL TLAC1 RJMP BYLO_TLAC NA_TLAC2: RCALL TLAC2 BYLO_TLAC: ;po volání rutiny tlačítka načte zpět stav tlačítek do REG LDS REG,STAV_TLAC NEREAGOVAT: LDI REG2,3 ;určuje prodlevu do další reakce (x cca 12ms) ;stisknutí/držení tlačítka nastaví prodlevu do další reakce SBRS REG,0 STS PRODL_TLAC,REG2 SBRS REG,1 STS PRODL_TLAC,REG2 ;tady zacina vyhodnoceni dlouheho stisku CPI REG,0b11 BREQ NIC_NEDRZI LDS REG2,DOBA_TLAC INC REG2 STS DOBA_TLAC,REG2 NIC_NEDRZI: 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 LDI REG2,92 STS DOBA_TLAC,REG2 CPI REG,0 BREQ NA_TLAC_OBE_D SBRS REG,1 RJMP NA_TLAC1_D SBRS REG,0 RJMP NA_TLAC2_D NE100: RET NA_TLAC_OBE_D: RCALL TLAC_OBE_D RET NA_TLAC1_D: RCALL TLAC1_D RET NA_TLAC2_D: RCALL TLAC2_D RET ; obnoví stav displeje podle aktuálního módu MOD: CLR TECKY LDI ZL,LOW(MOD_SKOK) LDI ZH,HIGH(MOD_SKOK) ADD ZL,MODREG ADC ZH,NULA IJMP MOD_SKOK: RJMP MOD1 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 RJMP MOD17 RJMP MOD18 RJMP MOD19 RJMP MOD20 RJMP MOD21 MOD2: LDI REG,6 CP CASDAT,REG BRLO MOD1 ;datum LDS CIF5,DEN_TYDNE LDS REG2,JAZ CPSE REG2,NULA ; pokud je zazyk angličtina, SUBI CIF5,230 ; +26 ...posune to v tabulce z českých na anglické dny MOV CIF6,CIF5 SUBI CIF5,246 SUBI CIF6,238 LDS CIF1,MESIC1 LDI REG,10 MOV CIF2,REG LDS REG,MESIC2 CPSE REG,NULA MOV CIF2,REG LDS CIF3,DEN1 LDI CIF4,10 LDS REG,DEN2 CPSE REG,NULA MOV CIF4,REG LDI TECKY,0b000100 RJMP Z_DAT_KONEC MOD1: MOVW CIF1,SEK1 MOVW CIF3,MIN1 MOV CIF5,HOD1 LDI CIF6,10 CPSE HOD2,NULA MOV CIF6,HOD2 ;zjisti, zda byla v poslednich 10min uspesna synchronizace LDS REG,POSLED4 CP REG,NULA LDS REG,POSLED5 CPC REG,NULA LDS REG,POSLED6 CPC REG,NULA BRNE NENI_SYNCH SBRS DELREG,3 NENI_SYNCH: LDI TECKY,0b010100 Z_DAT_KONEC: ;signalizace prave probehle synchronizace (1s) LDS REG,POSLED1 CP REG,NULA LDS REG,POSLED2 CPC REG,NULA LDS REG,POSLED3 CPC REG,NULA LDS REG,POSLED4 CPC REG,NULA LDS REG,POSLED5 CPC REG,NULA LDS REG,POSLED6 CPC REG,NULA BRNE NE_SIGNALIZ LDI TECKY,0b000100 SBRS DELREG,1 LDI TECKY,0b010000 NE_SIGNALIZ: RET MOD3: ;nastavi mod budiku RCALL NACTI_BUDIK SBRS DELREG,2 SBRS DELREG,1 RJMP BLIKHOP4 LDI REG,10 MOV CIF1,REG BLIKHOP4: RET MOD4: ;nastavi minuty budiku RCALL NACTI_BUDIK SBRS DELREG,2 SBRS DELREG,1 RJMP BLIKHOP5 LDI CIF3,10 BLIKHOP5: RET MOD5: ;nastavi desitky minut budiku RCALL NACTI_BUDIK SBRS DELREG,2 SBRS DELREG,1 RJMP BLIKHOP6 LDI CIF4,10 BLIKHOP6: RET MOD6: ;nastavi hodiny budiku RCALL NACTI_BUDIK SBRS DELREG,2 SBRS DELREG,1 RJMP BLIKHOP7 LDI CIF5,10 LDI CIF6,10 BLIKHOP7: RET MOD7: ;zapinani synchronizace s DCF LDI CIF6,27 LDI CIF5,30 LDI CIF4,31 LDI CIF3,10 LDI REG,10 MOV CIF2,REG SBRS DELREG,2 SBRS DELREG,1 LDS REG,DCF_ZAP MOV CIF1,REG RET MOD8: ;zapinani automatickeho letniho casu (dst - daylight saving time) LDI CIF6,27 LDI CIF5,28 LDI CIF4,29 LDI CIF3,10 LDI REG,10 MOV CIF2,REG SBRS DELREG,2 SBRS DELREG,1 LDS REG,AUTOCAS MOV CIF1,REG RET MOD9: ;zapinani nocniho stmivani (n.di - night dimming) LDI CIF6,10 LDI CIF5,32 LDI CIF4,27 LDI CIF3,33 LDI REG,10 MOV CIF2,REG SBRS DELREG,2 SBRS DELREG,1 LDS REG,NOC MOV CIF1,REG LDI TECKY,0b010000 RET MOD10: ;volba jazyka pro den v týdnu LDI CIF6,27 ;d LDI CIF5,26 ;A LDI CIF4,35 ;y LDI CIF3,10 ;nic LDI REG,10 ;nic MOV CIF2,REG MOV CIF1,REG LDS REG,JAZ CPI REG,0 ;0 = česky, 1 = anglicky BREQ DEN_CESKY LDI REG2,34 ;E LDI REG,32 ;n RJMP DEN_ANGL DEN_CESKY: LDI REG2,30 ;C LDI REG,34 ;E DEN_ANGL: SBRS DELREG,2 SBRS DELREG,1 MOVW CIF2:CIF1,REG2:REG ;LDI TECKY,0b010000 RET MOD11: ;nastaveni mesice LDS CIF5,DEN_TYDNE LDS REG2,JAZ CPSE REG2,NULA ; pokud je zazyk angličtina, SUBI CIF5,230 ; +26 ...posune to v tabulce z českých na anglické dny MOV CIF6,CIF5 SUBI CIF5,246 SUBI CIF6,238 LDS CIF3,DEN1 LDI REG,10 MOV CIF1,REG MOV CIF2,REG LDS REG,MESIC1 LDS REG2,MESIC2 SBRS DELREG,2 SBRS DELREG,1 MOVW CIF1,REG MOV REG,CIF2 LDI REG2,10 MOV CIF2,REG2 CPSE REG,NULA MOV CIF2,REG LDS REG,DEN2 LDI CIF4,10 CPSE REG,NULA MOV CIF4,REG LDI TECKY,0b010101 RET MOD12: ;nastaveni dne LDS CIF5,DEN_TYDNE LDS REG2,JAZ CPSE REG2,NULA ; pokud je zazyk angličtina, SUBI CIF5,230 ; +26 ...posune to v tabulce z českých na anglické dny MOV CIF6,CIF5 SUBI CIF5,246 SUBI CIF6,238 LDS CIF1,MESIC1 LDS REG,DEN1 LDS REG2,DEN2 LDI CIF3,10 LDI CIF4,10 SBRS DELREG,2 SBRS DELREG,1 MOVW CIF3,REG LDI REG,10 MOV CIF2,REG LDS REG,MESIC2 CPSE REG,NULA MOV CIF2,REG MOV REG,CIF4 LDI CIF4,10 CPSE REG,NULA MOV CIF4,REG LDI TECKY,0b010101 RET MOD13: ;nastaveni dne v tydnu LDS REG,DEN_TYDNE LDS REG2,JAZ CPSE REG2,NULA ; pokud je zazyk angličtina, SUBI REG,230 ; +26 ...posune to v tabulce z českých na anglické dny MOV REG2,REG SUBI REG,246 ; +10 SUBI REG2,238 ; +18 LDI CIF5,10 LDI CIF6,10 SBRS DELREG,2 SBRS DELREG,1 MOVW CIF5,REG LDS CIF1,MESIC1 LDS CIF3,DEN1 LDI REG,10 MOV CIF2,REG LDS REG,MESIC2 CPSE REG,NULA MOV CIF2,REG LDI CIF4,10 LDS REG,DEN2 CPSE REG,NULA MOV CIF4,REG LDI TECKY,0b010101 RET MOD14: ;nastaveni roku LDI CIF6,10 LDI CIF5,10 LDI CIF4,10 LDI CIF3,10 LDI REG,10 MOV CIF1,REG MOV CIF2,REG SBRS DELREG,2 SBRS DELREG,1 LDI CIF4,2 SBRS DELREG,2 SBRS DELREG,1 LDI CIF3,0 SBRS DELREG,2 SBRS DELREG,1 LDS CIF1,ROK1 SBRS DELREG,2 SBRS DELREG,1 LDS CIF2,ROK2 RET MOD15: ;nastaveni sekund LDI REG,10 MOV CIF1,REG MOV CIF2,REG SBRS DELREG,2 SBRS DELREG,1 MOVW CIF1,SEK1 MOVW CIF3,MIN1 MOV CIF5,HOD1 LDI CIF6,10 CPSE HOD2,NULA MOV CIF6,HOD2 LDI TECKY,0b010100 RET MOD16: ;nastaveni jednotek minut MOVW CIF1,SEK1 LDI CIF3,10 MOV CIF4,MIN2 SBRS DELREG,2 SBRS DELREG,1 MOV CIF3,MIN1 MOV CIF5,HOD1 LDI CIF6,10 CPSE HOD2,NULA MOV CIF6,HOD2 LDI TECKY,0b010100 RET MOD17: ;nastaveni desitek minut MOVW CIF1,SEK1 LDI CIF4,10 MOV CIF3,MIN1 SBRS DELREG,2 SBRS DELREG,1 MOV CIF4,MIN2 MOV CIF5,HOD1 LDI CIF6,10 CPSE HOD2,NULA MOV CIF6,HOD2 LDI TECKY,0b010100 RET MOD18: ;nastaveni hodin MOVW CIF1,SEK1 MOVW CIF3,MIN1 LDI REG,10 LDI REG2,10 SBRS DELREG,2 SBRS DELREG,1 MOVW REG,HOD1 MOV CIF5,REG LDI CIF6,10 CPSE REG2,NULA MOV CIF6,REG2 LDI TECKY,0b010100 RET MOD19: ;servisni MOVW CIF1,SEK1 LDS CIF3,SERVIS_STAV LDS CIF4,SERVIS_D LDS CIF5,SERVIS1 LDS CIF6,SERVIS2 LDI TECKY,0b011100 RET MOD20: ;doba (s) od posledni uspesne synchronizace LDS CIF1,POSLED1 LDS CIF2,POSLED2 LDS CIF3,POSLED3 LDS CIF4,POSLED4 LDS CIF5,POSLED5 LDS CIF6,POSLED6 SBRS DELREG,1 LDI TECKY,0b010100 RET MOD21: ;pocitadlo provoznich hodin SBRS DELREG,2 SBRS DELREG,1 RJMP KONEC_ZOBR_PH CLR CIF1 CLR CIF2 CLR CIF3 CLR CIF4 CLR CIF5 CLR CIF6 CLR PROVOZ1 CLR PROVOZ2 CLR PROVOZ3 CEKEJ_ZOBRAZ_EE3: SBIC EECR,EEWE RJMP CEKEJ_ZOBRAZ_EE3 LDI REG2,EE_BYTE3 OUT EEARL,REG2 OUT EEARH,NULA SBI EECR,EERE IN PROVOZ3,EEDR CEKEJ_ZOBRAZ_EE2: SBIC EECR,EEWE RJMP CEKEJ_ZOBRAZ_EE2 LDI REG2,EE_BYTE2 OUT EEARL,REG2 OUT EEARH,NULA SBI EECR,EERE IN PROVOZ2,EEDR LDI REG2,EE_BYTE1 SMYCKA_ZOBRAZ_EE: SBIC EECR,EEWE RJMP SMYCKA_ZOBRAZ_EE OUT EEARL,REG2 OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR ADD PROVOZ1,REG ADC PROVOZ2,NULA ADC PROVOZ3,NULA LDI REG,255 CP PROVOZ3,REG BRNE PROVOZ_MAX_NE DEC PROVOZ3 PROVOZ_MAX_NE: DEC REG2 BRBC 2,SMYCKA_ZOBRAZ_EE ;deleni 8 LSR PROVOZ3 ROR PROVOZ2 ROR PROVOZ1 LSR PROVOZ3 ROR PROVOZ2 ROR PROVOZ1 LSR PROVOZ3 ROR PROVOZ2 ROR PROVOZ1 ;kontrola, zda neni nad 999 999 LDI REG,BYTE1(1000000) ;24-bitova podminka mensi nez 1 000 000 CP PROVOZ1,REG LDI REG,BYTE2(1000000) CPC PROVOZ2,REG LDI REG,BYTE3(1000000) CPC PROVOZ3,REG BRLO POD_1000000 LDI REG,9 MOV CIF1,REG MOV CIF2,REG MOV CIF3,REG MOV CIF4,REG MOV CIF5,REG MOV CIF6,REG RJMP KONEC_ZOBR_PH POD_1000000: ;prevod 24-bit na 6 BCD ZNOVU_6: LDI REG,BYTE1(100000) ;24-bitova podminka mensi nez 100 000 CP PROVOZ1,REG LDI REG,BYTE2(100000) CPC PROVOZ2,REG LDI REG,BYTE3(100000) CPC PROVOZ3,REG BRLO MENSI_6 LDI REG,BYTE1(100000) SUB PROVOZ1,REG ;24-bitove odcitani cisla 100 000 od vysledku LDI REG,BYTE2(100000) SBC PROVOZ2,REG LDI REG,BYTE3(100000) SBC PROVOZ3,REG INC CIF6 RJMP ZNOVU_6 MENSI_6: ZNOVU_5: LDI REG,BYTE1(10000) ;24-bitova podminka mensi nez 10 000 CP PROVOZ1,REG LDI REG,BYTE2(10000) CPC PROVOZ2,REG LDI REG,BYTE3(10000) CPC PROVOZ3,REG BRLO MENSI_5 LDI REG,BYTE1(10000) SUB PROVOZ1,REG ;24-bitove odcitani cisla 10 000 od vysledku LDI REG,BYTE2(10000) SBC PROVOZ2,REG LDI REG,BYTE3(10000) SBC PROVOZ3,REG INC CIF5 RJMP ZNOVU_5 MENSI_5: ZNOVU1000: LDI REG,LOW(1000) CP PROVOZ1,REG LDI REG,HIGH(1000) CPC PROVOZ2,REG ;16-bitova podminka mensi nez 1000 BRLO POD1000 LDI REG,LOW(1000) SUB PROVOZ1,REG ;16-bitove odcitani čísla 1000 od vysledku LDI REG,HIGH(1000) SBC PROVOZ2,REG INC CIF4 RJMP ZNOVU1000 POD1000: ZNOVU100: LDI REG,LOW(100) CP PROVOZ1,REG LDI REG,HIGH(100) CPC PROVOZ2,REG ;16-bitova podminka mensi nez 100 BRLO POD100 LDI REG,LOW(100) ;16-bitove odcitani čísla 100 od vysledku SUB PROVOZ1,REG LDI REG,HIGH(100) SBC PROVOZ2,REG INC CIF3 RJMP ZNOVU100 POD100: ZNOVU10: LDI REG,10 ;8-bitova podminka mensi nez 10 CP PROVOZ1,REG BRLO POD10 LDI REG,10 SUB PROVOZ1,REG ;8-bitove odcitani čísla 10 od vysledku INC CIF2 RJMP ZNOVU10 POD10: MOV CIF1,PROVOZ1 KONEC_ZOBR_PH: RET NACTI_BUDIK: ;nacte zobrazeni casu budiku a jeho modu ;cifra 6 slouzi na chvili jako docasny registr :) LDS CIF6,BUDIK_MOD CPI CIF6,2 BREQ BUD_M2 CPI CIF6,3 BRNE BUD_M_HOTOVO ;BUD_M3: LDI CIF6,7 RJMP BUD_M_HOTOVO BUD_M2: LDI CIF6,5 BUD_M_HOTOVO: MOV CIF1,CIF6 LDI REG,26 MOV CIF2,REG LDS CIF3,BUDIK1 LDS CIF4,BUDIK2 LDS CIF5,BUDIK3 LDS REG,BUDIK4 LDI CIF6,10 CPSE REG,NULA MOV CIF6,REG LDI TECKY,0b010110 RET ; tlačítko narizovani (+) dlouze TLAC1_D: ; 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 MOD1_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 RJMP MOD17_NAR RJMP MOD18_NAR RJMP MOD19_NAR RJMP MOD20_NAR RJMP MOD21_NAR MOD1_NAR: MOD2_NAR: INC JAS LDI REG,6 CP JAS,REG BRLO JAS_KONEC CLR JAS JAS_KONEC: RET MOD3_NAR: LDS REG,BUDIK_MOD INC REG CPI REG,4 BRLO KONEC_BM CLR REG KONEC_BM: STS BUDIK_MOD,REG RET MOD4_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 MOD5_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 MOD6_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 MOD7_NAR: LDS REG,DCF_ZAP INC REG ANDI REG,1 STS DCF_ZAP,REG RET MOD8_NAR: LDS REG,AUTOCAS INC REG ANDI REG,1 STS AUTOCAS,REG RET MOD9_NAR: LDS REG,NOC INC REG ; zvýší cifru NOC CPI REG,3 ;ověří, jestli tam neni 3 BRLO NOC_DO_3 CLR REG ;pokud ano, vynuluje jí to NOC_DO_3: STS NOC,REG RET MOD10_NAR: ;přepíná JAZ mezi 0 a 1 LDS REG,JAZ INC REG ANDI REG,1 STS JAZ,REG RET MOD11_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 MOD12_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 MOD13_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 MOD14_NAR: RCALL DALSIROK RET MOD15_NAR: LDI REG,15 MOV DELREG,REG CLR SEK1 INC SEK2 ; zvýší cifru SEK2 CPI SEK2,6 ;ověří, jestli tam neni 6 BRLO SEK_DO_6 CLR SEK2 ;pokud ano, vynuluje jí to SEK_DO_6: RET MOD16_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 MOD17_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 MOD18_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 MOD19_NAR: LDI MODREG,2 RET MOD20_NAR: LDI MODREG,2 RET MOD21_NAR: LDI MODREG,2 RET ; tlačítko "mód" TLAC2: MOV REG,ZVONI CLR ZVONI CPI REG,0 BRNE MODKONEC LDI REG,8 MOV CASDAT,REG DEC MODREG BRNE MODKONEC LDI MODREG,6 MODKONEC: RCALL NASTAVENI_DO_EE RET ; tlačítko "mód" dlouze TLAC2_D: LDI MODREG,21 RET ; obě tlačítka dlouze TLAC_OBE_D: LDI MODREG,21 IN REG,PINY3 SBRS REG,3 RCALL MAZAT_CELOU_EE RET ;ulozeni nastaveni do EEPROM ;tato nastavení se ukládají automaticky, pokud se změnila ;shoda nastavení s EEPROM se periodicky kontroluje JAS_MOD_DO_EE: ;zjisti, zda EEPROM JAS = JAS ;pokud ne, ulozi ho do EEPROM CEKEJ_EE_INIC3: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC3 LDI REG,EE_JAS OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR CP JAS,REG2 BREQ JAS_EE_STEJNY CEKEJ_EE_INIC4: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC4 LDI REG,EE_JAS OUT EEARL,REG OUT EEARH,NULA OUT EEDR,JAS SBI EECR,EEMWE SBI EECR,EEWE RET JAS_EE_STEJNY: ;zjisti, zda EEPROM MOD = MODREG ;pokud ne, ulozi ho do EEPROM CEKEJ_EE_INIC6: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC6 LDI REG,EE_MOD OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR CP MODREG,REG2 BREQ NEUKL_MOD_DO_EE LDI REG,3 CP MODREG,REG BRSH NEUKL_MOD_DO_EE CEKEJ_EE_INIC7: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC7 LDI REG,EE_MOD OUT EEARL,REG OUT EEARH,NULA OUT EEDR,MODREG SBI EECR,EEMWE SBI EECR,EEWE NEUKL_MOD_DO_EE: RET ;ulozeni nastaveni do EEPROM ;tato nastavení se ukládají po stisku tlačítka mód, ;pokud se nastavení liší od stavu EEPROM (jinak ne! šetří EEPROM!) NASTAVENI_DO_EE: ;zjisti, zda EEPROM JAZ = JAZ ;pokud ne, ulozi ho do EEPROM CEKEJ_INIC_JAZ: SBIC EECR,EEWE RJMP CEKEJ_INIC_JAZ LDI REG,EE_JAZ OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR LDS REG2,JAZ CP REG,REG2 BREQ JAZ_EE_STEJNY CEKEJ_INIC_JAZ2: SBIC EECR,EEWE RJMP CEKEJ_INIC_JAZ2 LDI REG,EE_JAZ OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE RET JAZ_EE_STEJNY: ;zjisti, zda EEPROM NOC = NOC ;pokud ne, ulozi ho do EEPROM CEKEJ_INIC_NOC: SBIC EECR,EEWE RJMP CEKEJ_INIC_NOC LDI REG,EE_NOC OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR LDS REG2,NOC CP REG,REG2 BREQ NOC_EE_STEJNY CEKEJ_INIC_NOC2: SBIC EECR,EEWE RJMP CEKEJ_INIC_NOC2 LDI REG,EE_NOC OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE RET NOC_EE_STEJNY: ;zjisti, zda EEPROM AUTOCAS = AUTOCAS ;pokud ne, ulozi ho do EEPROM CEKEJ_INIC_AUTOCAS: SBIC EECR,EEWE RJMP CEKEJ_INIC_AUTOCAS LDI REG,EE_AUTOCAS OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR LDS REG2,AUTOCAS CP REG,REG2 BREQ AUTOCAS_EE_STEJNY CEKEJ_INIC_AUTOCAS2: SBIC EECR,EEWE RJMP CEKEJ_INIC_AUTOCAS2 LDI REG,EE_AUTOCAS OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE RET AUTOCAS_EE_STEJNY: ;zjisti, zda EEPROM budik = BUDIK ;pokud ne, ulozi ho do EEPROM ;budik - mod CEKEJ_A_BUDIK_MOD: SBIC EECR,EEWE RJMP CEKEJ_A_BUDIK_MOD LDI REG,EE_BUDIK_MOD OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR LDS REG2,BUDIK_MOD CP REG,REG2 BREQ EE_STEJNY_BUDIK_MOD CEKEJ_B_BUDIK_MOD: SBIC EECR,EEWE RJMP CEKEJ_B_BUDIK_MOD LDI REG,EE_BUDIK_MOD OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE RET EE_STEJNY_BUDIK_MOD: ;budik 1 CEKEJ_A_BUDIK1: SBIC EECR,EEWE RJMP CEKEJ_A_BUDIK1 LDI REG,EE_BUDIK1 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR LDS REG2,BUDIK1 CP REG,REG2 BREQ EE_STEJNY_BUDIK1 CEKEJ_B_BUDIK1: SBIC EECR,EEWE RJMP CEKEJ_B_BUDIK1 LDI REG,EE_BUDIK1 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE RET EE_STEJNY_BUDIK1: ;budik 2 CEKEJ_A_BUDIK2: SBIC EECR,EEWE RJMP CEKEJ_A_BUDIK2 LDI REG,EE_BUDIK2 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR LDS REG2,BUDIK2 CP REG,REG2 BREQ EE_STEJNY_BUDIK2 CEKEJ_B_BUDIK2: SBIC EECR,EEWE RJMP CEKEJ_B_BUDIK2 LDI REG,EE_BUDIK2 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE RET EE_STEJNY_BUDIK2: ;budik 34 CEKEJ_A_BUDIK34: SBIC EECR,EEWE RJMP CEKEJ_A_BUDIK34 LDS REG2,BUDIK4 LSL REG2 MOV REG,REG2 LSL REG2 LSL REG2 ADD REG2,REG LDS REG,BUDIK3 ADD REG2,REG LDI REG,EE_BUDIK34 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR CP REG,REG2 BREQ EE_STEJNY_BUDIK34 CEKEJ_B_BUDIK34: SBIC EECR,EEWE RJMP CEKEJ_B_BUDIK34 LDI REG,EE_BUDIK34 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE ;RET EE_STEJNY_BUDIK34: RET ; tabulka znakove sady (gfedc1ba) TABULKA_ZNAK: ; čísla 0-9 .DB 0b10000100,0b11110101 ;0, 1 .DB 0b01001100,0b01100100 ;2, 3 .DB 0b00110101,0b00100110 ;4, 5 .DB 0b00000110,0b11110100 ;6, 7 .DB 0b00000100,0b00100100 ;8, 9 ; dny v týdnu česky - znak 1 (pravý) .DB 0b11111111,0b01000111 ;Nic, o 10=nic .DB 0b00001111,0b00001111 ;t, t .DB 0b00001111,0b00010100 ;t, A .DB 0b01000111,0b00001110 ;o, E ; dny v týdnu česky - znak 2 (levý) .DB 0b11101111,0b00011100 ;_, P 18=_ .DB 0b10000101,0b00100110 ;U, S .DB 0b10001110,0b00011100 ;C, P .DB 0b00100110,0b01010111 ;S, n ; různá písmena .DB 0b00010100,0b01000101 ;A, d 26=A, 27=d .DB 0b00100110,0b00001111 ;S, t 28=S, 29=t .DB 0b10001110,0b00011110 ;C, F 30=C, 31=F .DB 0b01010111,0b11011111 ;n, i 32=n, 33=i .DB 0b00001110,0b00100101 ;E, y 34=E, 35=y ; dny v týdnu anglicky - znak 1 (pravý) .DB 0b11111111,0b01000111 ;Nic, o 36=nic .DB 0b11000111,0b00001110 ;u, E .DB 0b00010111,0b01011111 ;h, r .DB 0b00010100,0b11000111 ;A, u ; dny v týdnu anglicky - znak 2 (levý) .DB 0b11101111,0b10010100 ;_, M 44=_ .DB 0b00001111,0b10000101 ;t, U .DB 0b00001111,0b00011110 ;t, F .DB 0b00100110,0b00100110 ;S, S ; tabulka jasu TABULKA_JAS: .DB 250,244 .DB 232,208 .DB 160,64 TABULKA_PROV: .DB 255,255 .DB 255,0 .DB 255,255 .DB 255,255 .DB 255,255 .DB 1,255 .DB 255,255 .DB 255,255 .DB 255,255 .DB 2,255 .DB 255,255 .DB 255,255 .DB 255,3 .DB 255,255 .DB 255,255 .DB 255,255 .DB 255,4 .DB 255,255 .DB 255,255 .DB 255,255 .DB 5,255 .DB 255,255 .DB 255,255 .DB 255,255 .DB 6,255 .DB 255,255 .DB 255,255 .DB 255,7 .DB 255,255 .DB 255,255