AT89C2051+LCD



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: Andrew <amisinsk_at_nospam_elka.pw.edu.pl>
Subject: AT89C2051+LCD
Date: Fri, 05 Nov 1999 17:32:16 +0100


; Zwracam sie z problem juz niejednokrotnie goscil na lamach listy, ale
...
;
; Ludzie, czy moglby mi ktos pomoc w analizie takiego programiku na
8051?
; Chce podlaczyc LCD do AT89C2051, ale to paskudztwo mowi "nie".
; Czy moglby mi ktos napisac gdzie popelnilem blad?
; Po podlaczeniu zasilania w wyswietlaczu zapala sie tylko gorna linia,
; tak jakby tego Atmela tam nie bylo.
; Mam tez pytanko. Czy na takim Atmelku (89C2051) mozna uzyc trybu
; 8-bitowego na porcie P1? Mam pewne watpliwosci czy P1.0 i P1.1 dadza
; sobie rade z wysterowaniem wyswietlacza. (Oczywiscie chodzi mi o
bezposrednie
; podlaczenie tych linii do wyswietlacza).
; Czy podlaczenie wszystkich linii danych moze miec jakies konsekwencje
; dla dzialania programu?
; Bylbym wdzieczny gdyby ktos pomogl mi uporac sie z tym problemem.


; Czasy oczekiwan sa specjalnie wydluzone.


; Tryb 4-bitowy
;
; Opis podlaczenia
;
; AT89C2051 LCD (Agena AA16203)
; P1.7|---|DB7 (14)
; P1.6|---|DB6
; P1.5|---|DB5 .
; P1.4|---|DB4 .
; P1.3|---|DB3 .
; P1.2|---|DB2 .
; P1.1|---|DB1
; P1.0|---|DB0 (7)
; P1.7|---|RW (6)
; P1.7|---|RS (5)
; P3.7|---|Enable (4)
;


;Program do obsˆugi LCD - sprawdzanie kod˘w

DB0 EQU P1.0
DB1 EQU P1.1
DB2 EQU P1.2
DB3 EQU P1.3
DB4 EQU P1.4
DB5 EQU P1.5
DB6 EQU P1.6
DB7 EQU P1.7
EN EQU P3.7
RS EQU P3.3
RW EQU P3.2
DATA EQU P1

ORG 0000h

Mov R7,#0
Mov R6,#0
Mov R5,#20h
Setb EN ; Ustawienie Enable
Start:
Call Wait
Djnz R6,Start ; Oczekiwanie na Reset LCD (32*65ms)

Clr RW
Clr RS
Mov DATA,#30h ; Ustawienie danych na 30h

Call Enable ; Wyslanie danych na LCD
Call Enable ; i odczekanie 65 tys cykli masz(ok 65 ms)
Call Enable ; (trzy razy)

Mov DATA,#20h ; Tryb 4 bitowy
Call Enable

Call Enable
Mov DATA,#80h ; Tryb 2 wierszowy
Call Enable

Mov DATA,#0
Call Enable
Mov DATA,#80h ; Display OFF
Call Enable

Mov DATA,#0
Call Enable
Mov DATA,#10h ; Display ON
Call Enable

Mov DATA,#0
Call Enable
Mov DATA,#60h ; Entry Mode Set
Call Enable

Mov A,#30h
Petla: ; Wypisanie kodow znakow od 30h do 50h

Setb RS ; Wysylanie danych
Mov DATA,A
Call Enable ; Wyslanie starszych bitow danych
Swap A
Mov DATA,A
Call Enable ; Wyslanie czterech mlodszych bitow
Swap A
Inc A ; Zwiekszenie kodu znaku
Cjne A,#50h,Petla ; Sprawdzenie czy kod znaku nie jest rowny 50h

Stop:
Jmp Stop


Enable: ; Zatrzasniecie danych
Clr EN
Call Wait
Setb EN
Call Wait
Ret

Wait: ; Procedura oczekiwania 65.536 cykli maszynowych
Djnz R7,Wait
Djnz R6,Wait
ret


