Datum:
Hallo Ich hab mir nach dem Tutorial (http://www.mikrocontroller.net/articles/AVR-GCC-Tu...) bzw der Erweiterung dazu (http://www.mikrocontroller.net/articles/Erweiterte...) eine LCD Steuerung zusammengebastelt, funktioniert so weit auch gut, bis auf die Positionen.... Im Header File kann man ja die Zeilendefinitionen einstellen, und sind auch schon für ein 4x16 LCD da, nur wie siehts da mit einem 4x20 aus? Die ersten zwei Zeilen werden richtig angezeigt, nur Zeile 3 am Ende von Zeile 1 bzw. Zeile 4 am Ende von Zeile 2. Auch mit meinem Code ändert sich nichts an der Sache. Es bleibt genau gleich wie beim 4x16 Code Wie gehört es richtigerweise? 4x16:
//////////////////////////////////////////////////////////////////////////////// // Zeilendefinitionen des verwendeten LCD // die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen // bei anderen Zeilenlängen müssen diese Einträge angepasst werden #define LCD_DDADR_LINE1 0x00 #define LCD_DDADR_LINE2 0x40 #define LCD_DDADR_LINE3 0x10 #define LCD_DDADR_LINE4 0x50 |
und meine Version 4x20:
//////////////////////////////////////////////////////////////////////////////// // Zeilendefinitionen des verwendeten LCD (4x20) #define LCD_DDADR_LINE1 0x00 #define LCD_DDADR_LINE2 0x40 #define LCD_DDADR_LINE3 0x14 #define LCD_DDADR_LINE4 0x54 |
mfg thomas
Datum:
Eine Supererklärung für dein Problem findest du unter http://www.sprut.de/electronic/lcd/index.htm Hans Peterhttp://www.sprut.de/electronic/lcd/index.htm
Datum:
Hallo Hab grad eine Lösüng gefunden :D Ich hab mir ein Programm geschrieben, mit dem ich Zeichen für Zeichen durchgehe und hab so die richtigen Adressen herausgefunden, diese darf ich aber nicht hexadezimal addieren sondern normal, dezimal: Line1: 0 Line2: 40 Line3: 20 Line4: 84 Dies kann ich aber komischerweise nicht in den defines eintragen, sondern muss es direkt ins lcd.c eintragen. Weiß jemand warum? Abfrageprogramm:
#ifndef F_CPU #define F_CPU 16000000 #endif #include <avr/io.h> #include "lcd.h" #include <util/delay.h> #include <stdlib.h> #include "rncontrol.h" int main(void) { int i=0, data; char number[2]; lcd_init(); //LCD initialisieren while(1) { lcd_clear(); data = LCD_SET_DDADR + i; lcd_command(data); lcd_string("x"); itoa(i,number,10); lcd_string_xy(1,1,number); _delay_ms(200); REDO:{}; if(button()==2) i++; else if (button()==4) i--; else goto REDO; } } |
Datum:
itoa() heisst integer to ASCII und erwartet bei dir die Zählvariable i als int. Darum wäre es einfacher i direkt in einen ASCII-char zu wandeln Hans Peter
Datum:
Ok, dass wär auch möglich, aber ich stell mir die Frage warum ich die Werte direkt ins lcd.c File schreiben muss, und nicht wie eigentlich vorgesehen über die #define Anweisung im lcd.h machen kann.... mfg thomas
Datum:
Also wenn, wie du in der Eingangsfrage beschrieben hast, die Definitionen in LCD.h mit Hex-Werten funktionieren, dann sollten auch Integer-Werte kein problem darstellen. -> Die Verzögerungswerte weiter oben sind auch in dezimal eingetragen! Wobei bei den, mit deinem Abfrageprogramm ermittelten Adressen, kann der Wert für Linie 2 nicht stimmen - der sollte 64 dez betragen. Hans Peter
Datum:
Hallo Doch, der Wert stimmt, es funktioniert ;) Das Problem ist, ich kann dort eintragen was ich will, ändern tut sich nichts.... mfg thomas