;-------------------------------; ; Hodiny v28 ; ;-------------------------------; ;)S(2010.01 slovak@post.cz; ;-------------------------------; ;)S(2015.02 úprava pro PIC16F1847 ; ;Xtal 4194304Hz ;4 místný LED displej, společná anoda ; ;RB7 Katoda T (0=svítí) ;RB6 Katoda g ;RB5 Katoda f ;RB4 Katoda e ;RB3 Katoda d ;RB2 Katoda c ;RB1 Katoda b, Tl.N (horní) ;RB0 Katoda a, Tl.S (dolní) ; ;RA7 OSC1 ;RA6 OSC2 ;RA5 vstup (nevyužito) ;RA4 vstup U test ;RA3 Anoda 3 (vlevo) ;RA2 Anoda 2 (1=svítí) ;RA1 Anoda 1 ;RA0 Anoda 0 (vpravp) LIST P=16F1847, R=DEC, MM=ON ;Direktivy překladače include ;Definice názvů registrů ;Nastavení konfigurace procesoru: __CONFIG _CONFIG1,_CP_OFF & _CPD_OFF & _WDTE_ON & _MCLRE_OFF & _FOSC_HS & _CLKOUTEN_OFF & _PWRTE_ON & _BOREN_ON & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2,_WRT_OFF & _LVP_ON & _BORV_LO & _STVREN_OFF & _PLLEN_OFF errorlevel 1, -306 cblock 0x20 Fl ;příznaky D256 ;dělič 256/256=1Hz D3 ;dělič 256/3=85,3Hz Pozice ;číslo zapnutého displeje (0 až 3) Anody ;anody 1=svítí Katody ;katody segmentů 0=svítí Dis0 ;znak pro displej 0 (VpravO) Dis1 ;znak pro displej 1 Dis2 ;znak pro displej 2 Dis3 ;znak pro displej 3 (vlevo) BLIK ;dělič pro blikání displeje CMOD ;číslo modu 0-11 (mod 1 až 4) Sek ;Sekundy 0-59 Min ;Minuty 0-59 Hod ;Hodiny 0-23 PoNe ;den v tydnu 0=Pondelí, 6=Neděle Den ;Den (1 až 31) Mes ;Mesíc (1 až 12) Rok ;Rok (0 až 99) MAXden ;max den podle mesíce CDDR ;>9=Rok >7=Dny >5=Datum ostatní=Hodiny R1 ;řád jedniček pro HEXDEC R10 ;řád desítek pro HEXDEC KLVP ;KLV port, 0=stisknuté tlačítko DKLV ;dělič pro čtení KLV DOT ;dělič pro opakovaní tlačítek PJAS ;pamět jasu RJAS ;regulace jasu PKJS ;progresivní KJS, korekce jasu segmentu endc #define SC STATUS,C #define SZ STATUS,Z #define Stisk Fl,0 ;1=stisknuta klavesa #define Znova Fl,1 ;1=delší stisk KLV #define UMin Fl,6 ;1=uplynula minuta #define UMes Fl,7 ;1=uplynul mesíc #define TlN KLVP,0 ;horní tlačítko Nastavit #define TlZ KLVP,1 ;dolní tlačítko Změnit #define Utest PORTA,4 ;vstup pro test napájení (1=ZAP) ;číslo znaku (např. zobrazení A s tečkou: MOVLW zA+.) #define . 128 ;tečka #define zA 10 ;znak A #define zb 11 #define zC 12 #define zd 13 #define zE 14 #define zF 15 #define zG 16 #define zH 17 #define zi 18 #define zJ 19 #define zk 20 #define zL 21 #define zM 22 #define zn 23 #define zo 24 #define zP 25 #define zr 26 #define zS 27 ;(segment a,c,f,g) #define zt 28 #define zu 29 #define zV 30 #define zY 31 #define sp 32 ;space #define zm1 33 ;-1 (segment b,c,g) #define zhm 34 ;(segment a) #define zmi 35 ;- #define z_ 36 ;znak podtržítko (segment d) #define zro 37 ;= (segment d,g) #define z3m 38 ;3x - (segment a,d,g) #define zst 39 ;° #define zc 40 #define zpz 41 ;) #define zII 42 ;(segment b,c,e,f) ;RAM Banka 0 (000-07F) BANK0 macro MOVLB 0 endm ;RAM Banka 1 (080-0FF) BANK1 macro MOVLB 1 endm ;RAM Banka 2 (100-17F) BANK2 macro MOVLB 2 endm ;RAM Banka 3 (180-1FF) BANK3 macro MOVLB 3 endm ;RAM Banka 4 (200-2FF) BANK4 macro MOVLB 4 endm ;================================ ; kod programu ;-------------------------------- ORG 0 GOTO Start ;na začátek programu CALL 41 CALL 83 CALL 40 GOTO IntProc ;na obsluhu přerušení ;================================ ; podprogramy ;-------------------------------- ;zobrazit pondělí až neděle ZPONE MOVF PoNe,W ;0=pondělí, 6=neděle MOVWF FSR1L ;ukazovátko pro tabulku LSLF FSR1L,F ;*4 RLF FSR1L,F ; CALL TPONE ;načte 1. znak MOVWF Dis3 INCF FSR1L,F ;+1 CALL TPONE ;načte 2. znak MOVWF Dis2 INCF FSR1L,F ;+1 CALL TPONE ;načte 3. znak MOVWF Dis1 INCF FSR1L,F ;+1 CALL TPONE ;načte 4. znak MOVWF Dis0 RETURN ;................................ ;tabulka pondělí až neděle TPONE MOVF FSR1L,W BRW RETLW zP ;P (Dis3) RETLW zo ;o (Dis2) RETLW zn+. ;n.(Dis1) RETLW sp ; (Dis0) RETLW zV ;U RETLW zt ;t RETLW zE+. ;e. RETLW sp ; RETLW 5 ;S RETLW zt ;t RETLW zr+. ;r. RETLW sp ; RETLW zC ;C RETLW zt ;t RETLW zu+. ;v. RETLW sp ; RETLW zP ;P RETLW zA ;a RETLW zt+. ;t. RETLW sp ; RETLW 5 ;S RETLW zo ;o RETLW zb+. ;b. RETLW sp ; RETLW zM ;N RETLW zE ;e RETLW zd+. ;d. RETLW sp ; ;-------------------------------- MaxDen MOVF Mes,W BRW NOP RETLW 31 ;leden RETLW 28 ;únor RETLW 31 ;březen RETLW 30 ;duben RETLW 31 ;květen RETLW 30 ;červen RETLW 31 ;červenec RETLW 31 ;srpen RETLW 30 ;září RETLW 31 ;říjen RETLW 30 ;listopad RETLW 31 ;prosinec ;-------------------------------- ;vybrat anodu ANODA MOVF Pozice,W ANDLW B'00000011' BRW RETLW B'00000001' ;Dis0 (vpravo) RETLW B'00000010' ;Dis1 RETLW B'00000100' ;Dis2 RETLW B'00001000' ;Dis3 (vlevo) ;-------------------------------- ;převede číslo znaku na sedmisegment SEGMENT ANDLW B'00111111' ;odebrat bit 7 pro tečku, zde se nevyhodnocuje SUBLW 45 ;45-W (MAX číslo znaku) MOVF INDF0,W ;obnovit číslo znaku ANDLW B'00111111' ; BTFSS SC ;záporné? (odečet 45-W) MOVLW 36 ;ANO, nahradit znak BRW ;W+PC ;Segmenty(0=svítí)_gfedcba RETLW B'11000000' ;0/0 RETLW B'11111001' ;1/1 RETLW B'10100100' ;2/2 RETLW B'10110000' ;3/3 RETLW B'10011001' ;4/4 RETLW B'10010010' ;5/5 RETLW B'10000010' ;6/6 RETLW B'11111000' ;7/7 RETLW B'10000000' ;8/8 RETLW B'10010000' ;9/9 RETLW B'10001000' ;10/A RETLW B'10000011' ;11/b RETLW B'11000110' ;12/C RETLW B'10100001' ;13/d RETLW B'10000110' ;14/E RETLW B'10001110' ;15/F RETLW B'11000010' ;16/G RETLW B'10001001' ;17/H RETLW B'11101111' ;18/i RETLW B'11100001' ;19/J RETLW B'10001111' ;20/k RETLW B'11000111' ;21/L RETLW B'11001000' ;22/M RETLW B'10101011' ;23/n RETLW B'10100011' ;24/o RETLW B'10001100' ;25/P RETLW B'10101111' ;26/r RETLW B'10011010' ;27/S RETLW B'10000111' ;28/t RETLW B'11100011' ;29/u RETLW B'11000001' ;30/V RETLW B'10010001' ;31/Y RETLW B'11111111' ;32/ (zhasnuto) RETLW B'10111001' ;33/-1 RETLW B'11111110' ;34/ (segment a) RETLW B'10111111' ;35/- RETLW B'11110111' ;36/_ RETLW B'10110111' ;37/= RETLW B'10110110' ;38/ (segment a,d,g) RETLW B'10011100' ;39/° RETLW B'10100111' ;40/c RETLW B'11110000' ;41/) RETLW B'11001001' ;42/II RETLW B'11110111' ;43/_ RETLW B'11110111' ;44/_ RETLW B'11110111' ;45/_ ;-------------------------------- ;převod HEX/DEC, vstup W, výstup R1=jedničky, R10=W=desítky HEXDEC MOVWF R1 ; CLRF R10 ;=0 Rad10 MOVLW 10 ;výpočet řádu desítek SUBWF R1,W ;-10 BTFSS SC ;kladné? BRA End10 ;NE, hotovo MOVWF R1 ;uložit řád jedniček INCF R10,F ;+1 BRA Rad10 ;zpět End10 MOVF R10,W ;řád desítek RETURN ;-------------------------------- ;test KLV+opakovaní, sZ=0=něco stisknuto, sZ=1=žádné tlačítko KLV CLRWDT MOVF KLVP,W ANDLW B'00000011' ;(1a1=1) XORLW B'00000011' ;(st.=0) BTFSS SZ ;=1?, nenulové? (žádné tlačítko) BRA Neco ;NE BCF Stisk ;=0 BSF Znova ;=1 RETURN Neco BSF SZ ;sZ=1 BTFSS Znova ;=1?, odčasováno? RETURN ;NE, jako žádne tl. MOVLW 0x0A ;kratší čas (0.1s) BTFSS Stisk ;=1?, minule stisknuto? MOVLW 0x64 ;delší čas (1s) MOVWF DOT ;nastavit čas BCF Znova ;=0 BSF Stisk ;=1 CLRF BLIK ;od znova BCF SZ ;=0 RETURN ;================================ ; přerušení (4194304/4/16/256=256Hz) ;-------------------------------- IntProc BANK0 BCF INTCON,T0IF ;nulovat příznak TMR0 ;-------------------------------- ;zhasnout displej MOVLW B'11111111' BANK1 MOVWF TRISB ;1=vstupy (VYP displej) BANK0 CLRF PORTA ;-------------------------------- ;dělič pro čtení KLV (256/13=19,7Hz) DECFSZ DKLV,F ;-1=0? BRA NKLV ;NE MOVLW 13 ;znovu MOVWF DKLV ; naplnit ;čtení KLV MOVF PORTB,W ;čtení KLV MOVWF KLVP ;uložit KLV BRA RJ NKLV NOP ;náhrada za čtení KLV NOP ;(dodržet stejný čas) NOP ; NOP ; NOP ; ;-------------------------------- RJ ; INCFSZ Katody,W ;+1=0? (tento znak) ; BRA $+2 ;NE (svítí) ; BRA ZAPD ;ANO (nesvítí, přeskčit regulaci jasu i KJS) ;regulace jasu MOVLW 9 SUBWF RJAS,W ;RJAS-9 BTFSC SC ;záporné? C=0 BRA KJS ;NE ;čekat (356 cyklů, 339us) MOVLW 170 ADDLW 1 ;1+W BTFSS SZ ;=0? BRA $-2 ;NE, znova INCF RJAS,F ;RJAS+1 BRA RJ ;-------------------------------- ;korekce jasu segmentu ;)S(2010.01 KJS BTFSC Katody,0 ;=0?, segment svítí? CALL KJSZ ;NE, zpozdění BTFSC Katody,1 CALL KJSZ BTFSC Katody,2 CALL KJSZ BTFSC Katody,3 CALL KJSZ BTFSC Katody,4 CALL KJSZ BTFSC Katody,5 CALL KJSZ BTFSC Katody,6 CALL KJSZ BTFSC Katody,7 CALL KJSZ ;-------------------------------- ;rozsvíitit displej ZAPD MOVF Katody,W ;nové katody MOVWF PORTB ; MOVF Anody,W ;nové anody MOVWF PORTA ;ZAP BANK1 CLRF TRISB ;0=výstupy (ZAP displej) BANK0 MOVF PJAS,W ;znovu MOVWF RJAS ; naplnit ;-------------------------------- ;příprava pro příští zobrazení ;nová pozice INCF Pozice,W ;zvětšit pozici, další znak ANDLW B'00000011' ;4 místa (0-3), ostatní odseknout MOVWF Pozice ;anody podle pozice CALL ANODA MOVWF Anody ;katody podle pozice MOVLW Dis0 ;adresa RAM, nikoliv obsah ADDWF Pozice,W ;+ pozice displeje (0-3) MOVWF FSR0L ;do ukazovátka MOVF INDF0,W ;načíst znak z místa na které ukazuje FSR CALL SEGMENT ;převod znaku na sedmisegment ;přidat tečku BTFSC INDF0,7 ;znak s tečkou? (tečka příslušného znaku svítí pokud bit7=1) ANDLW B'01111111' ;ANO, 0=ZAP tečku MOVWF Katody ;nové katody ;-------------------------------- ;dělič pro sekundu (256/256=1Hz) INCF D256,F ;+1 BTFSS SZ ;přeteklo? BRA DBD ;NE ;................................ ;SEKUNDA ;CDDR+1 INCF CDDR,F ;+1 MOVF CDDR,W SUBWF CMOD,W ;CMOD-CDDR BTFSS SC ;C=1? kladné CLRF CDDR ;=0 ;zap mod hodin MOVF Sek,W SUBLW 55 BTFSC SZ CLRF CDDR ;sekundy+1 INCF Sek,F ;+1 MOVF Sek,W SUBLW 59 ;59-Sek BTFSC SC ;C=0? záporné BRA DBD ;NE CLRF Sek ;=0 BSF UMin ;uplynula minuta ;-------------------------------- ;děelič pro blikání displeje DBD INCF BLIK,F ;+1 ;-------------------------------- ;dělič pro KLV (256/3=85,3Hz) DECFSZ D3,F ;-1=0? BRA EInt MOVLW 3 MOVWF D3 ;dělič pro opakování tlačítek DECFSZ DOT,F ;-1=0? BRA $+2 BSF Znova ;=1 ;-------------------------------- ;konec přerušení EInt RETFIE ;návrat z přerušení ;-------------------------------- ;zpozdění pro KJS, korekce jasu segmentu ;(katodové rezistory R1 až R8 = 120 ohm) ;................................ KJSZ LSLF PJAS,W ;Jas*8 MOVWF PKJS ; RLF PKJS,F ; RLF PKJS,W ; =W SUBLW 235 ;235-W časování ADDLW 1 ;1+W BTFSS SZ ;=0? BRA $-2 ;NE, znova RETURN ;================================ ;hlavní program ;-------------------------------- Start ;základní nastavení procesoru BANK4 MOVLW B'00000011' ;Pull-up na RA0,1 MOVWF WPUA ; MOVLW B'00000000' ;Pull-up VYP MOVWF WPUB BANK3 MOVLW B'00000000' ;0=Digt.I/O, 1=Analog vstup MOVWF ANSELA ; MOVLW B'00000001' ; MOVWF ANSELB ; BANK2 MOVLW B'01000000' ;ref.napětí OFF MOVWF FVRCON ; MOVLW B'01011010' ;D/A OFF MOVWF DACCON0 ; MOVLW B'11110111' ;D/A OFF MOVWF DACCON1 ; BANK1 MOVLW B'01101100' ;(4MHz) MOVWF OSCCON ; krystalový oscilátor MOVLW B'00110000' ;PORTA, 0=výstup, 1=vstup MOVWF TRISA ; MOVLW B'00000000' ;PORTB, 0=výstup, 1=vstup MOVWF TRISB ; MOVLW B'00000011' ;předdělič 1:16 pro TMR0 MOVWF OPTION_REG ; MOVLW B'10000110' ;A/D OFF MOVWF ADCON0 ; MOVLW B'10101000' ;vpravo, Fosc/32, Vref-:GND, Vref+:Vdd (A/D VYP) MOVWF ADCON1 ; BANK0 ; CLRF T1CON ; CLRF T2CON CLRF FSR0H ; CLRF FSR1H ; CLRF EEADRH ; CLRF EEDATH ;první nastavení proměnných CLRF Fl CLRF Pozice MOVLW 9 MOVWF PJAS MOVLW 11 MOVWF CMOD MOVLW 0xFF MOVWF KLVP CLRF Sek CLRF Min CLRF Hod CLRF PoNe MOVLW 1 MOVWF Den MOVLW 1 MOVWF Mes BSF UMes MOVLW 15 MOVWF Rok ;ZAP přerušení MOVLW B'10100000' ;od TMR0 MOVWF INTCON ; ;================================ ;první časování pro Hodiny, Datum, Den, Rok PHODINY MOVLW 4 MOVWF CDDR GOTO HODINY PDATUM MOVLW 6 MOVWF CDDR CALL MaxDen MOVWF MAXden GOTO DATUM PDNY MOVLW 8 MOVWF CDDR GOTO DNY PROK MOVLW 10 MOVWF CDDR GOTO ROK ;-------------------------------- ;přepínač Rok, Den, Datum, Hodiny, VYP napájení RDDH BTFSC UMin ;=1? uplynula minuta? CALL MINUTA ;ANO ;test napájení BTFSC Utest ;zapnuto? BRA RDDH2 ;ANO ;napájení vypnuto, zhasnout displej, bliká tečka CLRWDT MOVLW sp ;" " MOVWF Dis3 MOVWF Dis1 MOVWF Dis0 BTFSS D256,7 ;blikat (1Hz) ADDLW . ;přidat tečku MOVWF Dis2 CLRF PJAS ;JAS=0 BRA RDDH ;opakovat test napájení RDDH2 MOVF CDDR,W SUBLW 9 BTFSS SC ;kladné? GOTO ROK ;ANO MOVF CDDR,W SUBLW 7 BTFSS SC ;kladné? GOTO DNY ;ANO MOVF CDDR,W SUBLW 5 BTFSS SC ;kladné? GOTO DATUM ;ANO ;-------------------------------- ;mod hodiny HODINY BTFSS UMes BRA HODINYS CALL MaxDen MOVWF MAXden BCF UMes HODINYS MOVF Hod,W ;hodiny CALL HEXDEC ;R1=jedničky, W=desítky BTFSC SZ ;C=0? nenulové MOVLW sp ;nezobrazovat nulu MOVWF Dis3 MOVF R1,W BTFSS D256,7 ;blikat (1Hz) ADDLW . ;přidat tečku MOVWF Dis2 MOVF Min,W ;minuty CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis1 MOVF R1,W MOVWF Dis0 CALL KLV BTFSC SZ ;Z=0? něco stisknuto GOTO RDDH ;NE BTFSC TlN ;stisknuto? GOTO ZMOD ;NE ;-------------------------------- ;nastavit hodiny CLRF BLIK BLHOD BTFSS BLIK,7 ;blikat BRA BLHODH MOVLW sp ;" " MOVWF Dis3 ; ADDLW . ;přidat tečku MOVWF Dis2 ; BRA BLHODM BLHODH MOVF Hod,W ;hodiny CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis3 MOVF R1,W ADDLW . ;přidat tečku MOVWF Dis2 BLHODM MOVF Min,W ;minuty CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis1 MOVF R1,W MOVWF Dis0 BLHODIN CALL KLV BTFSC SZ ;Z=0? něco stisknuto BRA BLHOD ;NE BTFSS TlN ;stisknuto? BRA NMIN ;ANO ;-------------------------------- ;Hod+1 INCF Hod,F ;Hod+1 MOVF Hod,W SUBLW 23 ;23-Hod BTFSS SC ;C=1? kladné CLRF Hod ;NE;=0 BRA BLHOD ;-------------------------------- ;nastavit minuty NMIN CLRF BLIK BLMIN MOVF Hod,W ;hodiny CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis3 MOVF R1,W ADDLW . ;přidat tečku MOVWF Dis2 BTFSS BLIK,7 ;blikat BRA BLMINM MOVLW sp ;" " MOVWF Dis1 ; MOVWF Dis0 ; BRA BLMINUT BLMINM MOVF Min,W ;minuty CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis1 MOVF R1,W MOVWF Dis0 BLMINUT CALL KLV BTFSC SZ ;Z=0? něco stisknuto BRA BLMIN ;NE BTFSS TlN ;stisknuto? BRA NSEK ;ANO ;-------------------------------- ;Min+1 INCF Min,F ;Min+1 MOVF Min,W SUBLW 59 ;59-Min BTFSS SC ;C=1? kladné CLRF Min ;NE;=0 BRA BLMIN ;-------------------------------- ;mod sekundy NSEK MOVLW 5 ;S MOVWF Dis3 MOVLW zE+. ;E. MOVWF Dis2 MOVF Sek,W ;seundy CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis1 MOVF R1,W MOVWF Dis0 CALL KLV BTFSC SZ BRA NSEK BTFSS TlN BRA PHODINY ;-------------------------------- ;sekunda od nuly CLRF D256 CLRF Sek BSF Znova BRA NSEK ;-------------------------------- ;mod dny DNY CALL ZPONE CALL KLV BTFSC SZ ;Z=0? něco stisknuto GOTO RDDH ;NE BTFSC TlN ;stisknuto? BRA ZMOD ;NE ;-------------------------------- ;nastavit PoNe CLRF BLIK BLPONE BTFSS BLIK,7 ;blikat BRA BLPONEZAP MOVLW sp ;" " MOVWF Dis3 ; MOVWF Dis2 ; MOVWF Dis1 ; MOVWF Dis0 ; BRA BLPONEDNY BLPONEZAP CALL ZPONE BLPONEDNY CALL KLV BTFSC SZ ;Z=0? něco stisknuto BRA BLPONE ;NE BTFSS TlN ;stisknuto? BRA PDNY ;ANO ;-------------------------------- ;PoNe+1 INCF PoNe,F MOVF PoNe,W SUBLW 6 ;6-PoNe BTFSS SC ;C=1? kladné CLRF PoNe ;=0 BRA BLPONE ;-------------------------------- ;mod Datum DATUM MOVF Den,W CALL HEXDEC ;R1=desítky, W=jedničky BTFSC SZ ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Dis3 MOVF R1,W ADDLW . ;přidat tečku MOVWF Dis2 MOVF Mes,W CALL HEXDEC ;R1=desítky, W=jedničky BTFSC SZ ;C=0? nenulové MOVLW 0x20 ;nezobrazovat nulu MOVWF Dis1 MOVF R1,W ADDLW . ;přidat tečku MOVWF Dis0 CALL KLV BTFSC SZ ;Z=0? něco stisknuto GOTO RDDH ;NE BTFSC TlN ;stisknuto? BRA ZMOD ;NE ;-------------------------------- ;nastavit Dny CLRF BLIK BLNDNY BTFSS BLIK,7 ;blikat BRA BLDNYZAP MOVLW sp ;" " MOVWF Dis3 ; MOVWF Dis2 ; BRA BLDNY BLDNYZAP MOVF Den,W CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis3 MOVF R1,W ADDLW . ;přidat tečku MOVWF Dis2 BLDNY MOVF Mes,W CALL HEXDEC ;R1=desítky, W=jedničky BTFSC SZ ;C=0? nenulové MOVLW sp ;nezobrazovat nulu MOVWF Dis1 MOVF R1,W ADDLW . ;přidat tečku MOVWF Dis0 CALL KLV BTFSC SZ ;Z=0? něco stisknuto BRA BLNDNY ;NE BTFSS TlN ;stisknuto? BRA NMESIC ;ANO ;-------------------------------- ;Dny+1 INCF Den,F ;+1 MOVF Den,W SUBWF MAXden,W ;MAXden-Den BTFSC SC ;C=0? záporné BRA BLNDNY MOVLW 1 MOVWF Den BRA BLNDNY ;-------------------------------- ;nastavit mesic NMESIC CLRF BLIK BLNMESIC MOVF Den,W CALL HEXDEC ;R1=desítky, W=jedničky BTFSC SZ ;C=0? nenulové MOVLW sp ;nezobrazovat nulu MOVWF Dis3 MOVF R1,W ADDLW . ;přidat tečku MOVWF Dis2 BTFSS BLIK,7 ;blikat BRA BLMESICZAP MOVLW sp ;" " MOVWF Dis1 ; MOVWF Dis0 ; BRA BLMESIC BLMESICZAP MOVF Mes,W CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis1 MOVF R1,W ADDLW . ;přidat tečku MOVWF Dis0 BLMESIC CALL KLV BTFSC SZ ;Z=0? něco stisknuto BRA BLNMESIC ;NE BTFSS TlN ;stisknuto? GOTO PDATUM ;ANO ;-------------------------------- ;Měsíc+1 BSF UMes INCF Mes,F ;+1 MOVF Mes,W SUBLW 12 ;12-Mes BTFSC SC ;C=0? záporné BRA BLNMESIC MOVLW 1 MOVWF Mes BRA BLNMESIC ;-------------------------------- ;mod rok ROK MOVLW 2 ;2 MOVWF Dis3 MOVLW 0 ;0 MOVWF Dis2 MOVF Rok,W CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis1 MOVF R1,W MOVWF Dis0 CALL KLV BTFSC SZ ;Z=0? něco stisknuto GOTO RDDH ;NE BTFSC TlN ;stisknuto? BRA ZMOD ;NE ;-------------------------------- ;nastavit rok CLRF BLIK BLNROK BTFSS BLIK,7 ;blikat BRA BLROKZAP MOVLW sp ;" " MOVWF Dis3 ; MOVWF Dis2 ; MOVWF Dis1 ; MOVWF Dis0 ; BRA BLROK BLROKZAP MOVLW 2 ;2 MOVWF Dis3 MOVLW 0 ;0 MOVWF Dis2 MOVF Rok,W CALL HEXDEC ;R1=desítky, W=jedničky MOVWF Dis1 MOVF R1,W MOVWF Dis0 BLROK CALL KLV BTFSC SZ ;Z=0? něco stisknuto BRA BLNROK ;NE BTFSS TlN ;stisknuto? BRA JAS ;ANO ;-------------------------------- ;Rok+1 INCF Rok,F ;+1 MOVF Rok,W SUBLW 99 ;99-Rok BTFSS SC ;C=1? kladné CLRF Rok BRA BLNROK ;-------------------------------- ;mod JAS JAS CLRF BLIK MOVLW zJ ;J MOVWF Dis3 MOVLW zA ;A MOVWF Dis2 MOVLW 5+. ;S. MOVWF Dis1 BLJAS MOVF PJAS,W BTFSC BLIK,7 ;blikat MOVLW sp ;" " MOVWF Dis0 BLJASK CALL KLV BTFSC SZ ;Z=0? neco stisknuto BRA BLJAS ;NE BTFSS TlN ;stisknuto? GOTO PROK ;ANO ;-------------------------------- ;JAS+1 INCF PJAS,F ;+1 MOVF PJAS,W SUBLW 10 ;10-PJAS BTFSC SZ ; nenulove? CLRF PJAS ; =0 BRA BLJAS ;-------------------------------- ;zmena modu ZMOD MOVF CMOD,W SUBLW 9 MOVF CMOD,W BTFSS SC MOVLW 3 ADDLW 2 MOVWF CMOD MOVLW zM ;M MOVWF Dis3 MOVLW zo ;o MOVWF Dis2 MOVLW zd ;d MOVWF Dis1 MOVF CMOD,W SUBLW 11 MOVLW 4 ;4 BTFSC SZ BRA ZMOD2 MOVF CMOD,W SUBLW 9 MOVLW 3 ;3 BTFSC SZ BRA ZMOD2 MOVF CMOD,W SUBLW 7 MOVLW 2 ;2 BTFSS SZ MOVLW 1 ;1 ZMOD2 MOVWF Dis0 CLRWDT BTFSS TlZ ;stisknuto? BRA $-2 ;ANO MOVLW 4 MOVWF CDDR GOTO RDDH ;-------------------------------- MINUTA BCF UMin ;minuty+1 INCF Min,F ;+1 MOVF Min,W SUBLW 59 ;59-Min BTFSC SC ;C=0? záporné RETURN ;NE CLRF Min ;=0 ;hodiny+1 INCF Hod,F ;+1 ;automatická změna jasu MOVF Hod,W SUBLW 6 ;v 6.00 BTFSS SZ BRA $+3 MOVLW 5 ;JAS.5 MOVWF PJAS MOVF Hod,W SUBLW 8 ;v 8.00 BTFSS SZ BRA $+3 MOVLW 9 ;JAS.9 MOVWF PJAS MOVF Hod,W SUBLW 18 ;v 18.00 BTFSS SZ BRA $+3 MOVLW 4 ;JAS.4 MOVWF PJAS MOVF Hod,W SUBLW 20 ;v 20.00 BTFSS SZ BRA $+3 MOVLW 0 ;JAS.0 MOVWF PJAS ;dokončení hodiny+1 MOVF Hod,W SUBLW 23 ;23-Hod BTFSC SC ;C=0? záporné RETURN CLRF Hod ;ANO;=0 ;den v týdnu+1 INCF PoNe,F ;+1 MOVF PoNe,W SUBLW 6 ;6-PoNe BTFSS SC ;C=1? kladné CLRF PoNe ;NE;=0 ;den+1 INCF Den,F ;+1 MOVF Den,W SUBWF MAXden,W ;MAXden-Den BTFSC SC ;C=0? záporné RETURN MOVLW 1 ;ANO MOVWF Den ;=1 ;mesíc+1 BSF UMes INCF Mes,F ;+1 MOVF Mes,W SUBLW 12 ;12-Mesíc BTFSC SC ;C=0?; záporné RETURN MOVLW 1 ;ANO MOVWF Mes ;=1 ;rok+1 INCF Rok,F ;+1 MOVF Rok,W SUBLW 99 ;99-Rok BTFSS SC ;C=1?; kladné CLRF Rok ;NE;=0 RETURN ;-------------------------------- END ; konec programu