Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- $NOMOD51
- #include <C8051F060>
- ;Program obslugi wyswietlacza cieklokrystalicznego
- ;-------------------------------------------------------------------------------------------------------
- ; DEFINICJE SYMBOLI
- ;-------------------------------------------------------------------------------------------------------
- LCD_RW equ P5.0 ; read/write
- LCD_CE equ P5.1 ; nieaktywny/aktywny
- LCD_CD equ P5.2 ; instrukcja/dane
- LCD_LIGHT equ P5.3 ; Podświetlanie
- LCD_DATA equ P7 ; linia danych wyswietlacza
- TOS equ 30H ; stos
- ready bit 0
- T0_TMOD equ 1H ; konfiguracja licznika T0 w trybie 1 (16-bitowy)
- T0_Reload equ 65536 - 600 ; wartosc poczatkowa licznika T0
- Del equ 7FH ; zliczanie przerwan
- DelReload equ 100 ; liczba przerwan do zliczenia (rozszerzenie opo
- ;-------------------------------------------------------------------------------------------------------
- ; Umieszczenie poczatku programu pod adresem 0000H
- cseg AT 0000h
- jmp Poczatek ; skok do faktycznego poczatku programu
- ;-------------------------------------------------------------------------------------------------------
- ; Umieszczenie poczatku procedury obslugi przerwania licznika T0 pod
- adresem 0000BH
- org 000BH
- jmp Timer0_Int ; skok do faktycznego poczatku procedury obslugi
- przerwania licznika T0
- ;-------------------------------------------------------------------------------------------------------
- ; konfiguracja mikrokontrolera
- ;-------------------------------------------------------------------------------------------------------
- Poczatek:
- mov WDTCN, #0DEh; wylaczenie watchdoga
- mov WDTCN, #0ADh; wylaczenie watchdoga
- mov SFRPAGE, #CONFIG_PAGE; wlaczenie odpowiedniej konfiguracji SFR-ow
- mov XBR2, #040h ; wlaczenie krosownicy
- ;-------------------------------------------------------------------------------------------------------
- ; PROGRAM GLOWNY
- ;-------------------------------------------------------------------------------------------------------
- ; inicjalizacja
- mov SP, #TOS ; inicjalizacja stosu
- mov P5MDOUT, #08h ;tryb push pull dla sterowania podswietlaniem
- setb LCD_LIGHT ; włączenie podswietlania
- clr Ready ; wyzerowanie flagi Ready
- mov Del, #DelReload ; zaladuj liczbe przerwan do odliczenia
- call Timer0_Init ; wywolanie procedury konfiguracji licznika T0
- ; aktywacja systemu przerwan
- setb ET0 ; uaktywnienie przerwania licznika T0
- setb EA ; globalne uaktywnienie systemu przerwan
- mov DPTR, #tablica
- mov R7, #4
- call configuracja
- ;Mode Set
- mov A, #84h ; CG_ROM, TEXT ONLY
- call write_command
- ;Display Mode Set
- mov A, #94h ; grafika OFF,
- text ON, kursor OFF, migotanie OFF
- call write_command
- ;Addres początkowy dla zapisu danych do pamięci VRAM(grafika):
- mov R7, #1
- call configuracja
- ;czyszczenie:
- ;Czyszczenie pamieci graficznej:
- mov R2, #13h
- mov R3, #0FFh
- petla_czysc_grafike:
- mov A, #00h ; znak zera do akumulatora
- call write_data
- mov A, #0C0h ; Zapis do VRAM
- call write_command ; zapis znaku
- djnz R3, petla_czysc_grafike
- mov R3, #0FFh
- djnz R2, petla_czysc_grafike ; licznik
- ;Addres początkowy dla zapisu danych do pamięci VRAM(text):
- mov R7, #1
- call configuracja
- czyszczenie:
- ;Czyszczenie pamieci tekstowej:
- mov R2, #04h
- mov R3, #0FFh
- Petla_czysc_text:
- mov A, #00h ; znak zera do akumulatora
- call write_data
- mov A, #0C0h ; Zapis do VRAM
- call write_command ; zapis znaku
- djnz R3, Petla_czysc_text
- mov R3, #0FFh
- djnz R2, Petla_czysc_text ; licznik
- ;=========================
- Wartosci_poczatkowe:
- mov DPTR, #Display ;poczatek tablicy do wyswietlenia
- mov R2, #167d ;miejsce rozpoczecia wyswietlania,
- w pierwszej niepotrzebne
- ;petla_glowna:
- poczatek_wyswietlania:
- jnb ready, poczatek_wyswietlania
- clr ready
- mov R0, #00h
- ;Addres początkowy dla zapisu danych do pamięci VRAM(text):
- mov A, R2
- call write_data
- mov A, #17H
- call write_data
- mov A, #24h
- call write_command
- petla_wyswietlania:
- mov A, R0 ;sprowadzenie znaku
- movc A,@A+DPTR ;z Displaya
- cjne A,#0Dh,dalej ;porownojemy ze znakiem oznaczajacym
- koniec Displaya
- jmp koniec_napisu
- dalej:
- subb A, #20h ;konwersja ASCII->LCD_HEX
- call write_data
- mov A, #0C0h ;zapis do VRAM
- call write_command ; zapis znaku
- ;nastepny znak:
- inc R0
- jmp petla_wyswietlania
- koniec_napisu:
- dec R2
- cjne R2, #00h, idz
- jmp drugie_wyswietlanie
- idz:
- cjne R0, #00h, poczatek_wyswietlania
- ;jmp Wartosci_poczatkowe
- drugie_wyswietlanie: ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- poczatek_wyswietlania2:
- jnb ready, poczatek_wyswietlania2
- clr ready
- mov R0, #00h
- ;Addres początkowy dla zapisu danych do pamięci VRAM(text):
- mov A, R2
- call write_data
- mov A, #17H
- call write_data
- mov A, #24h
- call write_command
- petla_wyswietlania2:
- mov A, R0 ;sprowadzenie znaku
- movc A,@A+DPTR ;z Displaya
- cjne A,#0Dh,dalej2 ;porownojemy ze znakiem
- oznaczajacym koniec Displaya
- jmp koniec_napisu2
- dalej2:
- subb A, #20h ;konwersja ASCII->LCD_HEX
- call write_data
- mov A, #0C0h ;zapis do VRAM
- call write_command ; zapis znaku
- ;nastepny znak:
- inc R0
- jmp petla_wyswietlania2
- koniec_napisu2:
- inc DPTR
- mov A, #0
- movc A, @A+DPTR
- cjne A, #0Dh, idz2
- mov DPTR, #Display
- jmp czyszczenie
- idz2:
- cjne R0, #00h, poczatek_wyswietlania2
- program_start:
- jmp program_start
- ;-----------------------------------------------------------------------------------------------
- ; PROCEDURY
- ;-----------------------------------------------------------------------------------------------
- ;sprawdzanie zajetosci LCD:
- ;Configuracja
- configuracja:
- mov A, R7
- mov R4, A
- petla:
- mov A, #0
- movc A, @A+DPTR
- call write_data
- inc DPTR
- mov A, #0
- movc A, @A+DPTR
- call write_data
- inc DPTR
- mov A, #0
- movc A, @A+DPTR
- call write_command
- inc DPTR
- djnz R4, petla
- ret
- zajety:
- push ACC ; zapamietaj A na stosie
- setb LCD_CD ; wysylaj command
- setb LCD_RW ; czytaj wyswietlacz
- mov LCD_DATA, #0FFh ; jedynki na DATA
- check:
- mov R1, #10h ;opoznienie
- djnz R1, $
- clr LCD_CE ; wlacz kontroler LCD
- mov R1, #10h ;opoznienie
- djnz R1, $
- mov A, LCD_DATA ; odczytaj status
- setb LCD_CE ; wylacz kontroler LCD
- jnb ACC.0, check
- jnb ACC.1, check ; sprawdz, czy wyswietlacz zajety
- mov R1, #10h ;opoznienie
- djnz R1, $
- pop ACC ; przywroc A ze stosu
- ret
- ;zapis polecenia:
- write_command:
- call zajety ; sprawdz, czy wyswietlacz gotowy
- nop
- nop
- clr LCD_RW ; zapisuj do wyswietlacza
- setb LCD_CD ; wysylaj command
- mov LCD_DATA, A ; wyslij polecenie z akumulatora
- clr LCD_CE ; wlacz kontroler LCD
- mov R1, #10h ;opoznienie
- djnz R1, $
- setb LCD_CE ; wylacz kontroler LCD
- ret
- ;zapis danej:
- write_data:
- call zajety
- nop
- nop
- clr LCD_RW ; zapisuj do wyswietlacza
- clr LCD_CD ; wysylaj data
- mov LCD_DATA, A ; wyslij dana z akumulatora
- clr LCD_CE ; wlacz kontroler LCD
- mov R1, #10h ;opoznienie
- djnz R1, $
- setb LCD_CE ;wylacz kontroler LCD
- ret
- Timer0_Init:
- ; wybranie odpowiedniej strony rejestrow specjalnych
- mov SFRPAGE, #TIMER01_PAGE
- ; skonfigurowanie licznika T0 w trybie 1 (16-bitowy)
- anl TMOD, #0F0H ; iloczyn logiczny zawartosci rejestru
- TMOD i stalej 0F0H
- orl TMOD, #T0_TMOD ; suma logiczna zawartosci rejestru
- TMOD i stalej T0_TMOD
- ; zapisanie wartosci poczatkowej licznika
- call Timer0_Reload
- ; uruchomienie licznika
- setb TR0 ; nadanie wartosci 1 bitowi TR0 (TCON)
- ; przywrocenie odpowiedniej strony rejestrow specjalnych
- mov SFRPAGE, #CONFIG_PAGE
- ret
- ;---------------------------------------------------------------------------------------------------
- Timer0_Reload:
- ; zapisanie poczatkowej wartosci rejestrow licznika
- mov TH0, #High(T0_Reload) ; zapis starszego bajtu stalej
- T0_Delay w rejestrze TH0
- mov TL0, #Low(T0_Reload) ; zapis mlodszego bajtu stalej
- T0_Delay w rejestrze TL0
- ret
- ;---------------------------------------------------------------------------------------------------
- ; procedura obslugi przerwania licznika T0
- Timer0_Int:
- mov SFRPAGE, #TIMER01_PAGE ; wybierz strone rejestrow
- specjalnych umozliwiajaca obsluge licznika T0
- call Timer0_Reload ; zaladuj wartosc poczatkowa do
- licznika T0
- mov SFRPAGE, #CONFIG_PAGE ; wroc do wlasciwej strony
- rejestrow specjalnych
- djnz Del, Timer0_Int_Exit ; jezeli nie odliczono zadanej
- liczby przerwan wyjdz z procedury
- mov Del, #DelReload ; zaladuj liczbe przerwan do odliczenia
- setb Ready ; ustaw flage Ready
- Timer0_Int_Exit:
- reti ; wroc z procedury obslugi przerwania
- tablica:
- db 00h, 00h, 42h ;;Poczatkowy adres VRAM dla danych graficznych (GH)
- db 15h, 00h, 43h ;Liczba kolumn danych graficznych w linii (GA)
- db 00h, 17h, 40h ;Poczatkowy adres VRAM dla danych textowych (TH)
- db 15h, 00h, 41h ;Liczba kolumn w linii wyświetlacza (TA)
- db 00h, 00h, 24h ;Addres początkowy dla zapisu danych do pamięci VRAM(grafika):
- db 00h, 17h, 24h ;Addres początkowy dla zapisu danych do pamięci VRAM(text):
- Display:
- db 'There`s a lady who`s '
- db 'shure all that gleate'
- db 'rns is gold and she`s'
- db 'buying a stairway to '
- db 'heaven. R Plant '
- ; db ' '
- db 0Dh
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement