LIST P=16F84A INCLUDE p16f84a.inc __CONFIG _WDT_OFF & _LP_OSC ORG 0x00 GOTO MAIN ORG 0X04 GOTO INTERRUPT MAIN ;--------------------------------------- ;-- DEKLARACJA REJESTROW POMOCNICZYCH -- ;--------------------------------------- BCF STATUS,RP0 ;BANK 0 DELAY EQU 0EH ;OPOZNIENIA DLA PETLI DELAY1 EQU 0FH S_1 EQU 10H ;REJESTRY PRZECHOWUJACE S_10 EQU 11H ;POSZCZEGOLNE CYFRY M_1 EQU 12H ;WYSWIETLANEJ GODZINY M_10 EQU 13H H_1 EQU 14H H_10 EQU 15H CLRF S_1 CLRF S_10 CLRF M_1 CLRF M_10 CLRF H_1 CLRF H_10 TRYB EQU 16H ; 001 - TRYB NORMALNY - ODMIERZANIE CZASU ; 010 - USTAWIANIE MINUT ; 100 - USTAWIANIE GODZIN TEMP_W EQU 17H MOVLW B'00000001' MOVWF TRYB ;------------------------ ;-- USTAWIENIE OPCJI ---- ;------------------------ MOVLW B'10010100' ;PRZERWANIE NA OPADAJACYM ZBOCZU RB0 OPTION ;ZEWNETRZNY OSCYLATOR ;PRESKALER WLACZONY DLA TIMER0 ;USTAWIENIE PRESKALERA NA 1:32 ;------------------------- ;-- KONFIGURACJA PORTOW -- ;------------------------- ;USTAWIANIE PORTU A BCF STATUS,RP0 ;BANK 0 MOVLW B'11111111' MOVWF PORTA BSF STATUS,RP0 ;BANK 1 MOVLW B'00000000' MOVWF TRISA ;USTAWIENIE A<4:0> JAKO WYJSCIA ;USTAWIANIE PORTU B BCF STATUS,RP0 ;BANK 0 CLRF PORTB BSF STATUS,RP0 ;BANK 1 MOVLW B'10000001' MOVWF TRISB ;USTAWIENIE B<6:1> JAKO WYJSCIA B<7,1> JAKO WEJSCIA BCF STATUS,RP0 ;BANK 0 ;--------------- ;-- TEST DIOD -- ;--------------- MOVLW B'00000000' MOVWF PORTA ;ZAPALENIE WSZYSTKICH WIERSZY MOVLW B'10000001' MOVWF PORTB ;ZAPALENIE WSZYSTKICH KOLUMN MOVLW B'00000111' MOVWF DELAY1 WAIT0 ;ODCZEKANIE ~500ms CALL WAIT1 DECFSZ DELAY1,1 GOTO WAIT0 MOVLW B'11111111' MOVWF PORTA ;WYGASZENIE WSZYSTKICH WIERSZY MOVLW B'11111111' MOVWF PORTB ;WYGASZENIE WSZYSTKICH KOLUMN CLRF DELAY ;ODCZEKANIE ~ 2*60ms CALL WAIT1 CLRF DELAY CALL WAIT1 ;------------------------ ;-- WLACZENIE PRZERWAN -- ;------------------------ BSF INTCON,7 ;GLOBAL ENABLE BSF INTCON,5 ;TMR0 BSF INTCON,4 ;RB0 ;--------------------------- ;-- GLOWNA CZESC PROGRAMU -- ;--------------------------- BCF STATUS,RP0 ;BANK 0 BCF INTCON,5 ;WYLACZENIE PRZERWAN DLA TIMERA GOTO USTAW_MINUTY ;ROZPOCZECIE OD USTAWIANIA CZASU GLOWNA_PETLA ;WYSWIETLANIE GODZINY ;(ZAWIESZANE NA CZAS OBSLUGI PRZERWAN) MOVLW B'11111111' ;WYSWIETLENIE SEKUND WG SEKWENCJI: MOVWF PORTA ; - WYGASZENIE KOLUMNY POPRZEDNIEJ MOVLW B'10111111' ; - WYBOR AKTUALNEJ KOLUMNY MOVWF PORTB ; - ZANEGOWANIE DANEJ CYFRY (ZAPALANIE ZEREM) COMF s_1,0 ; - WYSWIETLENIE CYFRY MOVWF PORTA ; - ODCZEKANIE ; - LACZNY CZAS ~4ms CALL WAIT MOVLW B'11111111' ;WYSWIETLENIE SEKUND - DZIESIATKI MOVWF PORTA MOVLW B'11011111' MOVWF PORTB COMF s_10,0 MOVWF PORTA CALL WAIT MOVLW B'11111111' ;WYSWIETLENIE MINUT - JEDNOSCI MOVWF PORTA MOVLW B'11101111' MOVWF PORTB COMF M_1,0 MOVWF PORTA CALL WAIT MOVLW B'11111111' ;WYSWIETLENIE MINUT - DZIESIATKI MOVWF PORTA MOVLW B'11110111' MOVWF PORTB COMF M_10,0 MOVWF PORTA CALL WAIT MOVLW B'11111111' ;WYSWIETLENIE GODZIN - JEDNOSCI MOVWF PORTA MOVLW B'11111011' MOVWF PORTB COMF H_1,0 MOVWF PORTA CALL WAIT MOVLW B'11111111' ;WYSWIETLENIE GODZIN - DZIESIATKI MOVWF PORTA MOVLW B'11111101' MOVWF PORTB COMF H_10,0 MOVWF PORTA CALL WAIT GOTO GLOWNA_PETLA ;POWROT DO POCZATKU PETLI WAIT ;PETLA OPOZNIAJACA MOVLW B'00000111' MOVWF DELAY WAIT1 DECFSZ DELAY,1 GOTO WAIT1 RETURN ;----------------------- ;-- ZWIEKSZANIE CZASU -- ;----------------------- ZWIEKSZ_S_1 MOVWF TEMP_W MOVLW B'11111111' ;WYGASZENIE DIOD MOVWF PORTA ;NA CZAS OBSLUGI PRZERWANIA MOVLW B'11111111' ;(ZAPOBIEGA MIGANIU) MOVWF PORTB INCF S_1,1 MOVLW B'00001010' ;JESLI OSIAGNIETO 10 XORWF S_1,0 ;PRZEJSCIE DO ZWIEKSZANIA DZIESIATEK BTFSC STATUS,2 CALL ZWIEKSZ_S_10 MOVF TEMP_W, W BCF INTCON,2 ;WYLACZENIE FLAGI PRZERWANIA RETFIE ;POWROT DO PROGRAMU ZWIEKSZ_S_10 CLRF S_1 ;WYCZYSZCZENIE JEDNOSCI INCF S_10,1 MOVLW B'00000110' ;JESLI OSIAGNIETO 6 XORWF S_10,0 ;PRZEJSCIE DO MINUT BTFSC STATUS,2 CALL ZWIEKSZ_M_1 RETURN ZWIEKSZ_M_1 CLRF S_10 ;WYCZYSZCZENIE SEKUND INCF M_1,1 MOVLW B'00001010' ;JESLI OSIAGNIETO 10 XORWF M_1,0 ;PRZEJSCIE DO DZIESIATEK BTFSC STATUS,2 CALL ZWIEKSZ_M_10 RETURN ZWIEKSZ_M_10 CLRF M_1 ;WYCZYSZCZENIE JEDNOSCI INCF M_10,1 MOVLW B'00000110' ;JESLI OSIAGNIETO 6 XORWF M_10,0 ;PRZEJSCIE DO GODZIN BTFSC STATUS,2 CALL ZWIEKSZ_H_1 RETURN ZWIEKSZ_H_1 MOVLW B'01010001' ;WPROWADZENIE KOREKTY CO GODZINE ADDWF TMR0,1 ;SEKUNDA KROTSZA O 1/4 ;(ZEGAREK TRACIL SEKUNDE CO 4 GODZINY) ;+pozniej tracil 1sek/20godzin ;wiec dodanie 256/20 ~ 13 ;+pozniej tracil 1sek/80godzin ;wiec dodanie 256/80 ~ 3 CLRF M_10 ;WYCZYSZCZENIE MINUT INCF H_1,1 MOVLW B'00001010' ;JESLI OSIAGNIETO 10 XORWF H_1,0 ;PRZEJSCIE DO DZIESIATEK BTFSC STATUS,2 CALL ZWIEKSZ_H_10 MOVLW B'00000100' ;JESLI LICZBA JEDNOSI WYNOSI 4 XORWF H_1,0 ;PRZEJSCIE DO SPRAWDZENIA CZY JEST GODZ 24. BTFSC STATUS,2 CALL ZERUJ_CZAS RETURN ZWIEKSZ_H_10 CLRF H_1 ;WYCZYSZCZENIE JEDNOSCI INCF H_10,1 RETURN ZERUJ_CZAS MOVLW B'00000010' ;SPRAWDZENIE CZY OSIAGNIETO XORWF H_10,0 ;DZIESIATKI ROWNE 2 BTFSC STATUS,2 CALL ZERUJ ;PRZEJSCIE DO WYCZYSZCZENIA CZASU RETURN ZERUJ CLRF H_1 ;CZYSZCZENIE CO 24GODZINY CLRF H_10 RETURN ;---------------------- ;-- USTAWIANIE MINUT -- ;---------------------- USTAW_MINUTY MOVLW B'0000010' MOVWF TRYB BTFSS PORTB,7 ;SPRAWDZENIE CZY NACISNIETO PRZYCISK 'SET' CALL USTAW_M_1 ;CO ~80ms CALL WYSWIETLAJ_GODZINY ;CALA SEKWENCJA ODPOWIEDZIALNA CALL WYSWIETLAJ_MINUTY ;ZA MIGANIE USTAWIANYCH KOLUMN CALL WYSWIETLAJ_GODZINY ;W ODPOWIEDNI SPOSOB CALL WYSWIETLAJ_MINUTY ;ILOSC POWTORZEN DOBRANA DOSWIADCZALNIE CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL NIE_WYSWIETLAJ_MINUT GOTO USTAW_MINUTY ;OCZEKIWANIE W PETLI DOPOKI NIE BEDZIE WCISNIETY ;PRZYCISK 'MODE' - ZMIANA TRYBU USTAW_M_1 INCF M_1,1 ;ZWIEKSZANIE PO NACISNIECIU PRZYCISKU MOVLW B'00001010' ;SPRAWDZENIE CZY 10 XORWF M_1,0 BTFSC STATUS,2 CALL USTAW_M_10 ;PRZEJSCIE DO DZIESIATEK RETURN USTAW_M_10 CLRF M_1 ;WYCZYSZCZENIE JEDNOSCI INCF M_10,1 ;I ZWIEKSZENIE DZIESIATEK MOVLW B'00000110' ;SPRAWDZENIE CZY 6 I WYCZYSZCZENIE XORWF M_10,0 BTFSC STATUS,2 CLRF M_10 RETURN WYSWIETLAJ_MINUTY ;WYSWIETLANIE DWOCH KOLUMN MINUT MOVLW B'11111111' MOVWF PORTA MOVLW B'11101111' MOVWF PORTB COMF M_1,0 MOVWF PORTA CALL WAIT MOVLW B'11111111' MOVWF PORTA MOVLW B'11110111' MOVWF PORTB COMF M_10,0 MOVWF PORTA CALL WAIT RETURN NIE_WYSWIETLAJ_MINUT ;ZAPALA WSZYSTKIE DIODY W KOLUMNACH MINUT MOVLW B'11111111' MOVWF PORTA MOVLW B'11101111' MOVWF PORTB MOVLW B'11110000' MOVWF PORTA CALL WAIT MOVLW B'11111111' MOVWF PORTA MOVLW B'11110111' MOVWF PORTB MOVLW B'11110000' MOVWF PORTA CALL WAIT RETURN ;----------------------- ;-- USTAWIANIE GODZIN -- ;----------------------- USTAW_GODZINY MOVLW B'0000100' MOVWF TRYB BTFSS PORTB,7 CALL USTAW_H_1 CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL WYSWIETLAJ_GODZINY CALL WYSWIETLAJ_MINUTY CALL NIE_WYSWIETLAJ_GODZIN GOTO USTAW_GODZINY USTAW_H_1 INCF H_1,1 MOVLW B'00001010' XORWF H_1,0 BTFSC STATUS,2 CALL USTAW_H_10 MOVLW B'00000100' XORWF H_1,0 BTFSC STATUS,2 CALL ZERUJ_CZAS RETURN USTAW_H_10 CLRF H_1 INCF H_10,1 RETURN WYSWIETLAJ_GODZINY MOVLW B'11111111' MOVWF PORTA MOVLW B'11111011' MOVWF PORTB COMF H_1,0 MOVWF PORTA CALL WAIT MOVLW B'11111111' MOVWF PORTA MOVLW B'11111101' MOVWF PORTB COMF H_10,0 MOVWF PORTA CALL WAIT RETURN NIE_WYSWIETLAJ_GODZIN MOVLW B'11111111' MOVWF PORTA MOVLW B'11111011' MOVWF PORTB MOVLW B'11110000' MOVWF PORTA CALL WAIT MOVLW B'11111111' MOVWF PORTA MOVLW B'11111101' MOVWF PORTB MOVLW B'11110000' MOVWF PORTA CALL WAIT RETURN ;---------------------------- ;-- OBSLUGA PRZYCISKU MODE -- ;---------------------------- ZMIEN_TRYB BCF INTCON,5 ;WYLACZENIE PRZERWAN DLA TIMERA CLRF DELAY ;ODCZEKANIE ~2*60ms CALL WAIT1 ;ZABEZPIECZENIE PRZED DRGANIAMI CLRF DELAY CALL WAIT1 BCF INTCON,1 ;WYLACZENIE FLAGI PRZERWANIA Z PRZYCISKU BSF INTCON,7 ;ZEZWOLENIE NA PRZERWANIA BSF INTCON,4 ;ODBLOKOWANIE PRZERWAN PRZYCISKU BTFSC TRYB,0 ;SPRAWDZENIE W JAKIM TRYBIE SIE ZNAJDUJE GOTO USTAW_MINUTY ;I PRZJSCIE DO NASTEPNEGO WG KOLEJNOSCI: BTFSC TRYB,1 ;NORMALNY -> USTAWIANIE MINUT GOTO USTAW_GODZINY ;USTAWIANIE MINUT -> USTAWIANIE GODZIN BTFSC TRYB,2 ;USTAWIANIE GODZIN -> NORMALNY GOTO GLOWNA_POWROT RETFIE GLOWNA_POWROT CLRF S_1 ;ZEROWANIE SEKUND I TIMERA CLRF S_10 ;PRZED ZAKONCZENIEM USTAWIANIA CZASU CLRF TMR0 BCF INTCON,2 ;WYCZYSZCZENIE FLAGI PRZERWANIA TIMERA BSF INTCON,5 ;WLACZENIE PRZERWAN DLA TIMERA MOVLW B'0000001' MOVWF TRYB GOTO GLOWNA_PETLA ;---------------------- ;-- OBSLUGA PRZERWAN -- ;---------------------- INTERRUPT BTFSC INTCON,1 ;WCISNIECIE PRZYCISKU 'MODE' GOTO ZMIEN_TRYB BTFSC INTCON,2 ;PRZEPELNIENIE TIMERA (CO 1s.) GOTO ZWIEKSZ_S_1 RETFIE ;INNE PRZERWANIE END ;KONIEC PROGRAMU ;)