; LCD hodiny s teploměrem a datumem ; ATmega16A (ATmega16L) ; int. RC osc. 1 MHz, krystal 32 768 Hz ; Vytvořeno: 6. X. 2012, upraveno 1. V. 2022 ; Low Fuse: E1, High Fuse: D9 ; Autor: DANYK ; https://danyk.cz/avr_lcd_tephod.html .NOLIST .INCLUDE "m16def.inc" .LIST .DEF KOR=R5 ;korekce krystalu .DEF STAV_TL=R6 ;stav tlačítek .DEF DOBA_TL=R7 ;doba stisku tlačítka .DEF PRODL_TL=R8 ;prodleva do další reakce tlačítka .DEF TEPL1=R9 ;teplota .DEF TEPL2=R10 ;teplota .DEF TEPL3=R11 ;teplota .DEF MODREG=R12 ;registr módu .DEF JAZYK=R13 ;jazyk dne v týdnu .DEF DELREG=R14 ;bit0=polarita displeje, deleni 64Hz na 1Hz .DEF NULA=R15 ;nula .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 ; EEPROM .EQU EE_KOR=0 .EQU EE_AUTOCAS=1 .EQU EE_JAZYK=2 .EQU DEN1=0x0060 .EQU DEN2=0x0061 .EQU MESIC1=0x0062 .EQU MESIC2=0x0063 .EQU AUTOCAS=0x0064 .EQU AUTOCASP=0x0065 .EQU ROK1=0x0066 .EQU ROK2=0x0067 .EQU DEN_TYDNE=0x0068 .EQU SMER1=DDRA .EQU PORT1=PORTA .EQU SMER2=DDRB .EQU PORT2=PORTB .EQU SMER3=DDRC .EQU PORT3=PORTC .EQU SMER4=DDRD .EQU PORT4=PORTD .EQU VSTUPY=PINC .CSEG .ORG 0 RJMP START ; vektory preruseni .ORG OC2addr ;preruseni citacem0 RJMP CITAC .ORG ADCCaddr ;preruseni pri dokonceni ADC konverze RJMP ADC_HOTOVO START: ;nastaví port 1 (A) - bity 0123456 výstup (vých. stav 1), 7 vstup bez pullup odporu LDI REG,0b01111111 OUT SMER1,REG LDI REG,0b01111111 OUT PORT1,REG ;nastaví celý port 2 (B) jako výstupy , výchozí stav log1 LDI REG,0xFF OUT SMER2,REG LDI REG,0xFF OUT PORT2,REG ;nastaví port 3 (C) - bity 0123 výstup (vých. stav 1), 45 vstup s pullup odporem LDI REG,0b00001111 OUT SMER3,REG LDI REG,0b00111111 OUT PORT3,REG ;nastaví celý port 4 (D) jako výstupy, výchozí stav log1 LDI REG,0xFF OUT SMER4,REG LDI REG,0xFF OUT PORT4,REG LDI REG,LOW(RAMEND) OUT SPL,REG LDI REG,HIGH(RAMEND) OUT SPH,REG ; vynuluje/presnastavi registry CLR DOBA_TL CLR PRODL_TL CLR NULA ;CLR JAZYK LDI SEK1,0 LDI SEK2,0 LDI MIN1,0 LDI MIN2,0 LDI HOD1,0 LDI HOD2,0 LDI CIF1,0 LDI CIF2,0 LDI CIF3,0 LDI CIF4,0 LDI REG,0 STS AUTOCASP,REG ;čas už byl posunut (0-ne, 1-ano) STS DEN2,REG ;datum STS MESIC2,REG ;datum LDI REG,1 MOV MODREG,REG ;STS AUTOCAS,REG ;automatický čas (0-ne, 1-ano) STS DEN1,REG ;datum STS MESIC1,REG ;datum STS DEN_TYDNE,REG ;den v týdnu LDI REG,2 STS ROK1,REG ;rok - nižší cifra (posledního dvojčíslí) STS ROK2,REG ;rok - vyšší cifra (posledního dvojčíslí) LDI REG,63 MOV DELREG,REG CLR YH LDI YL,1 ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG ; NASTAVENI CASOVACE A JEHO PRERUSENI LDI REG,0b00000000 ; zakaze preruseni OCIE2 OUT TIMSK,REG ; LDI REG,0b00001000 ; OUT ASSR,REG ; LDI REG,0b00001010 ; nulovani pri dosazeni porovnavane hodnoty... OUT TCCR2,REG ; ...(tzv. CTC), preddeli 8 LDI REG,63 ; nastavi porovnavanou hodnotu (dělí se n+1) OUT OCR2,REG ; celkem dělí 8x64 = 512ti CEKEJNAUPDATE: IN REG,ASSR ;čeká na update OCR2,TCCR2,TCNT2 ANDI REG,0b00000111 CPI REG,0b00000000 BRNE CEKEJNAUPDATE LDI REG,0b11000000 ; vymaze preruseni OCF2 a TOV2 OUT TIFR,REG ; LDI REG,0b10000000 ; povoli preruseni OCIE2 OUT TIMSK,REG ; ;NASTAVENI ADC a MCU LDI REG,0b11100111 ; int ref 2,56V, zarovná vlevo, zvolí vstup ADC7 OUT ADMUX,REG ; LDI REG,0b00000011 ;zakáže ADC a přerušení ADC OUT ADCSRA,REG ; LDI REG,0b01110000 ;povolí uspání a nastaví mód power save OUT MCUCR,REG ;zjistí, zda je nastavení korekce krystalu ;v EEPROM OK (bajt EE_KOR je 0 - 198). ;pokud ne, použije výchozí hodnotu 99 EE_INIC_KOR: SBIC EECR,EEWE RJMP EE_INIC_KOR LDI REG,EE_KOR OUT EEARH,NULA OUT EEARL,REG SBI EECR,EERE IN REG2,EEDR CPI REG2,199 BRLO KOR_EE_OK ;korekce krystalu (výchozí: 99 = 0ppm, max: 198 = +99ppm, min: 0 = -99ppm) LDI REG2,99 ;načte výchozí, pokud není nic uloženo v EE KOR_EE_OK: MOV KOR,REG2 ;zjistí, zda je nastavení automatického letního času ;v EEPROM OK (bajt EE_AUTOCAS je 0 - 1). ;pokud ne, použije výchozí hodnotu 1 EE_INIC_AUT: SBIC EECR,EEWE RJMP EE_INIC_AUT LDI REG,EE_AUTOCAS OUT EEARH,NULA OUT EEARL,REG SBI EECR,EERE IN REG2,EEDR CPI REG2,2 BRLO AUT_EE_OK ;automatický letní čas (O-vyp, 1-zap) LDI REG2,1 ;načte výchozí, pokud není nic uloženo v EE AUT_EE_OK: STS AUTOCAS,REG2 ;zjistí, zda je nastavení jazyka ;v EEPROM OK (bajt EE_JAZYK je 0 - 1). ;pokud ne, použije výchozí hodnotu 0 EE_INIC_JAZ: SBIC EECR,EEWE RJMP EE_INIC_JAZ LDI REG,EE_JAZYK OUT EEARH,NULA OUT EEARL,REG SBI EECR,EERE IN REG2,EEDR CPI REG2,2 BRLO JAZ_EE_OK ;jazyk dne v týdnu (0 - česky, 1 - anglicky) LDI REG2,0 ;načte výchozí, pokud není nic uloženo v EE JAZ_EE_OK: MOV JAZYK,REG2 SEI ;povoli globalni preruseni ;hlavní smyčka SMYCKA: SLEEP RJMP SMYCKA ZMERIT: ;vstupem do sleep modu ADC noise reduction se aktivuje ADC konverze LDI REG,0b10001011 ; povoleno ADC, jednoraz. prerus. povoleno, OUT ADCSRA,REG ; deleni 8 (z 1MHz na 125kHz.) LDI REG,0b01010000 ;povoli uspani (sleep) a nastavi mód ADCnr OUT MCUCR,REG SEI ;povoli globalni preruseni SLEEP RET ; Přerušení při dokončení ADC konverze ADC_HOTOVO: LDI REG,0b00000011 ;zakáže ADC a přerušení ADC OUT ADCSRA,REG ; LDI REG,0b01110000 ;povoli uspani a nastavi mod power save OUT MCUCR,REG CLR TEPL1 CLR TEPL2 CLR TEPL3 IN REG,ADCH ;zjistí, jestli je teplota záporná (u MCP9700 číslo do 49) CPI REG,50 BRLO ZAPORNA SUBI REG,50 ;odečte od hodnoty 50 RJMP KLADNA_KONEC ZAPORNA: ;pod rozsahem (40 a méně) CPI REG,41 BRLO POD_ROZSAH LDI REG2,50 ;odecte hodnotu od 50 SUB REG2,REG MOV REG,REG2 LDI REG2,11 ;zobrazí mínus (-) MOV TEPL2,REG2 RJMP POD10 KLADNA_KONEC: ZNOVU100: CPI REG,100 ;podmínka vetsi nebo rovno 100 BRLO POD100 SUBI REG,100 ;odčítání čísla 100 od výsledku INC TEPL3 RJMP ZNOVU100 POD100: ZNOVU10: CPI REG,10 ;podmínka vetsi nebo rovno 10 BRLO POD10 SUBI REG,10 ;odčítání čísla 10 od výsledku INC TEPL2 RJMP ZNOVU10 POD10: MOV TEPL1,REG RETI POD_ROZSAH: ;co když je výsledek mimo rozsah LDI REG2,10 MOV TEPL1,REG2 ;nastavení na 10 zobrazí "_ _" MOV TEPL2,REG2 RETI CITAC: ;přerušení (64Hz) COM CIF4 ;invertuje polaritu ORI CIF4,0b00110000 ;aktivuje pullup odpory tlačítek PC 4, 5 ANDI CIF4,0b00111111 ;PC 6, 7 nechá na 0 COM CIF3 ;invertuje polaritu (bit 7 řídí společnou elektrodu BP) COM CIF2 ;invertuje polaritu ANDI CIF2,0b01111111 ;bit 7 nechá na 0 COM CIF1 ;invertuje polaritu OUT PORT3,CIF4 ;registry na porty OUT PORT4,CIF3 OUT PORT1,CIF2 OUT PORT2,CIF1 ; Vyhodnocování stisku tlačítek včetně potlačení zákmitů tlačítka (f je 64Hz), ; vyhodnocení dlouhého stisku, potlačení krátkého přerušení kontaktu během dlouhého stisku, ; po dlouhém stisku se začně reakce rychle opakovat pro rychlejší nařizování IN STAV_TL,VSTUPY ;Zjistí stav tlačítek CP PRODL_TL,NULA ;pokud neuplynula minimální prodleva, nereaguje znovu BRNE NEREAGOVAT CLR DOBA_TL ;déle nic nestisknuto - vynuluje měřič doby stisku tlačítka. SBRS STAV_TL,5 RJMP NA_TLAC1 SBRS STAV_TL,4 RJMP NA_TLAC2 RJMP KONEC_TLAC NA_TLAC1: RCALL TLAC1 RJMP BYLO_TLAC NA_TLAC2: RCALL TLAC2 RJMP BYLO_TLAC NEREAGOVAT: DEC PRODL_TL ;stisknutí/držení tlačítka nastaví prodlevu do další reakce a inkrementuje měřič doby stisku LDI REG,0b00110000 AND STAV_TL,REG ;nechá jen bity využité tlačítky, zbytek vynuluje CP STAV_TL,REG ;je něco zmáčknuto? BREQ KONEC_TLAC ;pokud není nic zmáčknuto, přeskočí BYLO_TLAC: LDI REG,3 ;určuje prodlevu do další reakce (x 15,6ms) - mezera min. n cyklů MOV PRODL_TL,REG INC DOBA_TL ;inkrementuje meřič doby stisku tlačítka LDI REG,64 CP DOBA_TL,REG ;je už doba stisku 64 cyklů? BRLO KONEC_TLAC ;pokud ne, přeskočí LDI REG,60 ;opakování po 4 cyklech (64 - 60) MOV DOBA_TL,REG ;posune dobu na 60, aby po 4 cyklech opět došla na 64 SBRS STAV_TL,5 RJMP NA_TLAC1_D SBRS STAV_TL,4 RJMP NA_TLAC2_D RJMP KONEC_TLAC NA_TLAC1_D: RCALL TLAC1_D RJMP KONEC_TLAC NA_TLAC2_D: RCALL TLAC2_D KONEC_TLAC: ; ----- konec vyhodnocování tlačítek ----- ;obnoví displej v každém 4. přerušení (16Hz) 2,6,10, ... 54,58,62 SBRC DELREG,1 SBRC DELREG,0 RJMP NEMOD RCALL MOD NEMOD: DEC DELREG ;dělení f/64, změna polarity displeje (bit0), DELREG jde 63...0 BRPL HOP RCALL KOREKCE RCALL PRIDEJS ;1x za sekundu inkrementuje cas CPI SEK1,7 BRNE HOP RCALL ZMERIT ;!!! TADY SE 1x ZA 10s VOLA ADC KONVERZE !!! HOP: RETI KOREKCE: SBIW Y,1 BRNE NORMALNI MOV REG,KOR CPI REG,99 BRLO ZPOMALIT CPI REG,100 BRSH ZRYCHLIT NORMALNI: LDI REG,63 ;normálně dělí 64 MOV DELREG,REG RET ZPOMALIT: LDI REG,65 ;pro zpomalení občas dělí 66 MOV DELREG,REG LDI REG,99 SUB REG,KOR RJMP NACTI_DELITEL ZRYCHLIT: LDI REG,61 ;pro zrychlení občas dělí 62 MOV DELREG,REG MOV REG,KOR SUBI REG,99 NACTI_DELITEL: LSL REG ;vynásobí 2ma LDI ZH,HIGH(2*TAB_DEL) LDI ZL,LOW(2*TAB_DEL) ADD ZL,REG ADC ZH,NULA LPM YL,Z+ ;načte bajt nejdřív do YL (spodních 8 bitů dělitele) LPM YH,Z ;potom načte bajt do YH (horních 8 bitů dělitele) 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: 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 LDI REG,0 ;jinak se vynuluje STS DEN1,REG ;...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ží LDI REG,0 ;a desítky dnů = 0 STS DEN2,REG ;uloží DALSIMESIC: ;zvýšení měsíce LDS REG,MESIC1 INC REG STS MESIC1,REG CPI REG,10 BRLO KONTR12A LDI REG,0 STS MESIC1,REG 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 LDI REG,0 STS MESIC2,REG RCALL DALSIROK KONECDENA: RET ;počítání roku DALSIROK: LDS REG,ROK1 INC REG STS ROK1,REG CPI REG,10 BRLO KONECROKN LDI REG,0 STS ROK1,REG LDS REG,ROK2 INC REG STS ROK2,REG CPI REG,10 BRLO KONECROKN LDI REG,0 STS ROK2,REG 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 INC REG INC REG INC REG DO9: ;měsíce 10-12 jsou stejné jako 3-5, proto tu nejsou. CPI REG,1 BREQ MESIC01 CPI REG,2 BREQ MESIC02 CPI REG,3 BREQ MESIC03 CPI REG,4 BREQ MESIC04 CPI REG,5 BREQ MESIC05 CPI REG,6 BREQ MESIC06 CPI REG,7 BREQ MESIC07 CPI REG,8 BREQ MESIC08 CPI REG,9 BREQ MESIC09 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 INC REG INC REG 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: LDI REG,0 STS AUTOCASP,REG RET MOD: LDI ZL,LOW(MOD_SKOK-1) LDI ZH,HIGH(MOD_SKOK-1) ADD ZL,MODREG ADC ZH,NULA IJMP MOD_SKOK: 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 MOD1: LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,HOD2 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,HOD1 ADC ZH,NULA LPM CIF3,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN2 ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN1 ADC ZH,NULA LPM CIF1,Z SBRC DELREG,5 ;přerušovaně 1Hz ANDI CIF1,0b01111111 ;zapne tečky (h) RET MOD2: SBRS SEK1,0 RJMP UDAJ2_1 ;UDAJ2_2: LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,TEPL3 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,TEPL2 ADC ZH,NULA LPM CIF3,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,TEPL1 ADC ZH,NULA LPM CIF2,Z LDI CIF1,0b10011100 ;symbol stupeň RET UDAJ2_1: LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,HOD2 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,HOD1 ADC ZH,NULA LPM CIF3,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN2 ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN1 ADC ZH,NULA LPM CIF1,Z ANDI CIF1,0b01111111 ;zapne tečky (h) RET MOD3: SBRS SEK1,0 RJMP UDAJ3_1 ;UDAJ3_2: LDS REG,DEN2 LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,REG ADC ZH,NULA LPM CIF4,Z LDS REG,DEN1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF3,Z LDS REG,MESIC2 LDI ZH,HIGH(2*TABULKA_BEZ0) LDI ZL,LOW(2*TABULKA_BEZ0) ADD ZL,REG ADC ZH,NULA LPM CIF2,Z LDS REG,MESIC1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z RET UDAJ3_1: LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,HOD2 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,HOD1 ADC ZH,NULA LPM CIF3,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN2 ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN1 ADC ZH,NULA LPM CIF1,Z ANDI CIF1,0b01111111 ;zapne tečky (h) RET ; mód 4 údaj 1 UDAJ1: LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,HOD2 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,HOD1 ADC ZH,NULA LPM CIF3,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN2 ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN1 ADC ZH,NULA LPM CIF1,Z ANDI CIF1,0b01111111 ;zapne tečky (h) RET ;větvení módu 4 MOD4: CPI SEK1,4 BRLO UDAJ1 CPI SEK1,6 BRLO UDAJ2 CPI SEK1,8 BRLO UDAJ3 ;UDAJ4: LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,TEPL3 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,TEPL2 ADC ZH,NULA LPM CIF3,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,TEPL1 ADC ZH,NULA LPM CIF2,Z LDI CIF1,0b10011100 ;symbol stupeň RET UDAJ3: LDS REG,DEN2 LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,REG ADC ZH,NULA LPM CIF4,Z LDS REG,DEN1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF3,Z LDS REG,MESIC2 LDI ZH,HIGH(2*TABULKA_BEZ0) LDI ZL,LOW(2*TABULKA_BEZ0) ADD ZL,REG ADC ZH,NULA LPM CIF2,Z LDS REG,MESIC1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z RET UDAJ2: LDI CIF4,0b11111111 ;nic LDI CIF3,0b11111111 ;nic LDS REG,DEN_TYDNE SBRC JAZYK,0 ;pokud je jazyk angličtina, SUBI REG,(256-8) ;přičte 8 (anglicky je to v tabulce o 8 pozic dál) LDI ZH,HIGH(2*TABULKA_DEN2) LDI ZL,LOW(2*TABULKA_DEN2) ADD ZL,REG ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA_DEN1) LDI ZL,LOW(2*TABULKA_DEN1) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z RET MOD5: LDI CIF4,0b11111111 LDI CIF3,0b11111111 LDI CIF2,0b11111111 LDI CIF1,0b11111111 SBRC DELREG,3 RET LDI CIF4,0b11110100 ;2 (pro zjednodušenou cifru 4) LDI CIF3,0b11000000 ;0 LDS REG,ROK2 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF2,Z LDS REG,ROK1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z RET MOD6: LDS REG,DEN2 LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,REG ADC ZH,NULA LPM CIF4,Z LDS REG,DEN1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF3,Z LDI CIF2,0b11111111 ;nic LDI CIF1,0b11111111 ;nic SBRC DELREG,3 RET LDS REG,MESIC2 LDI ZH,HIGH(2*TABULKA_BEZ0) LDI ZL,LOW(2*TABULKA_BEZ0) ADD ZL,REG ADC ZH,NULA LPM CIF2,Z LDS REG,MESIC1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z RET MOD7: LDS REG,MESIC2 LDI ZH,HIGH(2*TABULKA_BEZ0) LDI ZL,LOW(2*TABULKA_BEZ0) ADD ZL,REG ADC ZH,NULA LPM CIF2,Z LDS REG,MESIC1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z LDI CIF4,0b11111111 ;nic LDI CIF3,0b11111111 ;nic SBRC DELREG,3 RET LDS REG,DEN2 LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,REG ADC ZH,NULA LPM CIF4,Z LDS REG,DEN1 LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF3,Z RET MOD8: LDI CIF4,0b11111111 ;nic LDI CIF3,0b11111111 ;nic LDI CIF2,0b11111111 ;nic LDI CIF1,0b11111111 ;nic SBRC DELREG,3 RET LDS REG,DEN_TYDNE SBRC JAZYK,0 ;pokud je jazyk angličtina, SUBI REG,(256-8) ;přičte 8 (anglicky je to v tabulce o 8 pozic dál) LDI ZH,HIGH(2*TABULKA_DEN2) LDI ZL,LOW(2*TABULKA_DEN2) ADD ZL,REG ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA_DEN1) LDI ZL,LOW(2*TABULKA_DEN1) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z RET MOD9: LDI CIF4,0b11111111 ;nic LDI CIF3,0b11111111 ;nic LDI CIF2,0b11111111 ;nic LDI CIF1,0b11111111 ;nic SBRS DELREG,3 RJMP SEK_BLIK LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,SEK2 ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,SEK1 ADC ZH,NULA LPM CIF1,Z SEK_BLIK: ANDI CIF1,0b01111111 ;zapne tečky (h) RET MOD10: LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,HOD2 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,HOD1 ADC ZH,NULA LPM CIF3,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN2 ADC ZH,NULA LPM CIF2,Z LDI CIF1,0b11111111 ;nic SBRC DELREG,3 RJMP JEDN_MIN_BLIK LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN1 ADC ZH,NULA LPM CIF1,Z JEDN_MIN_BLIK: ANDI CIF1,0b01111111 ;zapne tečky (h) RET MOD11: LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,HOD2 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,HOD1 ADC ZH,NULA LPM CIF3,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN1 ADC ZH,NULA LPM CIF1,Z ANDI CIF1,0b01111111 ;zapne tečky (h) LDI CIF2,0b11111111 ;nic SBRC DELREG,3 RET LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN2 ADC ZH,NULA LPM CIF2,Z RET MOD12: LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN2 ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,MIN1 ADC ZH,NULA LPM CIF1,Z ANDI CIF1,0b01111111 ;zapne tečky (h) LDI CIF4,0b11111111 ;nic LDI CIF3,0b11111111 ;nic SBRC DELREG,3 RET LDI ZH,HIGH(2*TABULKA_4) LDI ZL,LOW(2*TABULKA_4) ADD ZL,HOD2 ADC ZH,NULA LPM CIF4,Z LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,HOD1 ADC ZH,NULA LPM CIF3,Z RET MOD13: LDI CIF4,0b11111111 ;nic LDI CIF3,0b10100001 ;d LDI CIF2,0b11111111 ;nic LDI CIF1,0b11111111 ;nic SBRC DELREG,3 RJMP JAZ_BLIK LDI ZH,HIGH(2*TABULKA_JAZ2) LDI ZL,LOW(2*TABULKA_JAZ2) ADD ZL,JAZYK ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA_JAZ1) LDI ZL,LOW(2*TABULKA_JAZ1) ADD ZL,JAZYK ADC ZH,NULA LPM CIF1,Z JAZ_BLIK: ANDI CIF1,0b01111111 ;zapne tečky (h) RET MOD14: LDI CIF4,0b11111111 ;nic LDI CIF3,0b10001000 ;A LDI CIF2,0b11100011 ;u LDS REG,AUTOCAS LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z SBRS DELREG,3 LDI CIF1,0b11111111 ;nic RET MOD15: LDI CIF4,0b11111110 ;= LDI CIF3,0b11111111 ;nic LDI CIF2,0b11111111 ;nic LDI CIF1,0b11111111 ;nic SBRC DELREG,3 RJMP KOR_BLIK MOV REG,KOR CPI REG,99 BRLO ZAPOR_KOR ;kladná či nulová korekce SUBI REG,99 RJMP KLAD_KONEC ZAPOR_KOR: ;záporná korence LDI REG,99 SUB REG,KOR LDI CIF3,0b10111111 ; zobrazí minus (-) KLAD_KONEC: LDI ZH,HIGH(2*TABULKA_KOR2) LDI ZL,LOW(2*TABULKA_KOR2) ADD ZL,REG ADC ZH,NULA LPM CIF2,Z LDI ZH,HIGH(2*TABULKA_KOR1) LDI ZL,LOW(2*TABULKA_KOR1) ADD ZL,REG ADC ZH,NULA LPM CIF1,Z KOR_BLIK: ;ANDI CIF1,0b01111111 ;zapne tečky (h) RET ; tlačítko narizovani (+) TLAC1: TLAC1_D: LDI ZL,LOW(MOD_NAR_SKOK-1) LDI ZH,HIGH(MOD_NAR_SKOK-1) ADD ZL,MODREG ADC ZH,NULA IJMP MOD_NAR_SKOK: 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 MOD1_NAR: RET MOD2_NAR: RET MOD3_NAR: RET MOD4_NAR: RET MOD5_NAR: RCALL DALSIROK RET MOD6_NAR: LDS REG,MESIC1 INC REG STS MESIC1,REG CPI REG,10 BRLO KONTR12 LDI REG,0 STS MESIC1,REG 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 LDI REG,0 STS MESIC2,REG KONECDENM: RET MOD7_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 LDI REG,0 ;jinak se vynuluje STS DEN1,REG ;...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ží LDI REG,0 ;a desítky dnů = 0 STS DEN2,REG ;uloží KONECDENH: RET MOD8_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 MOD9_NAR: LDI REG,0b00111110 ;nastaví DELREG na 62 nebo 63 (nemění bit0 aby se nezměnila polarita disp.) OR DELREG,REG LDI REG,0b00111111 AND DELREG,REG LDI SEK1,0 INC SEK2 ; zvýší cifru SEK2 CPI SEK2,6 ;ověří, jestli tam neni 6 BRLO SEK_DO_6 LDI SEK2,0 ;pokud ano, vynuluje jí to SEK_DO_6: RET MOD10_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: RET MOD11_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: RET MOD12_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: RET MOD13_NAR: INC JAZYK LDI REG,0b00000001 AND JAZYK,REG RET MOD14_NAR: LDS REG,AUTOCAS INC REG CPI REG,2 BRLO KONECACV LDI REG,0 KONECACV: STS AUTOCAS,REG RET MOD15_NAR: CLR YH LDI YL,240 INC KOR ;zvýší KOR - korekce krystalu LDI REG,199 CP KOR,REG ;ověří, jestli nedosáhla maxima BRLO KOR_NE_MAX CLR KOR ;pokud ano, uloží do ní 0 KOR_NE_MAX: RET ; tlačítko "mód" TLAC2: DEC MODREG BRNE MODKONEC LDI REG,4 MOV MODREG,REG MODKONEC: LDI REG,12 CP MODREG,REG ;při opuštění módu 15, 14 a 13 uloží nastavení do EEPROM BRLO EE_UKLAD_NE RCALL ULOZ_DO_EE EE_UKLAD_NE: RET ; tlačítko "mód" dlouze TLAC2_D: LDI REG,15 MOV MODREG,REG RET ULOZ_DO_EE: ;Porovná údaje s EEPROM (je hodnota v registru/SRAM stejná jako v EEPROM?) ;Pokud ne, uloží EEPROM (EEPROM se nesmaže vypnutím napájení) ;korekce krystalu EE_INIC_KOR1: SBIC EECR,EEWE RJMP EE_INIC_KOR1 LDI REG,EE_KOR OUT EEARH,NULA OUT EEARL,REG SBI EECR,EERE IN REG,EEDR CP REG,KOR BREQ KOR_EE_STEJNA EE_INIC_KOR2: SBIC EECR,EEWE RJMP EE_INIC_KOR2 LDI REG,EE_KOR OUT EEARH,NULA OUT EEARL,REG OUT EEDR,KOR SBI EECR,EEMWE SBI EECR,EEWE RET KOR_EE_STEJNA: ; automatický letní čas EE_INIC_AUT1: SBIC EECR,EEWE RJMP EE_INIC_AUT1 LDI REG,EE_AUTOCAS OUT EEARH,NULA OUT EEARL,REG SBI EECR,EERE IN REG,EEDR LDS REG2,AUTOCAS CP REG,REG2 BREQ AUTOCAS_EE_STEJNA EE_INIC_AUT2: SBIC EECR,EEWE RJMP EE_INIC_AUT2 LDI REG,EE_AUTOCAS OUT EEARH,NULA OUT EEARL,REG OUT EEDR,REG2 SBI EECR,EEMWE SBI EECR,EEWE RET AUTOCAS_EE_STEJNA: ; jazyk EE_INIC_JAZ1: SBIC EECR,EEWE RJMP EE_INIC_JAZ1 LDI REG,EE_JAZYK OUT EEARH,NULA OUT EEARL,REG SBI EECR,EERE IN REG,EEDR CP REG,JAZYK BREQ JAZ_EE_STEJNA EE_INIC_JAZ2: SBIC EECR,EEWE RJMP EE_INIC_JAZ2 LDI REG,EE_JAZYK OUT EEARH,NULA OUT EEARL,REG OUT EEDR,JAZYK SBI EECR,EEMWE SBI EECR,EEWE JAZ_EE_STEJNA: RET ; TABULKY znakové sady 7-segmentového zobrazení ; (aktivní 0, pořadí 1gfedcba, bit7 musí zůstat vždy 1 !!!) ; tabulka znakové sady čísel a dne 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 0b11110111,0b10111111 ;pod, minus TABULKA_DEN1: ; dny v týdnu česky - 1. znak .DB 0b11111110,0b10100011 ;chyba, o .DB 0b10000111,0b10000111 ;t, t .DB 0b10000111,0b10001000 ;t, A .DB 0b10100011,0b10000110 ;o, E ; dny v týdnu anglicky - 1. znak .DB 0b11111110,0b10100011 ;chyba, o .DB 0b11100011,0b10000110 ;u, E .DB 0b10001011,0b10101111 ;h, r .DB 0b10001000,0b11100011 ;A, u TABULKA_DEN2: ; dny v týdnu česky - 2. znak .DB 0b11111110,0b10001100 ;chyba, P .DB 0b11000001,0b10010010 ;U, S .DB 0b11000110,0b10001100 ;C, P .DB 0b10010010,0b10101011 ;S, n ; dny v týdnu anglicky - 2. znak .DB 0b11111110,0b11001000 ;chyba, M .DB 0b10000111,0b11000001 ;t, W .DB 0b10000111,0b10001110 ;t, F .DB 0b10010010,0b10010010 ;S, S ; jazyk dne v týdnu TABULKA_JAZ1: .DB 0b10000110,0b10101011 ;E, n .DB 0b11111110,0b11111110 ;chyba, chyba ; jazyk dne v týdnu TABULKA_JAZ2: .DB 0b11000110,0b10000110 ;C, E .DB 0b11111110,0b11111110 ;chyba, chyba ; tabulka znakové sady čísel s potlačenou nulou TABULKA_BEZ0: .DB 0b11111111,0b11111001 ;nic, 1 .DB 0b10100100,0b10110000 ;2, 3 .DB 0b10011001,0b10010010 ;4, 5 .DB 0b10000010,0b11111000 ;6, 7 .DB 0b10000000,0b10010000 ;8, 9 .DB 0b11111110,0b11111110 ;chyba, chyba ; tabulka znakové sady čísel cifry 4 TABULKA_4: .DB 0b11111111,0b11111001 ;nic, 1 .DB 0b11110100,0b11111000 ;2, 3 .DB 0b11110011,0b11110011 ;chyba, chyba ; tabulka znakové sady korekce - cifra 1 (jednotky) TABULKA_KOR1: ; 0-9 .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 ; 10-19 .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 ; 20-29 .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 ; 30-39 .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 ; 40-49 .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 ; 50-59 .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 ; 60-69 .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 ; 70-79 .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 ; 80-89 .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 ; 90-99 .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 ;chyba .DB 0b11111110,0b11111110 ;chyba, chyba ; tabulka znakové sady korekce - cifra 2 (desítky) TABULKA_KOR2: ; 0-9 .DB 0b11000000,0b11000000 ;0, 1 .DB 0b11000000,0b11000000 ;2, 3 .DB 0b11000000,0b11000000 ;4, 5 .DB 0b11000000,0b11000000 ;6, 7 .DB 0b11000000,0b11000000 ;8, 9 ; 10-19 .DB 0b11111001,0b11111001 ;0, 1 .DB 0b11111001,0b11111001 ;2, 3 .DB 0b11111001,0b11111001 ;4, 5 .DB 0b11111001,0b11111001 ;6, 7 .DB 0b11111001,0b11111001 ;8, 9 ; 20-29 .DB 0b10100100,0b10100100 ;0, 1 .DB 0b10100100,0b10100100 ;2, 3 .DB 0b10100100,0b10100100 ;4, 5 .DB 0b10100100,0b10100100 ;6, 7 .DB 0b10100100,0b10100100 ;8, 9 ; 30-39 .DB 0b10110000,0b10110000 ;0, 1 .DB 0b10110000,0b10110000 ;2, 3 .DB 0b10110000,0b10110000 ;4, 5 .DB 0b10110000,0b10110000 ;6, 7 .DB 0b10110000,0b10110000 ;8, 9 ; 40-49 .DB 0b10011001,0b10011001 ;0, 1 .DB 0b10011001,0b10011001 ;2, 3 .DB 0b10011001,0b10011001 ;4, 5 .DB 0b10011001,0b10011001 ;6, 7 .DB 0b10011001,0b10011001 ;8, 9 ; 50-59 .DB 0b10010010,0b10010010 ;0, 1 .DB 0b10010010,0b10010010 ;2, 3 .DB 0b10010010,0b10010010 ;4, 5 .DB 0b10010010,0b10010010 ;6, 7 .DB 0b10010010,0b10010010 ;8, 9 ; 60-69 .DB 0b10000010,0b10000010 ;0, 1 .DB 0b10000010,0b10000010 ;2, 3 .DB 0b10000010,0b10000010 ;4, 5 .DB 0b10000010,0b10000010 ;6, 7 .DB 0b10000010,0b10000010 ;8, 9 ; 70-79 .DB 0b11111000,0b11111000 ;0, 1 .DB 0b11111000,0b11111000 ;2, 3 .DB 0b11111000,0b11111000 ;4, 5 .DB 0b11111000,0b11111000 ;6, 7 .DB 0b11111000,0b11111000 ;8, 9 ; 80-89 .DB 0b10000000,0b10000000 ;0, 1 .DB 0b10000000,0b10000000 ;2, 3 .DB 0b10000000,0b10000000 ;4, 5 .DB 0b10000000,0b10000000 ;6, 7 .DB 0b10000000,0b10000000 ;8, 9 ; 90-99 .DB 0b10010000,0b10010000 ;0, 1 .DB 0b10010000,0b10010000 ;2, 3 .DB 0b10010000,0b10010000 ;4, 5 .DB 0b10010000,0b10010000 ;6, 7 .DB 0b10010000,0b10010000 ;8, 9 ;chyba .DB 0b11111110,0b11111110 ;chyba, chyba ; tabulka dělitelů korekce krystalu (31250/n) 16-bitové TAB_DEL: .DW 31250 ; 0 -sem by se to nemělo dostat .DW 31250 ; 1 .DW 15625 ; 2 .DW 10417 ; 3 .DW 7813 ; 4 .DW 6250 ; 5 .DW 5208 ; 6 .DW 4464 ; 7 .DW 3906 ; 8 .DW 3472 ; 9 .DW 3125 ; 10 .DW 2841 ; 11 .DW 2604 ; 12 .DW 2404 ; 13 .DW 2232 ; 14 .DW 2083 ; 15 .DW 1953 ; 16 .DW 1838 ; 17 .DW 1736 ; 18 .DW 1645 ; 19 .DW 1563 ; 20 .DW 1488 ; 21 .DW 1420 ; 22 .DW 1359 ; 23 .DW 1302 ; 24 .DW 1250 ; 25 .DW 1202 ; 26 .DW 1157 ; 27 .DW 1116 ; 28 .DW 1078 ; 29 .DW 1042 ; 30 .DW 1008 ; 31 .DW 977 ; 32 .DW 947 ; 33 .DW 919 ; 34 .DW 893 ; 35 .DW 868 ; 36 .DW 845 ; 37 .DW 822 ; 38 .DW 801 ; 39 .DW 781 ; 40 .DW 762 ; 41 .DW 744 ; 42 .DW 727 ; 43 .DW 710 ; 44 .DW 694 ; 45 .DW 679 ; 46 .DW 665 ; 47 .DW 651 ; 48 .DW 638 ; 49 .DW 625 ; 50 .DW 613 ; 51 .DW 601 ; 52 .DW 590 ; 53 .DW 579 ; 54 .DW 568 ; 55 .DW 558 ; 56 .DW 548 ; 57 .DW 539 ; 58 .DW 530 ; 59 .DW 521 ; 60 .DW 512 ; 61 .DW 504 ; 62 .DW 496 ; 63 .DW 488 ; 64 .DW 481 ; 65 .DW 473 ; 66 .DW 466 ; 67 .DW 460 ; 68 .DW 453 ; 69 .DW 446 ; 70 .DW 440 ; 71 .DW 434 ; 72 .DW 428 ; 73 .DW 422 ; 74 .DW 417 ; 75 .DW 411 ; 76 .DW 406 ; 77 .DW 401 ; 78 .DW 396 ; 79 .DW 391 ; 80 .DW 386 ; 81 .DW 381 ; 82 .DW 377 ; 83 .DW 372 ; 84 .DW 368 ; 85 .DW 363 ; 86 .DW 359 ; 87 .DW 355 ; 88 .DW 351 ; 89 .DW 347 ; 90 .DW 343 ; 91 .DW 340 ; 92 .DW 336 ; 93 .DW 332 ; 94 .DW 329 ; 95 .DW 326 ; 96 .DW 322 ; 97 .DW 319 ; 98 .DW 316 ; 99 .DW 313 ; 100