logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

8051 i LCD: jak napisać kod w asemblerze do wyświetlania tekstu na wyświetlaczu?

Czyzak 16 Wrz 2006 19:36 1452 4
REKLAMA
  • #1 3026737
    Czyzak
    Poziom 13  
    Posty: 123
    Pomógł: 1
    Ocena: 1
    Wyjaśnijcie mi jak mam zaprogramować 8051 żeby wyświetlić jakieś zdanie na wyświetlaczu LCD!

    pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 3026819
    Łuk_F
    Poziom 17  
    Posty: 257
    Pomógł: 34
    Ocena: 12
    Witam

    Zamieszczam program który może pomóc. Jest on napisany w programie Keil mVision.

    
    ;----------------------------------------------------------------------
    ; 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
    ;----------------------------------------------------------------------
    
  • REKLAMA
  • #3 3027482
    Czyzak
    Poziom 13  
    Posty: 123
    Pomógł: 1
    Ocena: 1
    fajne :) a jak zrobić żeby tekst był też w drugiej linii? bo mam wyświetlacz 2x16...

    pozdrawiam
  • REKLAMA
  • Pomocny post
    #4 3028112
    Łuk_F
    Poziom 17  
    Posty: 257
    Pomógł: 34
    Ocena: 12
    Każde miejsce w linijce ma swój adres. Trzeba się dowiedzieć jakie adresy mają linijki (Pierwsza linijka tj.8 znaków ma adresy 0h-7h, druga linijka ma adresy 40h-47h, trzecią i czwartą trzeba by poszukać w internecie lub poszukac na chybił trafił).
  • #5 3028272
    Czyzak
    Poziom 13  
    Posty: 123
    Pomógł: 1
    Ocena: 1
    dzieki, w datasheet pisało :)

    jak by co to podaje, może komuś sie przyda

    wyswietlacz to WC1602A a adresy są takie, że w pierwszej lini adresy są od 00h do 0Fh (pierwsze 16 znaków) a druga linia to adresy od 40h do 4Fh.

    temat zamykam, dziękuję!
REKLAMA