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(); }
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?
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.
du musst auf jeden fall in deiner init funktion bei den ersten 3x enable-senden immer danach warten, sonst funktionierts nicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.