LCD --> AVR µC

Gast #102572
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
Angehängte Dateien:
Gast #102575
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren