Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <p16f877A.inc> ; definicje specyficzne dla mikrokontrolera
- __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF
- UDATA
- f1 RES 1 ; deklaracja zmiennych potrzebnych
- f2 RES 1
- f3 RES 1
- f4 RES 1
- f5 RES 1
- f6 RES 1
- l1 RES 1
- licznik1 RES 1
- licznik2 RES 1
- licznik3 RES 1
- licznik4 RES 1
- zegar RES 1
- max_zegar RES 1
- migacz RES 1 ; zmienna sterująca miganiem
- migacz_zm RES 1 ; zmienna do zmiany częstotliwości migania
- wartosc RES 1 ; zmienna 20/10
- temp RES 1 ; zmienna tymczasowa do przechowywania wartości max_zegar, gdy pozostanie 20 sekund do końca
- RST CODE 0x000 ; wektor resetu procesora
- pagesel main ; wybór strony pamięci programu
- goto main ; skok do początku programu
- PGM CODE
- main
- ; Inicjalizacja niezbędnych komponentów
- bcf STATUS, RP0 ; wybór banku 0
- bcf STATUS, RP1
- clrf PORTA ; inicjalizacja PORTA przez zerowanie zatrzasków wyjściowych
- bsf STATUS, RP0
- movlw B'00000110' ; przełączenie wejść na cyfrowe
- movwf ADCON1 ; poprzez odłączenie przetwornika A/C
- clrf TRISA ; ustawienie wyprowadzeń PORTA na wyjścia
- clrf TRISB ; ustawienie wyprowadzeń PORTB na wyjścia
- bcf STATUS, RP0
- ; Rozwiązanie zadania
- clrf TRISB
- clrf migacz
- clrf migacz_zm
- movlw b'11110110' ; wartość maksymalnego zegara dla pierwszych 40 sekund odliczania
- movwf max_zegar
- movlw b'00000010' ; wartość maksymalnego zegara dla kolejnych 10 sekund odliczania
- movwf temp
- movlw d'62' ; zmienna określająca
- movwf wartosc ; częstotliwość migania godziny na wyświetlaczu
- call reset_zegar
- call init
- call standard
- reset_zegar
- movlw 0
- movwf zegar
- return
- init
- movlw 0
- movwf licznik1
- movlw 0
- movwf licznik2
- movlw 5
- movwf licznik3
- movlw 5
- movwf licznik4
- return
- decrement1
- movlw 0Ah
- movwf licznik2
- movlw 0
- subwf licznik1, 0
- btfsc STATUS, Z
- call stop
- decf licznik1
- return
- decrement2
- movlw 6
- movwf licznik3
- movlw 0
- subwf licznik2, 0
- btfsc STATUS, Z
- call decrement1
- decf licznik2
- return
- decrement3
- movlw 0Ah
- movwf licznik4
- movlw 0
- subwf licznik3, 0
- btfsc STATUS, Z
- call decrement2
- decf licznik3
- return
- decrement4
- movlw 0
- subwf licznik4, 0
- btfsc STATUS, Z
- call decrement3
- decf licznik4
- clrf zegar
- incf migacz_zm
- return
- stop
- movlw b'11111111'
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00001111' ; włączenie wyświetlacza DS1
- movwf PORTA
- goto stop
- ; ############# STANDARD #############
- standard
- call wypisz_standard ; procedura wyświetlająca godzinę
- call opoznienie_standard ; procedura wyliczająca okres 1 sekundy
- movlw d'35' ; przez 40 cykli ma nie być migania
- subwf migacz_zm, 0
- btfsc STATUS, Z
- call _20s ; jeśli 40 sekund minęło, uruchom procedurę wypisującą godzinę z miganiem
- goto standard
- wypisz_standard
- movf licznik1, W ; załaduj wartość
- call convert ; wywołaj procedurę konwersji
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00000001' ; włączenie wyświetlacza DS1
- movwf PORTA
- call w998us
- movf licznik2, W ; załaduj wartość
- call convert_kropka ; wywołaj procedurę konwersji
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00000010' ; włączenie wyświetlacza DS2
- movwf PORTA
- call w998us
- movf licznik3, W ; załaduj wartość
- call convert ; wywołaj procedurę konwersji
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00000100' ; włączenie wyświetlacza DS3
- movwf PORTA
- call w998us
- movf licznik4, W ; załaduj wartość
- call convert ; wywołaj procedurę konwersji
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00001000' ; włączenie wyświetlacza DS4
- movwf PORTA
- call w998us
- return
- opoznienie_standard
- incf zegar
- movf max_zegar, 0
- subwf zegar, 0
- btfsc STATUS, Z
- call decrement4
- return
- ; ############# 20s / 10s #############
- change ; procedura do zmiany
- movlw d'38' ; częstotliwości migania
- movwf wartosc ; gdy zostało 10 sekund do końca
- movlw b'00000011' ; wartość maksymalnego zegara
- movwf temp ; dla ostatnich 10 sekund odliczania
- return
- _20s
- movf temp, 0 ; wpisz wartość maskymalnego zegara dla przedostatnich 10 sekund (40-50) odliczania
- movwf max_zegar
- movf wartosc, 0 ; wstaw częstotliwość migania
- movwf migacz ; do odpowiedniej zmiennej
- call wypisz_20s ; wyświetl godzinę
- movf wartosc, 0 ; ponownie wstaw częstotliwość migania
- movwf migacz
- call czysc_20s ; wyświetlaj puste segmenty (dzięki nim następuje miganie)
- call opoznienie_20s ; wywołaj opóźnienie
- movlw d'45'
- subwf migacz_zm, 0 ; gdy zmienna osiągnie wartość 50
- btfsc STATUS, Z
- call change ; oznacza to, że trzeba zmienić częstotliwość migania
- goto _20s
- wypisz_20s
- movf licznik1, W ; załaduj wartość
- call convert ; wywołaj procedurę konwersji
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00000001' ; włączenie wyświetlacza DS1
- movwf PORTA
- call w998us
- movf licznik2, W ; załaduj wartość
- call convert_kropka ; wywołaj procedurę konwersji
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00000010' ; włączenie wyświetlacza DS2
- movwf PORTA
- call w998us
- movf licznik3, W ; załaduj wartość
- call convert ; wywołaj procedurę konwersji
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00000100' ; włączenie wyświetlacza DS3
- movwf PORTA
- call w998us
- movf licznik4, W ; załaduj wartość
- call convert ; wywołaj procedurę konwersji
- movwf PORTB ; wysłanie na port PORTB
- movlw B'00001000' ; włączenie wyświetlacza DS4
- movwf PORTA
- call w998us
- decfsz migacz, 1 ; zmiejszaj wartość zmiennej
- goto wypisz_20s ; aby wiedzieć, przez jaki czas trzeba wyświetlać godzinę
- return
- czysc_20s
- clrf PORTB ; wyświetlenie pustego segmentu
- movlw B'00000001'
- movwf PORTA
- call w998us
- clrf PORTB ; wyświetlenie pustego segmentu
- movlw B'00000010'
- movwf PORTA
- call w998us
- clrf PORTB ; wyświetlenie pustego segmentu
- movlw B'00000100'
- movwf PORTA
- call w998us
- clrf PORTB ; wyświetlenie pustego segmentu
- movlw B'00001000'
- movwf PORTA
- call w998us
- decfsz migacz, 1 ; zmiejszaj wartość zmiennej
- goto czysc_20s ; aby wiedzieć, przez jaki czas trzeba wyświetlać puste segmenty
- return
- opoznienie_20s
- incf zegar
- movf max_zegar, 0
- subwf zegar, 0
- btfsc STATUS, Z
- call decrement4
- return
- convert_kropka
- addwf PCL, f
- dt B'10111111' ; 0 z kropka
- dt B'10000110' ; 1 z kropka
- dt B'11011011' ; 2 z kropka
- dt B'11001111' ; 3 z kropka
- dt B'11100110' ; 4 z kropka
- dt B'11101101' ; 5 z kropka
- dt B'11111101' ; 6 z kropka
- dt B'10000111' ; 7 z kropka
- dt B'11111111' ; 8 z kropka
- dt B'11101111' ; 9 z kropka
- return
- convert
- addwf PCL, f
- dt B'00111111' ; 0
- dt B'00000110' ; 1
- dt B'01011011' ; 2
- dt B'01001111' ; 3
- dt B'01100110' ; 4
- dt B'01101101' ; 5
- dt B'01111101' ; 6
- dt B'00000111' ; 7
- dt B'01111111' ; 8
- dt B'01101111' ; 9
- return
- w8us ; funkcja wykonujaca sie 10 us
- goto $+1 ; 2 cykle .. razem 2 cykle
- goto $+1 ; 2 cykle .. razem 4 cykle
- goto $+1 ; 2 cykle .. razem 6 cykli
- return ; 2 cykle .. razem 8 cykli
- w48us ; funkcja wykonujaca sie 50 us
- call w8us ; 10 cykli razem 10
- call w8us ; 10 cykli razem 20
- call w8us ; 10 cykli razem 30
- call w8us ; 10 cykli razem 40
- goto $+1 ; 2 cykle razem 42
- goto $+1 ; 2 cykle razem 44
- goto $+1 ; 2 cykle razem 46
- return ; 2 cykle razem 48
- w98us ; funkcja wykonujaca sie 100 us
- call w48us ; 50 cykli razem 50
- movlw d'3' ; podstawienie do akumulatora 3, 1 cykl razem 51
- movwf f1 ; podstawienie 3 pod f1, 1 cykl razem 52
- petla1
- call w8us ; 3x10cykli razem 82 cykli
- decfsz f1,1 ; 2x1 razem 84 i skos razem 86
- goto petla1 ; 2x2 razem 90
- goto $+1 ; 2 cykle razem 92
- goto $+1 ; 2 cykle razem 94
- goto $+1 ; 2 cykle razem 96
- return ; 2 cykle razem 98
- w998us ; funkcja wykonujaca sie 1000 us = 1ms
- movlw d'9' ; podstawienie do akumulatora 9, 1 cykl, razem 1
- movwf f2 ; podstawienie 9 pod f1, 1 cykl razem 2
- petla2
- call w98us ; 9x100 cykli, razem 902 cykle
- decfsz f2,1 ; 8x1 cykli,i plus 2 razem 912 cykli
- goto petla2 ; 8x2 cykli, razem 928 cykli
- call w48us ; 50 cykli, razem 978 cykli
- call w8us ; 10 cykli, razem 988 cykli
- goto $+1 ; 2 cykle razem 990 cykli
- goto $+1 ; 2 cykle razem 992 cykli
- goto $+1 ; 2 cykle razem 994 cykli
- goto $+1 ; 2 cykle razem 996 cykli
- return ; 2 cykle, razem 998
- END ; dyrektywa END kończy treść programu
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement