Gast
#411510
Hallo, ich habe hier ein "Displaytech Ltd, LCD Module 204A Series" (HD44780 controller) an einem ATmega48 mit 4 Bit Mode mit der LCD library von Peter Fleury in Betrieb. Funktioniert soweit gut, außer ich setze LCD_WRAP_LINES=1. Die DDRAM Adressen habe ich nach dem Datenblatt angepasst: #define LCD_START_LINE1 0x00 #define LCD_START_LINE2 0x40 #define LCD_START_LINE3 0x14 #define LCD_START_LINE4 0x54 Das Problem ist, dass man in der zweiten Displayzeile "festhängt". D.h., man kann über die Zeile 2 hinausschreiben, es macht auch einen automatischen Zeilenwechsel, dann aber nicht von Zeile 3 in Zeile 4, sonder wieder in Zeile 2. Die Adressierung bei diesem Display funktioniert so: 1: 0x00 ... 0x13 => 3: 0x14 ... 0x27 => 2: 0x40 ... 0x53 => 4: 0x54 ... 0x67 => 1: 0x00 ...... Das Problem ist, dass er am Ende von Zeile 3 auf 0x40 vorrückt, was aber schon wieder der Start von Zeile 2 ist. Was geht ist, dass man schon ab 0x27 den Zeilenumbruch macht, das ist halt sehr unschön, da nun ein Zeichen am Ende hier fehlt. Hier dazu die Veränderung: void lcd_putc(char c){ . . #elif LCD_LINES==4 if (pos==LCD_START_LINE1+LCD_DISP_LENGTH) { // == 0x14 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE2,0); }else if (pos==LCD_START_LINE2+LCD_DISP_LENGTH) { // == 0x54 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE3,0); //}else if ( pos == 0x40 ) { // == 0x40 ?! //}else if ( pos == 0x27 ) { // so halt 1 Zeichen zu kurz lcd_write((1<<LCD_DDRAM)+LCD_START_LINE4,0); }else if (pos==LCD_START_LINE4+LCD_DISP_LENGTH) { // == 0x68 lcd_write((1<<LCD_DDRAM)+LCD_START_LINE1,0); } Hat jmd. eine Idee, wie man das richtig machen könnte? Mir fällt leider keine Möglichkeit mehr ein. Vielen Dank im Voraus, Rainer Snell