www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik lcd: wie äußert sich unvollständige initialisierung?


Autor: pingpingpalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein LC- Display mit KS0066 controller an einem mega32 
angeschlossen. wenn ich nach dem initialisieren aber ein zeichen 
schicke, wird das nicht dargestellt.
gibt es so etwas wie eine unvollständige initialisierung? und wie macht 
die sich bemerkbar? nach dem initialisieren blinkt auf jeden fall der 
cursor, allerdings ist die erste zeile manchmal dunkel und manchmal 
hell.

aber ein zeichen zu schicken, hab ich bis jetzt noch nicht hinbekommen.
wie geht das? zuerst high nibble, dann low nibble? und jedesmal RS mit 
high setzen? wäre schön, wenn da mal jemand nen blick drauf werfen 
könnte

hier ist mal mein code. sollt ein "H" darstellen.

danke!

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

//display Belegung:
//DB4 DB5 DB6 DB7 RS  EN
//PD0 PD1 PD2 PD3 PD4 PD5

#define DB4 0
#define DB5 1
#define DB6 2
#define DB7 3
#define RS  4
#define EN  5

void lcd_enable(void);
void lcd_init(void);

int main()
{
  DDRD=0xFF;
  lcd_init(); //lcd initialisieren
//jetzt zeichen senden
  _delay_ms(1);
  PORTD = 20; //10100 //high nibble
  lcd_enable();
  PORTD= 24; //11000 //low nibble
  lcd_enable();
  return 0;
}



void lcd_enable(void) //takt für lcd senden
{
PORTD |= (1<<EN);
_delay_us(10);
PORTD &= (0<<EN);
}

void lcd_init(void)
{
_delay_ms(30);
PORTD |= (1<<DB5);
lcd_enable();
PORTD |= (1<<DB5);
lcd_enable();
PORTD |= (1<<DB6);
lcd_enable();

_delay_us(50);
PORTD =0;
lcd_enable();
PORTD |=(1<<DB4)|(1<<DB5)|(1<<DB6)|(1<<DB7);
lcd_enable();

_delay_us(50);
PORTD = 0;
lcd_enable();
PORTD |= (1<<DB4);
lcd_enable();

_delay_ms(5);
PORTD = 0;
lcd_enable();
PORTD |=(1<<DB4)|(1<<DB5)|(1<<DB6);
lcd_enable();
}

Autor: Schwurbl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst erst mal eine vernünftige Routine, um ein Nibble zu 
schreiben:

#define LCD_WRITE_NIBBLE(x)                \
  {                                        \
    PORTD = (PORTD & 0xF0) | ((x) & 0x0F); \
    PORTS |=  (1 << EN);                   \
    _delay_loop_1(10);                     \
    PORTS &= ~(1 << EN);                   \
    _delay_loop_1(10);                     \
  }

Damit dann die 8-Bit-Routinen

#define LCD_CMD(x)
  {
    PORTD &= ~(1 << RS);
    LCD_WRITE_NIBBLE(x >> 4);
    LCD_WRITE_NIBBLE(x);
  }

#define LCD_DATA(x)
  {
    PORTD |= (1 << RS);
    LCD_WRITE_NIBBLE(x >> 4);
    LCD_WRITE_NIBBLE(x);
  }

Und dann die Ganze Initialisierung:

  PORTD &= ~(1 << RS);
  _delay_ms(15);
  LCD_WRITE_NIBBLE(0x03);
  _delay_ms(5);
  LCD_WRITE_NIBBLE(0x03);
  _delay_ms(20);
  LCD_WRITE_NIBBLE(0x03);
  _delay_ms(1);
  // Set 4-bit-mode
  LCD_WRITE_NIBBLE(0x02);
  _delay_us(100);
  // 4 bit, 2 lines, 5x7 font
  LCD_CMD(0x28);
  _delay_us(100);
  // Display on, no cursor, no blink
  LCD_CMD(0x0C);
  _delay_us(100);
  // Clear display
  LCD_CMD(0x01);
  _delay_ms(20);

Und dann Zeichen:

  LCD_DATA('A');
  _delay_us(100);
  LCD_DATA('B');
  _delay_us(100);
  LCD_DATA('C');
  _delay_us(100);

Inwiefern Dein Code das korrekt macht, ist anstrengend zu prüfen. 
Beispiel: Warum zum Teufel wird ständig PORTD mit einem Wert verodert?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ansonsten: der KS ist nur 99% kompatibel zum üblichen HD-Controller. 
Genau in der Init ist da was anders. Also, wenn dein Code zum HD44780 
gehört - das klappt nicht.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du musst auf jeden fall in deiner init funktion bei den ersten 3x 
enable-senden immer danach warten, sonst funktionierts nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.