Forum: Mikrocontroller und Digitale Elektronik Hab da ein LCD Init Problem


von Karl T. (don_karlo)


Lesenswert?

Hab da ein Stück Code:

.equ  lcdrs  =PD0    ;LCD rs  Pin connected to PD6
.equ  lcdrw  =PD1    ;LCD r/w Pin connected to PD5
.equ  lcde  =PD2    ;LCD e   Pin connected to PD4
; das sind die Steuerleitungen,das wurde bereits geändert
-------------------------------------------------
            WO WIRD DAS FESTGELEGT ?
;D4-D7 FROM LCD IS CONNECTED TO PORTD PD0-PD3
Wo müsste da geändert werden,um auf PORTD PD4-PD7 die
LCD Daten auszugeben ?
(Die LCD's sind mit Flachbandkabeln fix verpresst,Entlöten fast 
unmöglich,
)
-------------------------------------------------
lcdinit:

  ldi  wreg,0    ;Setup port pins
  out  PORTD,wreg  ;Pull all pins low
  ldi  wreg,0xff  ;All pins are outputs
  out  DDRD,wreg
  ldi  timeout,255  ;Wait at least 15 mS at power up
  rcall  delay
  ldi  wreg,3    ;Function set
  out  PORTD,wreg
;  rcall  strobe    ;Toggle enable line
  sbi  PORTD,lcde  ;Toggle enable line
  cbi  PORTD,lcde
  ldi  timeout,65  ;Wait at least 4.1 mS
  rcall  delay
  ldi  wreg,3    ;Function set
  out  PORTD,wreg
;  rcall  strobe    ;Toggle enable line
  sbi  PORTD,lcde  ;Toggle enable line
  cbi  PORTD,lcde
  ldi  timeout,2  ;Wait at least 100 uS
  rcall  delay
  ldi  wreg,3    ;Function set
  out  PORTD,wreg
;  rcall  strobe    ;Toggle enable line
  sbi  PORTD,lcde  ;Toggle enable line
  cbi  PORTD,lcde
  ldi  wreg,2    ;Function set, 4 line interface
  out  PORTD,wreg
;  rcall  strobe    ;Toggle enable line
  sbi  PORTD,lcde  ;Toggle enable line
  cbi  PORTD,lcde
  ldi  wreg,0b11110000  ;Make 4 data lines inputs


  out  DDRD,wreg

;  At this point, the normal 4 wire command routine can be used

  ldi  wreg,0b00100000  ;Function set, 4 wire, 2 line, 5x7 font
  rcall  lcdcmd
  ldi  wreg,0b00001110  ;Display on,  cursor on, blink off
  rcall  lcdcmd
  ldi  wreg,0b00000110  ;Address increment, no scrolling
  rcall  lcdcmd

  ret

mfg Karl

von Karl H. (kbuchegg)


Lesenswert?

Karl T. schrieb:

> -------------------------------------------------
>             WO WIRD DAS FESTGELEGT ?
> ;D4-D7 FROM LCD IS CONNECTED TO PORTD PD0-PD3
> Wo müsste da geändert werden,um auf PORTD PD4-PD7 die
> LCD Daten auszugeben ?

zb hier

>   ldi  wreg,3    ;Function set
>   out  PORTD,wreg
3 wird am PORTD ausgegeben.
Damit tauchen die Bits an D0 bis D3 auf (und auch D4 bis D7 werden auf 0 
gesetzt. Aber das scheint hier nicht zu stören)

>   ldi  wreg,3    ;Function set
>   out  PORTD,wreg
noch mal

>   ldi  wreg,3    ;Function set
>   out  PORTD,wreg
und nochmal

>   ldi  wreg,2    ;Function set, 4 line interface
>   out  PORTD,wreg
eine weitere Ausgabe


>   ldi  wreg,0b11110000  ;Make 4 data lines inputs
>
>
>   out  DDRD,wreg
Das ist eigenartig. Warum soll man die Datenleitungen Input machen

>
> ;  At this point, the normal 4 wire command routine can be used
>
>   ldi  wreg,0b00100000  ;Function set, 4 wire, 2 line, 5x7 font
>   rcall  lcdcmd
die Funktion muss angepasst werden


Überall dort, wo ein Byte komplett an den PORTD ausgegeben wird (da sind 
dann nur 4 Bits interessant), muss nachgearbeitet werden, wenn die 
Datenleitungen umziehen. Der Code ist nicht so geschrieben, dass man die 
Datenleitungen leicht mit ein paar einfachen Änderungen umlegen kann.

von Michael A. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das ist eigenartig. Warum soll man die Datenleitungen Input machen

Evtl., um vom LCD zu lesen, z.B. RAM-Inhalt oder Status

von Karl H. (kbuchegg)


Lesenswert?

Michael A. schrieb:
> Karl Heinz Buchegger schrieb:
>> Das ist eigenartig. Warum soll man die Datenleitungen Input machen
>
> Evtl., um vom LCD zu lesen, z.B. RAM-Inhalt oder Status

1
...
2
  cbi  PORTD,lcde
3
  ldi  wreg,0b11110000  ;Make 4 data lines inputs
4
5
6
  out  DDRD,wreg
7
8
;  At this point, the normal 4 wire command routine can be used
9
10
  ldi  wreg,0b00100000  ;Function set, 4 wire, 2 line, 5x7 font
11
  rcall  lcdcmd

Wär möglich, wenn auch ungewöhnlich. Umschalten der Datenleitungen auf 
Input ist ungewöhnlich vor dem Aufruf von lcdcmd. Aber man müsste die 
Funktion sehen um das genauer zu entscheiden, ob da ein Busy Wait im 
Spiel ist (und selbst dann sollte die Funktion das IMHO selber machen).

Aber egal. Erst mal so lassen und an die geänderte Pinbelegung anpassen. 
Nicht zu viel auf einmal ändern.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.