Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- TIME EQU 50 ;ustawienie czasu cyklu 50ms
- LOAD EQU (65536 - 1000*TIME)
- CMD_WR EQU 0FF2CH ; Sets CGRAM address
- DATA_WR EQU 0FF2DH ; Sets DDRAM address
- READ_STATUS EQU 0FF2EH ; Reads busy flag
- INIT EQU 038H ; Function Set
- CLEAR EQU 001H ; Clear display
- TURN_ON EQU 06H ; Display ON Cursor ON Blink OFF
- CURSOR EQU 0AH ; Sets Cursor address
- SEC EQU 40H ;Sets seconds address
- MIN EQU 41H ;Sets minutes address
- HR EQU 42H ;Sets hours address
- COUNTER EQU 43H ;Sets counter address
- ORG 0
- LJMP START
- ORG 0BH
- MOV TH0, #HIGH(LOAD) ;zaladowanie starszych bitow
- MOV TL0, #LOW(LOAD) ;zaladowanie mlodszych bitow
- PUSH ACC
- PUSH PSW
- DJNZ COUNTER, KONIEC ;dekrementacja licznika i skok jezeli jest rozne od 0
- MOV COUNTER, #20 ;ustawienie licznika na 20
- LCALL INIT_LCD
- LCALL WRITE_TIME
- INC SEC ;inkrementacja sekund
- MOV A, SEC ;przeslanie sekund do akumulatora
- CJNE A, #60, KONIEC ;jezeli akumulator jest rozny od 60 to skok do etykiety KONIEC
- MOV SEC, #0
- INC MIN
- MOV A, MIN
- CJNE A, #60, KONIEC
- MOV MIN, #0
- INC HR
- MOV A, HR
- CJNE A, #24, KONIEC
- MOV HR, #0
- KONIEC:
- POP ACC
- POP PSW
- RETI
- START:
- LCALL WRITE_TIME
- LCALL INIT_LCD
- LCALL INIT_TIMER
- SJMP $
- ;--------------------------------------------------
- INIT_TIMER:
- CLR TR0 ;wylaczenie timera
- MOV TMOD, #000000001B ;ustawienie timera na 16bit
- MOV TH0, #HIGH(LOAD) ;zaladowanie starszych bitow
- MOV TL0, #LOW(LOAD) ;zaladowanie mlodszych bitow
- MOV COUNTER, #20 ;ustawienie licznika na 20
- CLR TF0 ;wyzerowanie przepelnienia
- SETB ET0 ;ustawienie przerwania timera na 0
- SETB EA ;wlaczenie ukladu przerwan
- SETB TR0 ;wlaczenie timera
- RET
- ;--------------------------------------------------
- INIT_LCD:
- MOV A, #INIT ;inicjalizacja wyswietlacza
- LCALL WRITE_CMD
- MOV A, #CLEAR ;czyszczenie wyswietlacza
- LCALL WRITE_CMD
- MOV A, #TURN_ON ;wlaczenie wyswietlacza
- LCALL WRITE_CMD
- RET
- ;--------------------------------------------------
- CHECK_BUSY:
- PUSH ACC
- MOV DPTR, #READ_STATUS ;odczytanie statusu
- CB_LOOP:
- MOVX A, @DPTR
- JB ACC.7, CB_LOOP
- POP ACC
- RET
- ;--------------------------------------------------
- WRITE_CMD:
- LCALL CHECK_BUSY ;sprawdza czy wyswietlacz jest zajety
- MOV DPTR, #CMD_WR ;przeslanie adresu linii sterowania
- MOVX @DPTR, A ;przeslanie akumulatora na linie sterowania
- RET
- ;--------------------------------------------------
- WRITE_CHAR:
- LCALL CHECK_BUSY ;sprawdza czy wyswietlacz jest zajety
- MOV DPTR, #DATA_WR ;przeslanie adresu linii zapisu danych
- MOVX @DPTR, A ;przeslanie akumulatora na linie zapisu danych
- RET
- ;--------------------------------------------------
- WRITE_DEC:
- MOV B, #10 ;pomocniczny rejestr B (do mnozenia i dzielenia) ustawienie podstawy na 10
- DIV AB ;dzielenie A/B, A=calosc, B=reszta
- ADD A, #'0'
- LCALL WRITE_CHAR
- MOV A, B
- ADD A, #'0'
- LCALL WRITE_CHAR
- RET
- ;--------------------------------------------------
- WRITE_TIME:
- MOV A, HR
- LCALL WRITE_DEC
- MOV A, #':'
- LCALL WRITE_CHAR
- MOV A, MIN
- LCALL WRITE_DEC
- MOV A, #':'
- LCALL WRITE_CHAR
- MOV A, SEC
- LCALL WRITE_DEC
- RET
- ;--------------------------------------------------
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement