Teste mal den Code:
Code://--------------------------------------------------------------------------- // Titel : myAVR Beispiel "LCD Ausgabe auf einer Zeile" für den ATmega8/48/88/168 //--------------------------------------------------------------------------- // Funktion : gibt eine Zeichenkette auf dem myAVR LCD Modul, 1 Zeile // Schaltung : PORTD.2 = RS, PORTD.3 = E, PORTD.4-7 = D4-7 //--------------------------------------------------------------------------- // Prozessor : // Takt : 3.6864 MHz // Sprache : C // Datum : 09.11.2007 // Version : 1.0 // Autor : S. Hänsel // Programmer : ... // Port : ... //---------------------------------------------------------------------- #define F_CPU 3686400 #include <avr\io.h> #include <util\delay.h> ///////////////////////////////////////////////////////////////////////////// // allgemeine-Funktionen //--------------------------------------------------------------------------- // waitMs(..) - Wartet einige Millisekunden // Die Dauer ist nicht kalibriert. // PE: miliSec=Anzahl der zu wartenden Millisekunden //--------------------------------------------------------------------------- void waitMs(int miliSec) { _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec); // 4 Zyklen warteschleife } void waitUs(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 //--------------------------------------------------------------------------- // lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus // RS muss vorher richtig gesetzt sein // PE: data=zu sendendes Byte //--------------------------------------------------------------------------- void lcdSend(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 waitMs(1); } //--------------------------------------------------------------------------- // lcdCmd(..) - sendet ein Kommando an LCD // PE: cmd=Kommando-Byte //--------------------------------------------------------------------------- void lcdCmd(char cmd) { cbi(PORTD,2); // RS löschen = Kommando lcdSend(cmd); // senden } //--------------------------------------------------------------------------- // lcdWrite(..) - sendet ein Zeichen (Daten) an LCD // PE: text=Zeichen //--------------------------------------------------------------------------- void lcdWrite(char text) { sbi(PORTD,2); // RS setzen = Daten lcdSend(text); // senden } //--------------------------------------------------------------------------- // lcdWrite(..) - sendet eine Zeichenkette an LCD // Die Zeichenkette muss mit 0x00 abgeschlossen sein // PE: pText=Zeiger auf Zeichenkette //--------------------------------------------------------------------------- void lcdWrite(char* pText) { while(pText[0]!=0) { lcdWrite(pText[0]); pText++; } } //--------------------------------------------------------------------------- // lcdWrite(..) - sendet eine Zeichenkette an LCD // PE: pText=Zeiger auf Zeichenkette // count=Anzahl der zu sendenden Zeichen //--------------------------------------------------------------------------- void lcdWrite(char* pText, int count) { while(count!=0) { lcdWrite(pText[0]); pText++; count--; } } //--------------------------------------------------------------------------- // lcdHome(..) - Cursor auf Position 1,1 //--------------------------------------------------------------------------- void lcdHome() { lcdCmd(0x02); waitMs(2); // warten } //--------------------------------------------------------------------------- // lcdClear(..) - löscht die Anzeige im LCD //--------------------------------------------------------------------------- void lcdClear() { lcdCmd(0x01); waitMs(2); // warten } //--------------------------------------------------------------------------- // lcdOn(..) - schaltet das LCD an //--------------------------------------------------------------------------- void lcdOn() { lcdCmd(0x0E); } //--------------------------------------------------------------------------- // lcdOff(..) - schaltet das LCD aus //--------------------------------------------------------------------------- void lcdOff() { lcdCmd(0x08); } //--------------------------------------------------------------------------- // lcdGoto(..) - setzt die Cursorposition // PE: row = Zeile 1..2 // col = Spalte 1..16 //--------------------------------------------------------------------------- void lcdGoto(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 lcdCmd(tmp); // senden } //--------------------------------------------------------------------------- // lcdInit(..) - Schaltet die Ports und Initialisiert das LCD //--------------------------------------------------------------------------- void lcdInit() { // Port D = Ausgang DDRD=0xff; PORTD=0; // warten bist LCD-Controller gebootet waitMs(50); // SOFT-RESET PORTD = 0x30; //0b00110000; sbi(PORTD,3); cbi(PORTD,3); waitMs(5); PORTD = 0x30; //0b00110000; sbi(PORTD,3); cbi(PORTD,3); waitUs(100); PORTD = 0x30; //0b00110000; sbi(PORTD,3); cbi(PORTD,3); waitMs(5); // 4-BitModus einschalten PORTD=0x20; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); waitMs(5); // ab hier im 4-Bit-Modus lcdCmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit //lcdOff(); lcdCmd(0x06); // Entry Mode lcdOn(); lcdClear(); } //--------------------------------------------------------------------------- // Main-Funktion //--------------------------------------------------------------------------- int main (void) { waitMs(200); lcdInit(); lcdGoto(1,1); lcdWrite("Hallo myAVR!"); while (1) { } // Mainloop return 0; } //---------------------------------------------------------------------------







Zitieren

Lesezeichen