Forum: Projekte & Code LCD --> AVR µC


von Uli (Gast)


Angehängte Dateien:

Lesenswert?

Source Code und Doku zum Anschluss eines Standart LCDs an einen AVR µC.

Mfg Ulrich Radig

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Ulrich,

ich hätte eine Frage zur Doku, Seite 4, ganz unten. Das stimmt doch
nicht, wie du es angegeben hast, oder ? Hat das 4x20 schon zwei
Controller ? Ich kenne das so, wie im Anhang. Hab allerdings auch schon
gehört, das es da wohl Abweichungen geben soll.

Gruß
Thorsten

von Uli (Gast)


Lesenswert?

Hallo,

Ja das 4 x 20 hat 2 Controller somit 2 Enable Signale, werde ich noch
in der Doku ändern.

Mfg Ulrich

von Uwe Nagel (Gast)


Lesenswert?

Normalerweise hat ein 4x20 nur einen Controller, jedenfalls reicht er
aus und andere hab ich noch nie gesehen.
Das 4x27, was es bei Pollin gerade gibt, hat es zwei Controller.

von Slowflyer (Gast)


Lesenswert?

Hallo Ulrich,

ich habe deinen Quelltext leicht abgeändert (anpassen an den WinAVR
Compiler, der kein sbi und cbi mehr kennt) übernommen und das LCD an
PortD an einem Mega88 angeschlossen. Hier die Quelltextauszüge:

main.h
1
// LCD 2x16 auf Port D
2
#define LCD_ZEILEN      2     //Anzahl der Zeilen 1,2 oder 4
3
#define LCD_DDR        DDRD  //Port an dem das Display angeschlossen wurde
4
#define LCD_OUT        PORTD
5
#define LCD_IN        PIND
6
#define LCD_RS        4     //Pin für RS
7
#define LCD_RW        5    //Pin für Read/Write
8
#define LCD_E        6     //Pin für Enable
9
#define LCD_DATAOUTPUT    0x0f
10
#define LCD_DATAINPUT    0x00

main.c
1
void lcd_init ()
2
{
3
  char tmp = LCD_ZEILEN;
4
  //Set Port Direction Register to Output for LCD Databus und LCD
5
Steuerbus
6
  LCD_DDR = LCD_DATAOUTPUT+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E);
7
  //Wait a short Time afer Power on
8
  _delay_ms(500);
9
  lcd_write (0x22,0);  //Init in 4 Bit Mode
10
  //Wait a short Time afer Power on
11
  _delay_ms(50);
12
  lcd_write (0x22,0);  //Init in 4 Bit Mode (Zur Sicherheit nochmal)  
13
  if (tmp == 1)
14
    {
15
    lcd_write (0x20,0);  //1 Zeilen
16
    }
17
    else
18
    {
19
    lcd_write (0x28,0);  //mehrere Zeilen
20
    }
21
  lcd_write (0x0C,0);  //Display On
22
  lcd_write (0x80,0);  //Set DD-Ram Adresse = 0
23
  return;
24
}
25
26
// by Ulrich Radig
27
// löscht das LCD, den Text im Buffer des LCD-Structs, 
28
// die Cursor-Eigenschaften (nicht sichtbar, Position 0, etc.)
29
void lcd_clear ()
30
{
31
  lcd_write (1,0); //Clear Display
32
  lcd_write (0x80,0);  //Set DD-Ram Adresse = 0
33
  return;
34
}
35
36
void lcd_clear ()
37
{
38
  lcd_write (1,0); //Clear Display
39
  lcd_write (0x80,0);  //Set DD-Ram Adresse = 0
40
  return;
41
}
42
43
void lcd_write (char data, char type)
44
{
45
  //Set Port Direction Register to Output for LCD Databus und LCD
46
Steuerbus
47
  LCD_DDR = LCD_DATAOUTPUT+(1<<LCD_RS | 1<<LCD_RW | 1<<LCD_E);
48
  //Soll ins Seuer oder Datenregister geschrieben werden?
49
  if (type == 0)
50
    {
51
    (LCD_OUT &= ~(1<<LCD_RS));  // cbi(LCD_OUT,LCD_RS); //RS = 0
52
Steuerregister
53
    }
54
    else
55
    {
56
    (LCD_OUT |= (1<<LCD_RS));  // sbi(LCD_OUT,LCD_RS); //RS = 1
57
Dataregister
58
    }
59
  //Schreibsignal setzen
60
  (LCD_OUT &= ~(1<<LCD_RW));  // cbi(LCD_OUT,LCD_RW); //Zum Schreiben
61
RW-Pin = Low
62
  //Schreiben der 1. 4Bit an das LCD Display
63
  LCD_OUT = ((LCD_OUT & 0xF0) + ((data & 0xF0)>>4)); //Write Nibbel MSB
64
  (LCD_OUT |= (1<<LCD_E));  // sbi(LCD_OUT,LCD_E);
65
  (LCD_OUT &= ~(1<<LCD_E));  // cbi(LCD_OUT,LCD_E);
66
  //Schreiben der 2. 4Bit an das LCD Display  
67
  LCD_OUT = (LCD_OUT&0xF0) + (data&0x0F); //Write Nibbel LSB
68
  (LCD_OUT |= (1<<LCD_E));  // sbi(LCD_OUT,LCD_E);
69
  (LCD_OUT &= ~(1<<LCD_E));  // cbi(LCD_OUT,LCD_E);
70
  
71
  //loop_until_bit_is_clear(Read_LCD(0),BusyBit);  //Wartet bis LCD
72
wieder bereit
73
  return;
74
}
75
76
int main ()
77
{
78
        lcd_init();  // LCD initialiseren
79
  lcd_clear();
80
81
  // 2do test
82
  for(;;)
83
  lcd_write('a',1);
84
}

Und jetzt das Problem: Das LCD (Batron BT 2160)initialisert nur eine
Zeile. Wo liegt das Problem? Ich seh keines, müsste eigentlich
funktionieren.

von Slowflyer (Gast)


Lesenswert?

OK, hat sich erledigt, ich habe unvorsichtigerweise in der Fkt lcd_write
in Zeile 71 die Abfrage des Busy-Bits rausgenommen. Nun habe ich einfach
eine delay-Fkt eingesetzt und nun geht es.

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.