END

Kolega mowil mi, ze jego znajomy odpalil ten wyswietlacz na zwyklych
przelacznikach i ze sterownik LCD jest zgodny z HD44780.


Dzieki
Andrzej.
amisiek_at_nospam_yahoo.com




Poprzedni Następny
Wiadomość
Spis treści
From: "Maciek P" <master_at_nospam_zeus.polsl.gliwice.pl>
Subject: Odp: AT89C2051+LCD
Date: Fri, 05 Nov 1999 23:47:53 GMT


Co do linii P1.0 i P1.1 - wystarczy je dołączyć przez rezystorki do
zasilania i będzie grało.
Na pierwszy rzut oka widzę też, że :
- w procedurze Enable zatrzaskujesz dane impulsem '0', a powinno być na
odwrót;
- wpisujesz błędne słowa sterujące

To jest fragment opisu HD44780 (najlepiej oglądać z fontem courier):

function D/I R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
-------- | | | | | | | | | |
execution time | | | | | | | | | |
description | | | | | | | | | |
----------------------------------------------------------------------------
---------
1 clear display 0 0 0 0 0 0 0 0 0 1
1.64ms
clears all display and returns the cursor to the home position (adr0)

2 return home 0 0 0 0 0 0 0 0 1 *
1.64ms
returns the cursor to the home position (adr0). Also returns the display
being shifted to the original position DD RAM contents remain unchanged.

3 entry mode set 0 0 0 0 0 0 0 1 I/D S
40us
sets the cursor move direction and specifies or not to shift the display.
These operations are performed during data write and read

4 display ON/OFF 0 0 0 0 0 0 1 D C B
40us
sete ON/OFF all display (D), cursor control ON/OFF (C),and blink of
cursor position character (B)

5 cursor and 0 0 0 0 0 1 S/C R/L * *
40us
moves the cursor and shift the display display shift without
changing DD RAM contents

6 fundtion set 0 0 0 0 1 DL N F * *
40us
sets interface data length (DL) number of display lines (N) and
character font (F)

7 set CG RAM 0 0 0 1 ( ACG )
40us
sets the CG RAM address.DD RAM data address is sent and recives
after this setting

8 set DD RAM 0 0 1 ( ADD )
40us
sets DD RAM address.DD RAM data is address sent and recived after this
setting

9 read busy flag 0 1 BF ( AC )
0us
reads busy flag (BF) indicating & address internal operation is being
performed
and reads address counter contents

10 write data 1 0 ( write data )
40us
writes data into DD RAM or CG RAM to CG or DD RAM

11 read data 1 1 ( read data )
40us
reads data from DD RAM or CG RAM from CG or DD RAM

----------------------------------------------------------------------------
---------
I/D = 1: increment (+1) I/D = 0: decrement(-1) DD RAM: display data RAM
S = 1: accompanies display shift CG RAM: character generator
RAM
S/C = 1: display shift S/C=0: cursor move ACG : CG RAM address
R/L = 1: shift to the right ADD : DD RAM address
R/L = 0: shift to the left corresponds to
cursor address
D/L = 1: 8bits DL = 0: 4bits AC : address counter used
for both
N = 1: 2lines N = 0: 1 line of DD and CG RAM
address
F = 1: 5810dots F= 0: 587 dots
BF = 1: internally operating
BF = 0: can accept instruction
----------------------------------------------------------------------------
---------



