//------------------------------------------------------------------------- // Titel : //------------------------------------------------------------------------- // Funktion : // Schaltung : //------------------------------------------------------------------------- // Prozessor : ATmega32 // Takt : 3686400 Hz // Sprache : // Datum : 13.3.2012 // Version : 1.0 // Autor : // Programmer: // Port : //------------------------------------------------------------------------- // created by myAVR-CodeWizard //------------------------------------------------------------------------- #define F_CPU 3686400 #include //-------------------------------------------------------------------- // getValueADC - liest den aktuellen Wert vom ADC //-------------------------------------------------------------------- unsigned char getValueADC() { unsigned char wert=ADCH; // Einlesen des Analogwertes return wert; } ////////////////////////////////////////////////////////////////////////////// // 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); } //--------------------------------------------------------------------------- // lcd_write(..) - sendet ein Zeichen (Daten) an LCD // PE: text=Zeichen //--------------------------------------------------------------------------- void lcdWrite(char text) { sbi(PORTD,2); // RS setzen = Daten lcdSend(text); // senden } //--------------------------------------------------------------------------- // 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 eine Zeichenkette an LCD // Die Zeichenkette muss mit 0x00 abgeschlossen sein // PE: pText=Zeiger auf Zeichenkette //--------------------------------------------------------------------------- void lcdWrite(const char* pText) { while(pText[0]!=0) { lcdWrite(pText[0]); pText++; } } //--------------------------------------------------------------------------- // lcdClear(..) - löscht die Anzeige im LCD //--------------------------------------------------------------------------- void lcdClear() { lcdCmd(0x01); waitMs(2); // warten } //--------------------------------------------------------------------------- // lcdOn(..) - schaltet das LCD an //--------------------------------------------------------------------------- void lcdOn() { lcdCmd(0x0E); } //--------------------------------------------------------------------------- // 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); waitMs(1); 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 lcdCmd(0x06); // Entry Mode lcdOn(); lcdClear(); } //--------------------------------------------------------------------------- // lcdWrite(..) - sendet eine Zeichenkette an LCD // PE: pText=Zeiger auf Zeichenkette // count=Anzahl der zu sendenden Zeichen //--------------------------------------------------------------------------- void lcdWrite(const char* pText, int count) { while(count!=0) { lcdWrite(pText[0]); pText++; count--; } } //---------------------------------------------------------------------- // Titel : C-Funktion Zeichenkette senden. //---------------------------------------------------------------------- // Funktion : ... // IN : char *buffer, Zeichenkette mit NUll abgeschlossen // OUT : ... //---------------------------------------------------------------------- void lcdString(const char *buffer) { lcdWrite(buffer); } //--------------------------------------------------------------------------- // 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 } //--------------------------------------------------------------------------- // lcdOff(..) - schaltet das LCD aus //--------------------------------------------------------------------------- void lcdOff() { lcdCmd(0x08); } //--------------------------------------------------------------------------- // lcdZahl(..) - gibt eine 8 Bit Zahl aus // PE:uint8_t zahl //--------------------------------------------------------------------------- void lcdZahl(uint8_t zahl) { char ziffer1=0; char ziffer2=0; char ziffer3=0; while(zahl>=100) { ziffer1+=1; zahl+=-100; } while(zahl>=10) { ziffer2+=1; zahl+=-10; } ziffer1+=0x30; ziffer2+=0x30; ziffer3=zahl+0x30; lcdWrite(ziffer1); lcdWrite(ziffer2); lcdWrite(ziffer3); } //------------------------------------------------------------------------ // Initialisierungen //------------------------------------------------------------------------ void init() { // Ports initialisieren DDRC=0xFF; cbi(DDRA,0); // PORTA0 auf Eingang ohne PullUp ADMUX=0x60; // Port, Referenzspannung und Auflösung ADCSRA=0xE5; // Modus, Interrupt und Start } ///////////////////////////////////////////////////////////////////////////// // Main-Funktion ///////////////////////////////////////////////////////////////////////////// uint8_t result; main() { init(); // Initialisierungen while (true) // Mainloop-Begin { result += ADCH; result /=3; PORTC=ADCH; lcdInit(); lcdGoto(1,1); lcdWrite(" Temperatur"); lcdGoto(2,1); lcdZahl(result); lcdWrite(" Grad"); } // Mainloop-Ende } //---------------------------------------------------------------------------