Wyjaśnijcie mi jak mam zaprogramować 8051 żeby wyświetlić jakieś zdanie na wyświetlaczu LCD!
pozdrawiam
pozdrawiam
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tam
;----------------------------------------------------------------------
; Definicje:
; LCD_D Port D do komunikacji z LCD
; LCD_RS Linia R/~S do podłączenia LCD
; LCD_EN Linia ENABLE do podłączenia LCD
; Linia R/~W wyświetlacza LCD powinna być na stałe w stanie niskim.
;----------------------------------------------------------------------
; Dostępne procedury:
; - LCD_init Inicjuje wyświetlacz, tryb 8-bitowy, wyświetlacz
; jednowierszowy. WYWOŁAĆ RAZ NA POCZĄTKU PROGRAMU.
; - LCD_kursor Ustawia kursor w pozycji podanej w rejestrze A
; Na wyświetlaczu jednowierszowym pierwsze 8 znaków
; ma pozycje od 00h do 07h, następne 8 znaków ma pozycje
; od 40h do 47h.
; - LCD_znak Pisze na wyświetlaczu (w pozycji kursora) znak
; podany w rejestrze A. Dostępne są znaki ASCII
; o kodach poniżej 128 (bez znaków alfabetów narodowych).
;----------------------------------------------------------------------
; Procedury pomocniczne (nie wywoływać w programie głównym):
; - LCD_delay wprowadza opóźnienie ok. 2*DPTR [us] dla zegara 12 MHz,
; - LCD_command zapisuje komendę do LCD,
; - LCD_data zapisuje dane do LCD.
;----------------------------------------------------------------------
.EQU LCD_D, P1 ; można wybrać dowolne porty,
.EQU LCD_RS, P3.7 ; wartości P1, P3.7, P3.5 są
.EQU LCD_EN, P3.5 ; przykładowe
;----------------------------------------------------------------------
org 0000h
acall LCD_init
PETLA:
mov A, #0 ;miejsce gdzie ma się ustawić kursor
acall LCD_kursor ;ustaw tam kursor
mov A, #'K' ;jaka litera
acall LCD_znak ;wyswietl litere
JMP PETLA
LCD_init:
CLR LCD_EN
MOV DPTR, #25000d ; opóźnienie ok. 50 ms (ma być 20 ms)
ACALL LCD_delay
MOV LCD_D, #30h ; "Function Set" po raz pierwszy
ACALL LCD_command
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 4,2 ms)
ACALL LCD_delay
ACALL LCD_command ; "Function Set" po raz drugi
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 100 us)
ACALL LCD_delay
ACALL LCD_command ; "Function Set" po raz trzeci
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 100 us)
ACALL LCD_delay
ACALL LCD_command ; "Function Set" po raz czwarty
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 40 us)
ACALL LCD_delay
MOV LCD_D, #08h ; "Display Off"
ACALL LCD_command
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 40 us)
ACALL LCD_delay
MOV LCD_D, #01h ; "Display Clear"
ACALL LCD_command
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 1,64 ms)
ACALL LCD_delay
MOV LCD_D, #06h ; "Entry Mode Set" (autoinkrementacja
ACALL LCD_command ; kursora)
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 40 us)
ACALL LCD_delay
MOV LCD_D, #0Ch ; "Display On" (kursor niewidoczny)
ACALL LCD_command
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 40 us)
ACALL LCD_delay
RET
;----------------------------------------------------------------------
LCD_kursor:
SETB ACC.7 ; "DD RAM Address Set"
MOV LCD_D, A
ACALL LCD_command
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 40 us)
ACALL LCD_delay
RET
;----------------------------------------------------------------------
LCD_znak:
MOV LCD_D, A ; "Data Write"
ACALL LCD_data
MOV DPTR, #5000d ; opóźnienie ok. 10 ms (ma być 40 us)
ACALL LCD_delay
RET
;----------------------------------------------------------------------
;----------------------------------------------------------------------
;----------------------------------------------------------------------
LCD_delay:
DJNZ DPL, LCD_delay
DJNZ DPH, LCD_delay
RET
;----------------------------------------------------------------------
LCD_command:
CLR LCD_RS ; RS=1 - zapis komendy
SETB LCD_EN
CLR LCD_EN ; machnięcie strobem
RET
;----------------------------------------------------------------------
LCD_data:
SETB LCD_RS ; RS=0 - zapis danych
SETB LCD_EN
CLR LCD_EN ; machnięcie strobem
RET
;----------------------------------------------------------------------