Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CZAS EQU 50 ; ms
- LADUJ EQU (010000h - 1000*CZAS) ;65536
- CNT EQU 30H
- SEC EQU 31H
- MIN EQU 32H
- HOUR EQU 33H
- WR_CMD EQU 0FF2Ch
- WR_DAT EQU 0FF2Dh
- RD_CMD EQU 0FF2Eh
- RD_DAT EQU 0FF2Fh
- SEC_CHANGE BIT 34H ;flaga zmiany sekundy
- CLEAR EQU 001H
- FUNCTION_SET EQU 0111000B ;8 znakow, 2 linie 5x8
- WLACZ EQU 0110B ;Kod wlaczalacy wyswietlacz
- CURSOR EQU 04h ;adres kursora na wyswietlaczu
- POSITION EQU 14H
- +
- ;--------------------------------------------------------
- ; ZEGAR LCD
- ;--------------------------------------------------------
- ORG 0
- LCALL INIT_LCD ;inizjalizacja LCD
- LCALL INIT_TIMER ;inicjalizacja timera
- SJMP $
- ;--------------------------------------------------------
- ; OBSLUGA PRZERWAN
- ;--------------------------------------------------------
- ORG 0BH ;Blok obslugi mechanizmu przerwan, musi startowac pod adresem 0BH
- MOV TH0,#HIGH(LADUJ) ;Ladowanie starszych i mlodszych bitow
- MOV TL0,#LOW(LADUJ) ;zmiennej LADUJ zawierajacej liczbe cykli
- PUSH ACC ;wrzucenie na stos zawartosci akumulatora
- PUSH PSW ;wrzucenie na stos zawartosci rejestru flag
- DJNZ CNT, DONE ;Jesli A == 0 skok do DONE
- MOV CNT, #20
- SETB SEC_CHANGE
- LCALL CLOCK
- INC SEC
- MOV A, SEC
- CJNE A, #60, DONE ;jezeli sekundy == 60 zwieksz minuty o 1 i wyzeruj sekundy
- MOV SEC, #0
- INC MIN
- MOV A, MIN
- CJNE A, #60, DONE ;jezeli minuty == 60 zwieksz godziny o 1 i wyzeruj minuty
- MOV MIN, #0
- INC HOUR
- MOV A, HOUR
- CJNE A, #24, DONE ;jezeli godziny == 24 wyzeruj godziny
- MOV HOUR, #0
- DONE:
- POP PSW ;odczytanie rejestru flag ze stosu
- POP ACC ;odczytanie akumulatora ze stosu
- RETI ;Wyjscie z bloku obslugi przerwania
- ;--------------------------------------------------------
- ; INIT_TIMETR - Procedura inicjujaca timer
- ;--------------------------------------------------------
- INIT_TIMER:
- MOV CNT, #20 ;Licznik wykonan przerwania (20* 50ms = 1s)
- MOV SEC, #55 ;inicjalizacja godziny 23:59:45 (ulatwienie do sprawdzania)
- MOV MIN, #59
- MOV HOUR, #23
- CLR TR0 ;Wylaczenie timera
- MOV TMOD, #00000001B ;Ustawienie trybu timera na 16 bit
- MOV TH0,#HIGH(LADUJ) ;Ladowanie starszych i mlodszych bitow
- MOV TL0,#LOW(LADUJ) ;zmiennej LADUJ zawierajacej liczbe cykli
- CLR TF0 ;Zeruj przepelnienie
- SETB ET0 ;Ustawienie przerwania timera 0
- SETB EA ;Wlaczenie ukladu przerwan
- SETB TR0 ;Wlaczenie timera
- RET ;Wyjscie z procedury
- ;--------------------------------------------------------
- ; INIT_LCD - Procedura inicjujaca LCD
- ;--------------------------------------------------------
- INIT_LCD:
- MOV A, #FUNCTION_SET ;inicjalizacja
- LCALL WRITE_CMD
- MOV A, #CLEAR ;czyszczenie
- LCALL WRITE_CMD
- MOV A, #WLACZ ;wlaczenie wyswietlacza
- LCALL WRITE_CMD
- RET
- WRITE_CMD:
- PUSH ACC ;zrzucenie akumulatora na stos
- LCALL CHECK ;sprawdzanie czy LCD jest wolny
- MOV DPTR, #WR_CMD ;wpisanie adresu sterowania
- POP ACC ;zrzucenie ze stosu akumulatora
- MOVX @DPTR, A ;przeslanie akumulatora linie sterowania
- RET
- ;--------------------------------------------------------
- ; CHECK - Petla sprawdzajaca czy LCD jest wolny
- ;--------------------------------------------------------
- CHECK:
- MOV DPTR, #RD_CMD
- MOVX A, @DPTR
- JB ACC.7, CHECK ;sprawdza bit DB7(busy flag)
- RET
- WRITE_CHAR:
- PUSH ACC
- LCALL CHECK ;sprawdzanie czy LCD jest wolny
- MOV DPTR, #WR_DAT ;wpisanie adresu sterowania
- POP ACC ;zrzucenie ze stosu akumulatora
- MOVX @DPTR, A ;przeslanie akumulatora linie sterowania
- RET
- ;--------------------------------------------------------
- ; A - wartosc do wyswietlenia (0..99)
- ;--------------------------------------------------------
- WRITE_DEC:
- MOV B, #10 ;zamiana liczby na dziesietna
- DIV AB ;w A dziesiatki, w B jednosci
- ADD A, #'0' ;przesuwamy o 48 (znak '0'), zeby otrzymac kod ascii cyfry
- LCALL WRITE_CHAR
- MOV A, B ;to samo dla reszty z dzielenia
- ADD A, #'0'
- LCALL WRITE_CHAR
- RET
- ;--------------------------------------------------------
- ; CLOCK - Wyswietlanie zegara
- ;--------------------------------------------------------
- CLOCK:
- MOV A, #04h
- LCALL SET_CURSOR
- MOV A, HOUR ;przekazanie liczby godzin do akumulatora
- LCALL WRITE_DEC ;wyswietlenie liczby godzin
- MOV A, #':' ;wpisanie znaku dwukropka do akumulatora
- LCALL WRITE_CHAR ;wyswietlenie znaku ':'
- MOV A, MIN ;analogicznie dla minut i sekund
- LCALL WRITE_DEC
- MOV A, #':'
- LCALL WRITE_CHAR
- MOV A, SEC
- LCALL WRITE_DEC
- CLR SEC_CHANGE
- RET
- ;--------------------------------------------------------
- ; Ustawianie pozycji wyswietlania na LCD
- ; z akumulatora ---y | xxxx
- ; y - linia
- ; x - pozycja
- ;--------------------------------------------------------
- SET_CURSOR:
- ANL A, #00011111B ;wyzerowanie 3 najstarszych bitow
- JNB ACC.4, SC_CONT ;sprawdzanie czy y = 0
- CLR ACC.4 ;
- ADD A, #40h ;jesli tak to przesun zegar na druga linie
- SC_CONT:
- ADD A, #80h ;dodanie do adresu kursora kodu polecenia
- CALL WRITE_CMD
- RET
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement