Hallo Forum Ich hab mir bei my AVR einen Atmel168 plus display gekauft. nun veruche ich verzeifelt das LCD zu betreiben, leider funktionieren die mitgelieferten Codes nicht richtig. Wer kann mir bitte helfen Anbei der Code; Ich hab das Programm soweit debuggen können das es kompiliert wird. Wenn ich es auf den u controller spiele passiert allerdings nix???? mfg Peter //---------------------------------------------------------------------- ----- // Title :Rahmen für ein AVR ATmega8 C-Programm mit LCD // Date :10.04.2005 // Version :1.0 // Autor :Dipl. Ing. Päd. Alexander Huwaldt //---------------------------------------------------------------------- ----- #define F_CPU 3686400 #include <avr\io.h> #include <util\delay.h> #define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT))) #define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT))) #define outp(VAL,ADRESS) ((ADRESS) = (VAL)) #define inp(VAL) (VAL) //////////////////////////////////////////////////////////////////////// ///// // allgemeine-Funktionen //---------------------------------------------------------------------- ----- // wait_ms(..) - Wartet einige Millisekunden // Die Dauer ist nicht kalibriert. // PE: miliSec=Anzahl der zu wartenden Millisekunden //---------------------------------------------------------------------- ----- void wait_ms(int miliSec) { _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec); // 4 Zyklen warteschleife } void wait_us(int mikroSec) { _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec); // 4 Zyklen warteschleife } //////////////////////////////////////////////////////////////////////// ////// // LCD-Funktionen für myAVR-Board + myAVR-LCD // 4-BitModus an PortD Bit 4-7 // PortD Bit 2 = RS, high=Daten, low=Kommando // PortD Bit 3 = E, high-Impuls für gültige Daten //---------------------------------------------------------------------- ----- // lcd_send(..) - sendet ein Byte an LCD im 4-Bit-Modus // RS muss vorher richtig gesetzt sein // PE: data=zu sendendes Byte //---------------------------------------------------------------------- ----- void lcd_send(char data) { // aktuelles RS ermitteln char rs=PORTD; rs&=4; // High-Teil senden char tmp=data; tmp&=0xf0; tmp|=rs; PORTD=tmp; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); // Low-Teil senden tmp=data; tmp&=0x0f; tmp*=16; tmp|=rs; PORTD=tmp; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); // verarbeiten lassen wait_ms(1); } //---------------------------------------------------------------------- ----- // lcd_cmd(..) - sendet ein Kommando an LCD // PE: cmd=Kommando-Byte //---------------------------------------------------------------------- ----- void lcd_cmd(char cmd) { cbi(PORTD,2); // RS löschen = Kommando lcd_send(cmd); // senden } //---------------------------------------------------------------------- ----- // lcd_write(..) - sendet ein Zeichen (Daten) an LCD // PE: text=Zeichen //---------------------------------------------------------------------- ----- //---------------------------------------------------------------------- ----- // lcd_write(..) - sendet ein Zeichen (Daten) an LCD // PE: text=Zeichen //---------------------------------------------------------------------- ----- void lcd_write(char text) { sbi(PORTD,2); // RS setzen = Daten lcd_send(text); // senden } //---------------------------------------------------------------------- ----- // lcd_home(..) - Cursor auf Position 1,1 //---------------------------------------------------------------------- ----- void lcd_home() { lcd_cmd(0x02); wait_ms(2); // warten } //---------------------------------------------------------------------- ----- // lcd_clear(..) - löscht die Anzeige im LCD //---------------------------------------------------------------------- ----- void lcd_clear() { lcd_cmd(0x01); wait_ms(2); // warten } //---------------------------------------------------------------------- ----- // lcd_on(..) - schaltet das LCD an //---------------------------------------------------------------------- ----- void lcd_on() { lcd_cmd(0x0E); } //---------------------------------------------------------------------- ----- // lcd_off(..) - schaltet das LCD aus //---------------------------------------------------------------------- ----- void lcd_off() { lcd_cmd(0x08); } //---------------------------------------------------------------------- ----- // lcd_goto(..) - setzt die Cursorposition // PE: row = Zeile 1..2 // col = Spalte 1..16 //---------------------------------------------------------------------- ----- void lcd_goto(int row, int col) { row--; // Null-basierend row&=0x01; // sicherheitshalber row*=0x40; // Zeile nach Bit 6 bringen col--; // Null-basierend col&=0x0f; // sicherheitshalber char tmp=row|col; tmp|=0x80; // Cursor setzen lcd_cmd(tmp); // senden } //---------------------------------------------------------------------- ----- // lcd_init(..) - Schaltet die Ports und Initialisiert das LCD //---------------------------------------------------------------------- ----- void lcd_init() { // Port D = Ausgang DDRD=0xff; PORTD=0; // warten bist LCD-Controller gebootet wait_ms(50); // SOFT-RESET PORTD = 0x30; //0b00110000; sbi(PORTD,3); cbi(PORTD,3); wait_ms(5); PORTD = 0x30; //0b00110000; sbi(PORTD,3); cbi(PORTD,3); wait_us(100); PORTD = 0x30; //0b00110000; sbi(PORTD,3); cbi(PORTD,3); wait_ms(5); // 4-BitModus einschalten PORTD=0x20; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); wait_ms(5); // ab hier im 4-Bit-Modus lcd_cmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit //lcd_off(); lcd_cmd(0x06); // Entry Mode lcd_on(); lcd_clear(); } //---------------------------------------------------------------------- ----- // Main-Funktion //---------------------------------------------------------------------- ----- int main (void) { wait_ms(200); lcd_init(); lcd_goto(1,1); lcd_write(0x11); while (1) { } // Mainloop return 0; } //---------------------------------------------------------------------- -----
Was erwartest Du, was passieren soll? Dein Programm initialisiert zwar das LCD, schreibt aber sonst nichts raus... Ersetzte im main() die Zeile lcd_write(0x11); durch lcd_write('H'); lcd_write('e'); lcd_write('l'); lcd_write('l'); lcd_write('o'); lcd_write(' '); lcd_write('W'); lcd_write('o'); lcd_write('r'); lcd_write('l'); lcd_write('d'); Wenn das klappt, dann bauee Dir eine Funktion, mit welcher Du ganze Strings, statt bloss einzelen Charakters senden kanst. MfG Peter
Hallo Peter Erstmal Danke für deine Antwort. Kannst Du mir auch noch erklähren wie ich eine "Zahl" d.h zb das ergebniss eine berchnung senden kann? Danke für die Mühe mfg
Du mußt die Zahl erst in einen String bzw. einzelne Buchstaben umwandeln! Ich versuche mal mein Glück //------------- einzelne Buchstaben Version uint8_t zahl; lcd_write (zahl/100 +'0'); // 100er-Stelle +'0' entspricht dem ASCII-Offset für das Zeichen "0" zahl = zahl % 100; // modulo 100, d.h. der Rest von "/100" lcdwrite (zahl/10)+'0'); // 10er Stelle lcd_write (zahl % 10 +'0'); // der Rest von "/10" = 1er //------------ in String umwandln und ausgeben /*********************************************************************** ** Aus Peter Fleury's LCD-Routinen Display string without auto linefeed Input: string to be displayed Returns: none ************************************************************************ */ void lcd_puts(const char *s) /* print string on lcd (no auto linefeed) */ { register char c; while ( (c = *s++) ) { lcd_write(c); } }/* lcd_puts */ uint8_t zahl; char ergebnis; itoa (zahl, ergebnis, 10); // umwandlung der zahl ins 10er-Zahlensystem lcd_putc (ergebnis)
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.