Forum: Mikrocontroller und Digitale Elektronik Initialisation + Zeichenausgabe ks0073


von Jens (Gast)


Lesenswert?

Moin,

ich versuche grade ein LCD mit dem ks0073 im 4 Bit Modus zu 
initialisieren und ein zeichen auszugeben. Mit einem anderen LCD, 
welches den anderen Standartchip benutzt habe ichs schon hinbekommen - 
mir fällt der Name grade nicht ein. Es wird sich hier wieder um einen 
grundsätzlichen kleinen Fehler handeln, auf dem ich nicht komme.

Bei diesem sehe ich nun allerdings nur schwarze große Zeichen und kein 
'a' wie gewünscht. Die ganze Routine hängt in der lcd_busy funktion in 
der Schleife fest.

Die pinbelegung am Atmega16 ist:
Portc->
7: RS
6: RW
5: D7
..
2: D4
1: E

Resetleitung des Displays ist auf 0V gezogen.

Ich habe folgende Funktionen gebastelt.
1
#define LCD_PORT PORTC
2
#define LCD_INPUT PINC
3
#define LCD_DIRECTION_CONTROL DDRC
4
#define LCD_READWRITE 6
5
#define LCD_DATACOMMAND 7
6
#define LCD_ENABLE 1
7
8
  inline void lcd_execute(){
9
    LCD_PORT |= 1<<LCD_ENABLE;
10
    _delay_ms(1);
11
    LCD_PORT &= ~(1<<LCD_ENABLE);
12
  }
13
14
  inline void lcd_init(){
15
  
16
    _delay_ms(50);
17
18
    LCD_PORT = 0b00001000;
19
    lcd_execute();
20
21
    _delay_ms(1);
22
    LCD_PORT = 0b00001000;
23
    lcd_execute();
24
    LCD_PORT = 0b00100000;
25
    lcd_execute();
26
27
    _delay_ms(1);
28
    LCD_PORT = 0b00000000;
29
    lcd_execute();
30
    LCD_PORT = 0b00110000;
31
    lcd_execute();
32
33
    _delay_ms(1);
34
    LCD_PORT = 0b00000000;
35
    lcd_execute();
36
    LCD_PORT = 0b00000100;
37
    lcd_execute();
38
    
39
    _delay_ms(4);
40
    LCD_PORT = 0b00000000;
41
    lcd_execute();
42
    LCD_PORT = 0b00011000;
43
    lcd_execute();
44
  }
45
46
  inline void lcd_busy(){
47
    unsigned char x;
48
49
    LCD_DIRECTION_CONTROL = 0b11000011; //Daten aufnEingang
50
    LCD_PORT |= (1<<LCD_READWRITE);    //1 = Read
51
    LCD_PORT &= ~(1<<LCD_DATACOMMAND); //0 = Command
52
    
53
    do{
54
      LCD_PORT |= 1<<LCD_ENABLE;
55
      x = LCD_INPUT<<2;
56
      LCD_PORT &= ~(1<<LCD_ENABLE);
57
      lcd_execute();
58
    }while(x >= 0x80);
59
    
60
    LCD_DIRECTION_CONTROL = 0xFF;PORTB = 1;
61
  }
62
  
63
  inline void lcd_command(unsigned char command){
64
    lcd_busy();
65
  
66
    LCD_PORT = (command>>2)&0b00111100;
67
    lcd_execute();
68
    LCD_PORT = (command<<2)&0b00111100;
69
    lcd_execute();
70
  }
71
  
72
  inline void lcd_send_character(unsigned char character){
73
    lcd_busy();
74
  
75
    LCD_PORT = ((character>>2)&0b00111100) | 0b10000000;
76
    lcd_execute();
77
    LCD_PORT = ((character<<2)&0b00111100) | 0b10000000;
78
    lcd_execute();
79
  }

In der main Funktion steht nur folgendes:
1
  lcd_init();
2
  lcd_send_character('a');

mfg

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.