Użytkownik Andrew <amisinsk_at_nospam_elka.pw.edu.pl> w wiadomości do grup
dyskusyjnych napisał:38230690.883ACDBA_at_nospam_elka.pw.edu.pl...
; Zwracam sie z problem juz niejednokrotnie goscil na lamach listy, ale
...
;
; Ludzie, czy moglby mi ktos pomoc w analizie takiego programiku na
8051?
; Chce podlaczyc LCD do AT89C2051, ale to paskudztwo mowi "nie".
; Czy moglby mi ktos napisac gdzie popelnilem blad?
; Po podlaczeniu zasilania w wyswietlaczu zapala sie tylko gorna linia,
; tak jakby tego Atmela tam nie bylo.
; Mam tez pytanko. Czy na takim Atmelku (89C2051) mozna uzyc trybu
; 8-bitowego na porcie P1? Mam pewne watpliwosci czy P1.0 i P1.1 dadza
; sobie rade z wysterowaniem wyswietlacza. (Oczywiscie chodzi mi o
bezposrednie
; podlaczenie tych linii do wyswietlacza).
; Czy podlaczenie wszystkich linii danych moze miec jakies konsekwencje
; dla dzialania programu?
; Bylbym wdzieczny gdyby ktos pomogl mi uporac sie z tym problemem.


; Czasy oczekiwan sa specjalnie wydluzone.


; Tryb 4-bitowy
;
; Opis podlaczenia
;
; AT89C2051 LCD (Agena AA16203)
; P1.7|---|DB7 (14)
; P1.6|---|DB6
; P1.5|---|DB5 .
; P1.4|---|DB4 .
; P1.3|---|DB3 .
; P1.2|---|DB2 .
; P1.1|---|DB1
; P1.0|---|DB0 (7)
; P1.7|---|RW (6)
; P1.7|---|RS (5)
; P3.7|---|Enable (4)
;


;Program do obsˆugi LCD - sprawdzanie kod˘w

DB0 EQU P1.0
DB1 EQU P1.1
DB2 EQU P1.2
DB3 EQU P1.3
DB4 EQU P1.4
DB5 EQU P1.5
DB6 EQU P1.6
DB7 EQU P1.7
EN EQU P3.7
RS EQU P3.3
RW EQU P3.2
DATA EQU P1

ORG 0000h

Mov R7,#0
Mov R6,#0
Mov R5,#20h
Setb EN ; Ustawienie Enable
Start:
Call Wait
Djnz R6,Start ; Oczekiwanie na Reset LCD (32*65ms)

Clr RW
Clr RS
Mov DATA,#30h ; Ustawienie danych na 30h

Call Enable ; Wyslanie danych na LCD
Call Enable ; i odczekanie 65 tys cykli masz(ok 65 ms)
Call Enable ; (trzy razy)

Mov DATA,#20h ; Tryb 4 bitowy
Call Enable

Call Enable
Mov DATA,#80h ; Tryb 2 wierszowy
Call Enable

Mov DATA,#0
Call Enable
Mov DATA,#80h ; Display OFF
Call Enable

Mov DATA,#0
Call Enable
Mov DATA,#10h ; Display ON
Call Enable

Mov DATA,#0
Call Enable
Mov DATA,#60h ; Entry Mode Set
Call Enable

Mov A,#30h
Petla: ; Wypisanie kodow znakow od 30h do 50h

Setb RS ; Wysylanie danych
Mov DATA,A
Call Enable ; Wyslanie starszych bitow danych
Swap A
Mov DATA,A
Call Enable ; Wyslanie czterech mlodszych bitow
Swap A
Inc A ; Zwiekszenie kodu znaku
Cjne A,#50h,Petla ; Sprawdzenie czy kod znaku nie jest rowny 50h

Stop:
Jmp Stop


Enable: ; Zatrzasniecie danych
Clr EN
Call Wait
Setb EN
Call Wait
Ret

Wait: ; Procedura oczekiwania 65.536 cykli maszynowych
Djnz R7,Wait
Djnz R6,Wait
ret


END

Kolega mowil mi, ze jego znajomy odpalil ten wyswietlacz na zwyklych
przelacznikach i ze sterownik LCD jest zgodny z HD44780.


Dzieki
Andrzej.
amisiek_at_nospam_yahoo.com






Poprzedni Następny
Wiadomość
Spis treści
From: "Maciek P" <master_at_nospam_zeus.polsl.gliwice.pl>
Subject: Odp: AT89C2051+LCD
Date: Sat, 06 Nov 1999 00:01:21 GMT


Sorry, te instrukcje sterujące są w porządku. Problem tkwi tylko w negacji
linii EN.




Poprzedni Następny
Wiadomość
Spis treści
From: Andrew <amisinsk_at_nospam_elka.pw.edu.pl>
Subject: Re: AT89C2051+LCD
Date: Sat, 06 Nov 1999 14:10:52 +0100


Sorry, te instrukcje sterujące są w porządku. Problem tkwi tylko w negacji
linii EN.

Zmieniłem procedurę Enable na:

Enable:
Setb EN
Call Wait
Clr EN
Call Wait
Ret

oraz zmieniłem początkowe ustawienie linii Enable na stan niski, ale te zmiany
nie dały efektu. Może mam gdzieś zbyt krótkie czasy oczekiwania na LCD?. Czy
gdybym miał uszkodzony LCD to również paliłby się tylko górny panel?.

Andrzej.


Poprzedni Następny
Wiadomość
Spis treści
From: "Marek '7wiligh7' Lewandowski" <twilight_at_nospam_callisto.krakow.pl>
Subject: Re: AT89C2051+LCD
Date: Sat, 6 Nov 1999 17:54:03 +0100


gdybym miał uszkodzony LCD to również paliłby się tylko górny panel?.

Andrzej.

W tym momencie domyśliłem się, że masz 2x16 znaków, nie?
LCD inicjują się w domyśle w trybie "1 linia", musisz wysłać najpierw
komendę inicjalizacji na 2 linie, (jeśli zrobisz to poprawnie - lcd odbierze
komendę) poziom "zapalenia" górnej linii się zmniejszy, obie linie powinny
być równe. Jeśli tak się stanie, a wysyłanych znaków dalej nie będziesz
widział - pokręć kontrastem.
Dodaj też te rezystorki podciągające, o których kotoś pisał - na nóżki p1.0
i p1.1

--
Marek Lewandowski
Student_at_nospam_ Technical University of Gdańsk
twilight_at_nospam_callisto.krakow.pl ICQ# 10139051
www.callisto.krakow.pl/~twilight





Poprzedni Następny
Wiadomość
Spis treści
From: Andrew <amisinsk_at_nospam_elka.pw.edu.pl>
Subject: Re: AT89C2051+LCD
Date: Mon, 08 Nov 1999 18:57:48 +0100


W tym momencie domyśliłem się, że masz 2x16 znaków, nie?

Zgadza się.


LCD inicjują się w domyśle w trybie "1 linia", musisz wysłać najpierw
komendę inicjalizacji na 2 linie, (jeśli zrobisz to poprawnie - lcd odbierze
komendę) poziom "zapalenia" górnej linii się zmniejszy, obie linie powinny
być równe. Jeśli tak się stanie, a wysyłanych znaków dalej nie będziesz
widział - pokręć kontrastem.

Inicjalizację mam już chyba za sobą. Dzięki.


Dodaj też te rezystorki podciągające, o których kotoś pisał - na nóżki p1.0
i p1.1

Dołączyłem i jadę teraz w trybie ośmiobitowym. Niestety mam jeszcze jakieś
problemy z wysyłaniem znaków.

Andrzej.



Poprzedni Następny
Wiadomość
Spis treści
From: Rafal Kolano <rkolano_at_nospam_lucent.com>
Subject: Re: AT89C2051+LCD
Date: Mon, 08 Nov 1999 10:04:25 +0100


Andrew wrote:
=

; Zwracam sie z problem juz niejednokrotnie goscil na lamach listy, ale=

...
;


=

; Tryb 4-bitowy
;
; Opis podlaczenia
;
; AT89C2051 LCD (Agena AA16203)
; P1.7|---|DB7 (14)
; P1.6|---|DB6
; P1.5|---|DB5 .
; P1.4|---|DB4 .
; P1.3|---|DB3 .
; P1.2|---|DB2 .
; P1.1|---|DB1
; P1.0|---|DB0 (7)
; P1.7|---|RW (6)
; P1.7|---|RS (5)
; P3.7|---|Enable (4)
;
=


Po pierwsze nie zgadzaja mi sie piny z tym co jest w programie:
P1.7---RS opis pinow
P3.3--- RS w programie =

i kilka innych pinow :(((


Po drugie: czy piny P1.0 i P1.1 podlaczyles rezystorkiem do + zasilania ?=
??


;Program do obs=88ugi LCD - sprawdzanie kod=A2w
=

DB0 EQU P1.0
DB1 EQU P1.1
DB2 EQU P1.2
DB3 EQU P1.3
DB4 EQU P1.4
DB5 EQU P1.5
DB6 EQU P1.6
DB7 EQU P1.7
EN EQU P3.7
RS EQU P3.3
RW EQU P3.2
DATA EQU P1
=

=

Kolega mowil mi, ze jego znajomy odpalil ten wyswietlacz na zwyklych
przelacznikach i ze sterownik LCD jest zgodny z HD44780.
=

Dzieki
Andrzej.
amisiek_at_nospam_yahoo.com

-- =

|
|
+ \
\\.G_.*=3D. Rafal Kolano
`(#'/.\| rkolano_at_nospam_lucent.com
.>' (_--.
_=3D/d ,^\
~~ \)-' '
/ |
---'--'-------------------------------

Poprzedni Następny
Wiadomość
Spis treści
From: Andrew <amisinsk_at_nospam_elka.pw.edu.pl>
Subject: Re: AT89C2051+LCD
Date: Mon, 08 Nov 1999 18:48:34 +0100


; AT89C2051 LCD (Agena AA16203)
; P1.7|---|DB7 (14)
; P1.6|---|DB6
; P1.5|---|DB5 .
; P1.4|---|DB4 .
; P1.3|---|DB3 .
; P1.2|---|DB2 .
; P1.1|---|DB1
; P1.0|---|DB0 (7)
; P1.7|---|RW (6)
; P1.7|---|RS (5)
; P3.7|---|Enable (4)
;


Po pierwsze nie zgadzaja mi sie piny z tym co jest w programie:
P1.7---RS opis pinow
P3.3--- RS w programie
i kilka innych pinow :(((


Sorry. Pomyliłem się w schemacie. Powinno być tak jak w programie:
; P3.7|---|Enable (6)
; P3.2|---|RW (5)
; P3.3|---|RS (4)



Po drugie: czy piny P1.0 i P1.1 podlaczyles rezystorkiem do + zasilania ???

Nie łączyłem ponieważ chciałem sterować wyświetlacz w trybie czterobitowym,
ale teraz mam już podłączone i próbuję z przesyłem danych na ośmiu 'drutach'.
Znalazłem w końcu jeden błąd. Oczywiście był on bardzo prozaiczny.
Proszę zwrócić uwagę na fragment:

Start:
Call Wait
Djnz R6,Start ; Oczekiwanie na Reset LCD (32*65ms)
.
.
.
Wait: ; Procedura oczekiwania 65.536 cykli maszynowych
Djnz R7,Wait
Djnz R6,Wait
ret

Jak widać procedura Wait zawsze ustawia R6 na 0, a następna instrukcja (Djnz)
zmniejsza R6 o jeden i sprawdza czy nie wyszło zero. Oczywiście po takim
działaniu jest zawsze 255 więc tworzy się pętla bez wyjścia. W założeniach
miało być: Djnz R5,Start.

Żeby szczęście nie było pełne to LCD przechodzi inicjalizację, ale niestety nie
chce wypisywać danych.
I jeszcze jedno: Czy 10kOhm-ów to dobra wartość dla rezystorów podciągających
(P1.0 i P1.1)?


Dzięki za zwrócenie uwagi.
Andrzej.


Poprzedni Następny
Wiadomość
Spis treści
From: Andrew <amisinsk_at_nospam_elka.pw.edu.pl>
Subject: Re: AT89C2051+LCD
Date: Tue, 09 Nov 1999 11:45:23 +0100


No nareszcie gra i "bucy". Pomyliłem się w podłączeniu linii RS.

Dzięki wszystkim.
Andrzej.