; Hodiny 6 digitronu + 2x2 tecky + 7 doutnavek ; ATmega8A / 8L ; krystal 32 768 Hz ; DANYK ; danyk.cz/avr_dig2.html .NOLIST .INCLUDE "m8def.inc" .LIST .DEF K_KONST=R1 ; kompenzacni konstanta .DEF KOMPENZ=R2 ; softwarova kompenzace rychlosti chodu .DEF KOMPENZ2=R3 ; softwarova kompenzace rychlosti chodu 2 .DEF AUTO_ZPET=R4 ; automaticky navrat z nastavovani na beh .DEF ROTACE=R5 ; rotace na prevenci otravy katod .DEF PROVOZ1=R6 ; .DEF PROVOZ2=R7 ; .DEF PROVOZ3=R8 ; .DEF CASDAT=R9 ; stridave zobrazeni casu a data .DEF BAT=R10 ; .DEF NULA=R11 ; 0 .DEF CIF1=R12 ; .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 ; .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 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 EE_BYTE1=95 .EQU EE_BYTE2=96 .EQU EE_BYTE3=97 .EQU EE_K_KONST=98 .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 INT1 - synchronizace duplexu .ORG INT1addr RJMP DUPLEX ; vnitrni preruseni citacem 2 .ORG OC2addr RJMP CITAC2 ; vnitrni preruseni citacem 0 .ORG OVF0addr RJMP CITAC0 START: CLI ;nastaví port D - vystupy do 74141, krome INT1 = vstup s pullup LDI REG,0b11110111 OUT SMER,REG LDI REG,0b00001000 OUT PORT,REG ;nastaví port C - vystupy do 74141 a do tranzistoru (spina tecky) LDI REG,0b111111 OUT SMER2,REG LDI REG,0b000000 OUT PORT2,REG ;nastaví port B - vstupy pro tlacitka, vystup sireny, propojka mazani EEPROM ;vystup sireny je mimo alarm nastaven na pullup LDI REG,0b00111000 OUT SMER3,REG LDI REG,0b11000111 OUT PORT3,REG LDI REG,LOW(RAMEND) OUT SPL,REG LDI REG,HIGH(RAMEND) OUT SPH,REG ; vynuluje/presnastavi registry CLR KOMPENZ CLR KOMPENZ2 CLR AUTO_ZPET CLR ZVONI CLR TECKY LDI REG,15 MOV DELREG,REG LDI MODREG,1 LDI REG,1 MOV CASDAT,REG MOV ROTACE,REG CLR BAT DEC BAT 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 ; jen pro test digitronu - zobrazi 123456. ; Pokud je nekde chyba, napr. nekmita krystal, zustane 123456 ;LDI REG,6 ;MOV CIF1,REG ;LDI REG,5 ;MOV CIF2,REG ;LDI CIF3,4 ;LDI CIF4,3 ;LDI CIF5,2 ;LDI CIF6,1 ;--------------- LDI REG,1 STS AUTOCAS,REG ;automaticky letni cas (0-ne, 1-ano) STS DEN1,REG ;datum STS MESIC1,REG ;datum STS ROK2,REG ;rok - vyssi cifra (posledniho dvojcisli) STS DEN_TYDNE,REG ;den v týdnu LDI REG,5 STS ROK1,REG ;rok - nizsi cifra (posledniho dvojcisli) ; NASTAVENI CASOVACU A JEJICH PRERUSENI ;-------------------------------------------- LDI REG,0b00000000 ; zakaze preruseni CTC OCIE2 a TOV2 OUT TIMSK,REG ; nutne pred zmenou ASSR ;nastaví TC2 na asynchronní provoz LDI REG,0b1000 OUT ASSR,REG LDI REG,0b100 ; citac 0 nema OCR! OUT TCCR0,REG ; preddeli 256 LDI REG,0b00000000 ; nastavi c/c na nulovani pri dosazeni porovnavane... OUT TCCR1A,REG ; ...hodnoty (tzv. CTC), OC1A,B nevyuzity, preddeleni 1 LDI REG,0b00001001 ; ... OUT TCCR1B,REG ; ... LDI REG,HIGH(2666) ; nastavi porovnavanou hodnotu-horni byte OUT OCR1AH,REG ; LDI REG,LOW(2666) ; nastavi porovnavanou hodnotu-dolni byte OUT OCR1AL,REG ; deli se n+1 LDI REG,0b00001011 ; nulovani pri dosazeni porovnavane hodnoty... OUT TCCR2,REG ; ...(tzv. CTC), OC0 nevyuzit. preddeli 32 LDI REG,63 ; nastavi porovnavanou hodnotu (f se deli n+1) OUT OCR2,REG ; citac 2 ridi cas, bezi asynchronne CEKEJNAUPDATE: IN REG,ASSR ;ceka na update OCR2,TCCR2,TCNT2 CPI REG,0b1000 BRNE CEKEJNAUPDATE IN REG,TIFR ;vynuluje flagy preruseni TCNT2 SBR REG,6 SBR REG,7 OUT TIFR,REG LDI REG,0b10000001 ; povoli preruseni CTC OCIE2 a TOIE0 OUT TIMSK,REG ; ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG ;povoli preruseni INT1 LDI REG,0b10000000 OUT GICR,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 kompenzacni konstanta OK (bajt EE_K_KONST je < 51). ;pokud ne, nastavi ho na 25 CEKEJ_EE_INIC2: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC2 LDI REG,EE_K_KONST OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN K_KONST,EEDR LDI REG,51 CP K_KONST,REG BRLO KOMP_KONST_OK2 LDI REG,25 MOV K_KONST,REG EE_KOMP_INIC_CEK: SBIC EECR,EEWE RJMP EE_KOMP_INIC_CEK LDI REG,EE_K_KONST OUT EEARL,REG OUT EEARH,NULA OUT EEDR,K_KONST SBI EECR,EEMWE SBI EECR,EEWE KOMP_KONST_OK2: /* ;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,6 ;data do vsech byte1 OUT EEDR,REG SBI EECR,EEMWE SBI EECR,EEWE DEC REG2 BRBC 2,SMYCKA_C */ SEI ;povoli globalni preruseni ;hlavní smyčka SMYCKA: SLEEP RJMP SMYCKA ;tohle smaze (vynuluje) celou vyuzivanou EEPROM na 0x00 !!!!!!!! ;pokud uz nejsou bajty 0x00 MAZAT_CELOU_EE: LDI REG,0b00001000 OUT PORT,REG LDI REG,0b000000 OUT PORT2,REG 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: ;zablikani tecek indikuje mazani BST REG2,2 CLR REG BLD REG,5 OUT PORT2,REG DEC REG2 BRBC 2,SMYCKA_MAZ_EE LDI REG,0b000000 OUT PORT2,REG RET ;automaticky navrat z nastaveni do normalniho zobrazeni ;inkrementace kompenzacniho pocitadla AUTZPET_KOMP: INC AUTO_ZPET CPI MODREG,3 BRLO AUTOZPET_NE CPI MODREG,18 BREQ AUTOZPET_NE LDI REG,241 ;prodleva (s) do automatickeho navratu CP AUTO_ZPET,REG BRLO AUTOZPET_NE LDI MODREG,2 AUTOZPET_NE: ;Kompenzace krystalu LDI REG,1 ADD KOMPENZ,REG ADC KOMPENZ2,NULA LDI REG,LOW(326) CP KOMPENZ,REG LDI REG,HIGH(326) CPC KOMPENZ2,REG BRLO KOMP_NEPRETEK CLR KOMPENZ CLR KOMPENZ2 MOV REG2,K_KONST CPI REG2,51 BRLO KOMP_KONST_OK LDI REG2,25 KOMP_KONST_OK: LDI REG,88 ;63 + 25 SUB REG,REG2 ;upravi hodnotu o kompenzacni konstantu OUT OCR2,REG ; nastavi porovnavanou hodnotu (f se deli n+1) KOMP_NEPRETEK: RET ;preruseni cca 61Hz (Krystal 4M / 256 / 256) CITAC0: RCALL TLACITKA ;RCALL PRIDEJM ;jen pro test - bezi rychle RETI ;preruseni (16Hz) CITAC2: LDI REG,63 ; nastavi porovnavanou hodnotu (f se deli n+1) OUT OCR2,REG ; citac 2 ridi cas, bezi asynchronne RCALL PIPANI DEC DELREG ;deleni f/16 (16 Hz na 1 Hz) BRBC 2,HOP LDI REG,15 MOV DELREG,REG RCALL PRIDEJS ;1x za sekundu inkrementuje cas RCALL AUTZPET_KOMP DEC CASDAT ;deleni f/7 (1 Hz na 1/7 Hz) BRNE HOP LDI REG,7 MOV CASDAT,REG DEC ROTACE ;deleni f/n (1/7 Hz na 1/7n Hz) BRNE HOP LDI REG,7 ;n MOV ROTACE,REG CLR NULA HOP: ;timeout, po kterem prejde na bateriovy mod, kdyz neni synchro signal INC BAT BRNE BAT_NE_0 DEC BAT BAT_NE_0: LDI REG,4 CP BAT,REG BRLO SIT ;vypne vystupy LDI REG,0b00001000 OUT PORT,REG LDI REG,0b000000 OUT PORT2,REG LDI REG,0b11000111 OUT PORT3,REG ;pokud zvoni budik, zvoli IDLE i v bateriovem provozu LDI REG,1 CP ZVONI,REG BREQ BUDIK_BAT ;povoli uspani (sleep) a nastavi mód power save, zapne preruseni INT1 pri kazde zmene LDI REG,0b10110100 OUT MCUCR,REG RJMP CITAC2_USPAT SIT: RCALL MOD RCALL RUT_ROTACE BUDIK_BAT: ;povoli uspani (sleep) a nastavi mód idle, zapne preruseni INT1 pri kazde zmene LDI REG,0b10000100 OUT MCUCR,REG CITAC2_USPAT: CEKEJNAUPDATE2: IN REG,ASSR ;ceka na update OCR2,TCCR2,TCNT2 CPI REG,0b1000 BRNE CEKEJNAUPDATE2 RETI ;Rotace cifer - prevence otravy katod RUT_ROTACE: LDI REG,1 CP ROTACE,REG BRNE ROTACE_NE MOV REG,CASDAT ANDI REG,0b11111110 CPI REG,0b00000100 BRNE ROTACE_NE CPI MODREG,3 BRSH ROTACE_NE MOV REG,DELREG LSR REG BST CASDAT,0 BLD REG,3 CPI REG,6 BRLO ROTACE_NE LDI REG2,15 SUB REG2,REG MOV REG,REG2 MOVW CIF1,REG MOVW CIF3,REG MOVW CIF5,REG CLR TECKY ROTACE_NE: RET ;zdroj prerusovaneho tonu pro budik, ovlada vystup OC1B PIPANI: LDI REG2,0b00000000 ;zruší funkci OC1B LDI REG,1 CP ZVONI,REG ;pokud neni budik BRNE NEPIPAT ;nepipa LDI REG,2 CP DELREG,REG BRLO NEPIPAT SBRC DELREG,1 RJMP NEPIPAT LDI REG2,0b00010000 ;přepínání (toggle) výstupu OC1B SBI SMER3,2 ;nastaví PB1 jako výstup (během pípnutí) RJMP PIPATO NEPIPAT: CBI SMER3,2 ;nastaví PB1 jako vstup (aby bylo uplný ticho) ;SBI PORT3,2 ;a zapne pullup PIPATO: OUT TCCR1A,REG2 ;nastavení přepínání (toggle) výstupu OC1B RET ;Pocitadlo provoznich hodin (pocita po 7-8 minutach) POC_PROVOZNI: ;pri provozu z baterie nepocita, protoze digitrony nesviti LDI REG,4 CP BAT,REG BRLO SIT2 RET SIT2: ;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) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM REG2,Z ;pokud 255, konci CPI REG2,255 BRNE ZAPOCITAVANA 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) 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 ;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: RCALL POC_PROVOZNI ;pocitadlo provoznich hodin 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 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,0b00000011 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 NEREAGOVAT NA_TLAC2: RCALL TLAC2 NEREAGOVAT: LDI REG2,3 ;určuje prodlevu do další reakce (x cca 16ms) ;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,0b00000011 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,93 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 MOD: CLR TECKY LDS REG,DEN_TYDNE SWAP REG LSR REG ORI REG,0b11000111 OUT PORT3,REG 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 RJMP MOD17 RJMP MOD18 MOD0: MOD1: MOVW CIF1,SEK1 MOVW CIF3,MIN1 MOVW CIF5,HOD1 LDI TECKY,0b11 RET MOD2: LDI REG,6 CP CASDAT,REG BRLO UDAJ2 ;UDAJ1: LDS CIF1,ROK1 LDS CIF2,ROK2 LDS CIF3,MESIC1 LDS CIF4,MESIC2 LDS CIF5,DEN1 LDS CIF6,DEN2 LDI TECKY,0b01 RET UDAJ2: MOVW CIF1,SEK1 MOVW CIF3,MIN1 MOVW CIF5,HOD1 SBRS DELREG,3 LDI TECKY,0b11 RET MOD3: ;nastavi mod budiku RCALL NACTI_BUDIK SBRS DELREG,2 SBRS DELREG,1 RJMP BLIKHOP4 LDI REG,10 MOV CIF1,REG BLIKHOP4: LDI TECKY,0b10 SBRS DELREG,2 LDI TECKY,0b01 RET MOD4: ;nastavi minuty budiku RCALL NACTI_BUDIK SBRS DELREG,2 SBRS DELREG,1 RJMP BLIKHOP5 LDI CIF3,10 BLIKHOP5: LDI TECKY,0b10 SBRS DELREG,2 LDI TECKY,0b01 RET MOD5: ;nastavi desitky minut budiku RCALL NACTI_BUDIK SBRS DELREG,2 SBRS DELREG,1 RJMP BLIKHOP6 LDI CIF4,10 BLIKHOP6: LDI TECKY,0b10 SBRS DELREG,2 LDI TECKY,0b01 RET MOD6: ;nastavi hodiny budiku RCALL NACTI_BUDIK SBRS DELREG,2 SBRS DELREG,1 RJMP BLIKHOP7 LDI CIF5,10 LDI CIF6,10 BLIKHOP7: LDI TECKY,0b10 SBRS DELREG,2 LDI TECKY,0b01 RET MOD7: ;zapinani automatickeho letniho casu LDI REG,10 SBRS DELREG,2 SBRS DELREG,1 LDS REG,AUTOCAS MOV REG2,REG MOVW CIF1,REG MOVW CIF3,REG MOVW CIF5,REG RET MOD8: ;nastaveni roku LDS CIF5,DEN1 LDS CIF6,DEN2 LDS CIF3,MESIC1 LDS CIF4,MESIC2 LDI REG,10 MOV CIF1,REG MOV CIF2,REG SBRS DELREG,2 SBRS DELREG,1 LDS CIF1,ROK1 SBRS DELREG,2 SBRS DELREG,1 LDS CIF2,ROK2 LDI TECKY,0b01 RET MOD9: ;nastaveni mesice LDS CIF5,DEN1 LDS CIF6,DEN2 LDS CIF1,ROK1 LDS CIF2,ROK2 LDI CIF3,10 LDI CIF4,10 SBRS DELREG,2 SBRS DELREG,1 LDS CIF3,MESIC1 SBRS DELREG,2 SBRS DELREG,1 LDS CIF4,MESIC2 LDI TECKY,0b01 RET MOD10: ;nastaveni dne LDS CIF3,MESIC1 LDS CIF4,MESIC2 LDS CIF1,ROK1 LDS CIF2,ROK2 LDI CIF5,10 LDI CIF6,10 SBRS DELREG,2 SBRS DELREG,1 LDS CIF5,DEN1 SBRS DELREG,2 SBRS DELREG,1 LDS CIF6,DEN2 LDI TECKY,0b01 RET MOD11: ;nastaveni dne v tydnu LDS CIF5,DEN1 LDS CIF6,DEN2 LDS CIF3,MESIC1 LDS CIF4,MESIC2 LDS CIF1,ROK1 LDS CIF2,ROK2 MOV REG,DELREG ANDI REG,0b111 CPI REG,0 BRNE DENT_NEBLIK LDS REG,DEN_TYDNE INC REG CPI REG,8 BRLO DENBLIK_DO7 LDI REG,1 DENBLIK_DO7: SWAP REG LSR REG ORI REG,0b11000111 OUT PORT3,REG DENT_NEBLIK: LDI TECKY,0b01 RET MOD12: ;nastaveni sekund LDI REG,10 MOV CIF1,REG MOV CIF2,REG SBRS DELREG,2 SBRS DELREG,1 MOVW CIF1,SEK1 MOVW CIF3,MIN1 MOVW CIF5,HOD1 LDI TECKY,0b11 RET MOD13: ;nastaveni jednotek minut MOVW CIF1,SEK1 LDI CIF3,10 MOV CIF4,MIN2 SBRS DELREG,2 SBRS DELREG,1 MOV CIF3,MIN1 MOVW CIF5,HOD1 LDI TECKY,0b11 RET MOD14: ;nastaveni desitek minut MOVW CIF1,SEK1 LDI CIF4,10 MOV CIF3,MIN1 SBRS DELREG,2 SBRS DELREG,1 MOV CIF4,MIN2 MOVW CIF5,HOD1 LDI TECKY,0b11 RET MOD15: ;nastaveni hodin MOVW CIF1,SEK1 MOVW CIF3,MIN1 LDI CIF5,10 LDI CIF6,10 SBRS DELREG,2 SBRS DELREG,1 MOVW CIF5,HOD1 LDI TECKY,0b11 RET MOD16: ;pocitadlo provoznich hodin 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_EE 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_EE: RET MOD17: ;kompenzace krystalu LDI REG,25 CP K_KONST,REG BRSH KONST_PLUS LDI REG2,25 SUB REG2,K_KONST RJMP MINUS_KONEC KONST_PLUS: MOV REG2,K_KONST SUBI REG2,25 MINUS_KONEC: CLR CIF1 CLR CIF2 CLR CIF3 CLR CIF4 CLR CIF5 CLR CIF6 ;vynasobeni REG2 x3 MOV REG,REG2 ADD REG2,REG ADD REG2,REG ;prevod z REG2 do BCD (CIF2:CIF1) ZNOVU10K: CPI REG2,10 BRLO POD10K SUBI REG2,10 INC CIF2 RJMP ZNOVU10K POD10K: MOV CIF1,REG2 ;prepina zobrazeni plus (vpravo) a minus (vlevo) LDI REG,25 CP K_KONST,REG BRSH KONST_PLUS_ZOBR MOVW CIF5,CIF1 CLR CIF1 CLR CIF2 KONST_PLUS_ZOBR: SBRS DELREG,2 SBRS DELREG,1 RJMP KOMP_NEBLIK LDI REG,10 LDI REG2,10 MOVW CIF1,REG MOVW CIF5,REG KOMP_NEBLIK: LDI TECKY,0b10 RET MOD18: ;test / udrzba MOV REG,SEK1 MOV REG2,REG MOVW CIF1,REG MOVW CIF3,REG MOVW CIF5,REG MOV REG,CASDAT SWAP REG LSR REG ORI REG,0b11000111 OUT PORT3,REG CP DELREG,NULA BRNE TECKYBLESK LDI TECKY,0b10 SBRC SEK1,0 LDI TECKY,0b01 TECKYBLESK: 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 CLR CIF2 LDS CIF3,BUDIK1 LDS CIF4,BUDIK2 LDS CIF5,BUDIK3 LDS CIF6,BUDIK4 RET ; tlačítko narizovani (+) dlouze TLAC1_D: CPI MODREG,3 BRLO TEST_PROVOZHOD_KOMP CPI MODREG,16 BREQ TEST_PROVOZHOD_KOMP CPI MODREG,18 BREQ TEST_PROVOZHOD_KOMP RJMP TLAC1 TEST_PROVOZHOD_KOMP: CLR AUTO_ZPET LDI MODREG,18 RET ; tlačítko narizovani (+) TLAC1: CLR AUTO_ZPET 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 RJMP MOD17_NAR RJMP MOD18_NAR MOD0_NAR: ;sem se to nikdy nedostane MOD1_NAR: MOD2_NAR: DEC MODREG BRNE MODKONEC2 LDI MODREG,2 MODKONEC2: LDI REG,8 MOV CASDAT,REG 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,AUTOCAS INC REG CPI REG,2 BRLO KONECACV LDI REG,0 KONECACV: STS AUTOCAS,REG RET MOD8_NAR: RCALL DALSIROK RET MOD9_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 MOD10_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 MOD11_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 MOD12_NAR: LDI REG,15 MOV DELREG,REG CLR SEK1 INC SEK2 ; zvýší cifru MIN2 CPI SEK2,6 ;ověří, jestli tam neni 6 BRLO SEK_DO_6 CLR SEK2 ;pokud ano, vynuluje jí to SEK_DO_6: RET MOD13_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 MOD14_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 MOD15_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 MOD16_NAR: ;LDI MODREG,1 RET MOD17_NAR: INC K_KONST LDI REG,51 CP K_KONST,REG BRLO NAR_KOMP_NEPRET CLR K_KONST NAR_KOMP_NEPRET: RET MOD18_NAR: ;LDI MODREG,17 RET ; tlačítko "mod" TLAC2: CLR AUTO_ZPET MOV REG,ZVONI CLR ZVONI CPI REG,0 BRNE MODKONEC CPI MODREG,16 BREQ ZE16NA1 CPI MODREG,17 BREQ ULOZ_KOMP_DO_EE DEC MODREG BRNE MODKONEC LDI MODREG,6 MODKONEC: RET ZE16NA1: LDI MODREG,1 RET ULOZ_KOMP_DO_EE: ;zjisti, zda EEPROM kompenzacni konstanta = K_KONST ;pokud ne, ulozi ji do EEPROM CEKEJ_EE_INIC3: SBIC EECR,EEWE RJMP CEKEJ_EE_INIC3 LDI REG,EE_K_KONST OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR CP K_KONST,REG2 BREQ KOMP_EE_STEJNA EE_KOMP_INIC_CEK2: SBIC EECR,EEWE RJMP EE_KOMP_INIC_CEK2 LDI REG,EE_K_KONST OUT EEARL,REG OUT EEARH,NULA OUT EEDR,K_KONST SBI EECR,EEMWE SBI EECR,EEWE KOMP_EE_STEJNA: LDI MODREG,16 RET ; tlacitko "mod" dlouze TLAC2_D: CLR AUTO_ZPET LDI MODREG,15 RET ; obe tlacitka dlouze TLAC_OBE_D: LDI MODREG,16 CP ZVONI,NULA BRNE PRO_JISTOTU IN REG,PINY3 SBRS REG,2 RCALL MAZAT_CELOU_EE PRO_JISTOTU: RET DUPLEX: IN REG,PINY CLR BAT SBRS REG,3 RJMP DUPLEX2 ;DUPLEX1: MOV REG2,CIF1 MOV REG,CIF5 SWAP REG OR REG,CIF3 SBRC REG,3 ORI REG2,0b010000 ;bit 3 cifty 3 prenese na bit 4 portu C SBRC TECKY,0 ORI REG2,0b100000 ;zapne tecky - bit 5 portu C ORI REG,0b00001000 ;pullup vstupu synchronizace zustane aktivni OUT PORT,REG OUT PORT2,REG2 RETI DUPLEX2: MOV REG2,CIF2 MOV REG,CIF6 SWAP REG OR REG,CIF4 SBRC REG,3 ORI REG2,0b010000 ;bit 3 cifty 4 prenese na bit 4 portu C SBRC TECKY,1 ORI REG2,0b100000 ;zapne tecky - bit 5 portu C ORI REG,0b00001000 ;pullup vstupu synchronizace zustane aktivni OUT PORT,REG OUT PORT2,REG2 RETI TABULKA: .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