// Serial LCD Interface // Zeichen mit UART empfangen und auf einem LCD Display ausgeben // ATmega8, 16MHz // AVR Studio 4, Optimierungsgrad: O2 // erstellt am 3.08.2012 // www.alex-handfest.de #include #include #include #include "lcd.h" #include "uart.h" // gespeicherte Variablen im EEPROM unsigned char eeFoooc1a EEMEM = 200; unsigned char eeFoooc1b EEMEM = 60; unsigned char eeFoospar EEMEM = 40; unsigned char eeFoospst EEMEM = 1; unsigned char eeFoodimm EEMEM = 1; unsigned char eeFooakti EEMEM = 30; unsigned char eeFooflus EEMEM = 1; unsigned char eeFoozeil EEMEM = 2; float eeFoouart EEMEM = 19200; unsigned char eeFoostart1[40] EEMEM = {" HAL 9000"}; unsigned char eeFoostart2[40] EEMEM = {'\0'}; unsigned char eeFoostart3[40] EEMEM = {'\0'}; unsigned char eeFoostart4[40] EEMEM = {'\0'}; // Variablen UART extern volatile unsigned char uart_cr; extern volatile unsigned char uart_lf; extern volatile unsigned long uart_baut; extern volatile unsigned char uart_recv_buf[41]; // Variablen LCD char volllicht = 0; char sparlicht = 0; char dimmlicht = 0; char sparcount = 0; char sparstatu = 0; char aktivzeit = 0; char akticount = 0; char textfluss = 0; char zeilennum = 0; char zeilenpos = 0; // Textspeicher char text1[41] = {'\0'}; char text2[41] = {'\0'}; char text3[41] = {'\0'}; char text4[41] = {'\0'}; // ===================================================================================== void textloeschen(void){ for(int i = 0; i<40; i++) text1[i]='\0'; // müsste auch gehen, wenn nur der for(int i = 0; i<40; i++) text2[i]='\0'; // erste Wert auf \0 gesetzt wird for(int i = 0; i<40; i++) text3[i]='\0'; for(int i = 0; i<40; i++) text4[i]='\0'; } void textschreiben(void){ lcd_clear(); lcd_string(text1); lcd_setcursor(0,2); lcd_string(text2); lcd_setcursor(0,3); lcd_string(text3); lcd_setcursor(0,4); lcd_string(text4); } void sparreset(void){ OCR1A = volllicht; akticount = 0; if (dimmlicht >= 1) dimmlicht = 2; } // ===================================================================================== void initialisieren(void){ // Variablen einlesen volllicht = eeprom_read_byte (&eeFoooc1a); OCR1B = eeprom_read_byte (&eeFoooc1b); sparlicht = eeprom_read_byte (&eeFoospar); sparstatu = eeprom_read_byte (&eeFoospst); dimmlicht = eeprom_read_byte (&eeFoodimm); aktivzeit = eeprom_read_byte (&eeFooakti); textfluss = eeprom_read_byte (&eeFooflus); zeilennum = eeprom_read_byte (&eeFoozeil); uart_baut = eeprom_read_float(&eeFoouart); eeprom_read_block (text1, eeFoostart1, 40); eeprom_read_block (text2, eeFoostart2, 40); eeprom_read_block (text3, eeFoostart3, 40); eeprom_read_block (text4, eeFoostart4, 40); // Initialisierung des LCD lcd_init(); // Initialisierung des UART uart_init(); //Globale Interrupts einschalten sei(); // Initialisierung von Beleuchtung und Kontrast // Timer1 init TCCR1B = (0< 0,016384s // Startbildschirm textschreiben(); textloeschen(); lcd_home(); sparreset(); } // ===================================================================================== int main(void){ initialisieren(); while(1){ //UART empfangen und auf dem LCD ausgeben: if (uart_cr == 1){ sparreset(); if(textfluss == 1){ // alten String nach unten schieben for(int i = 0; i<40; i++) text4[i] = text3[i]; for(int i = 0; i<40; i++) text3[i] = text2[i]; for(int i = 0; i<40; i++) text2[i] = text1[i]; for(int i = 0; i<40; i++) text1[i] = uart_recv_buf[i]; textschreiben(); } else if(textfluss == 2){ // alten String nach oben schieben if (zeilennum == 2){ for(int i = 0; i<40; i++) text1[i] = text2[i]; for(int i = 0; i<40; i++) text2[i] = uart_recv_buf[i]; } else { for(int i = 0; i<40; i++) text1[i] = text2[i]; for(int i = 0; i<40; i++) text2[i] = text3[i]; for(int i = 0; i<40; i++) text3[i] = text4[i]; for(int i = 0; i<40; i++) text4[i] = uart_recv_buf[i]; } textschreiben(); } else if(textfluss == 3){ // nur Enter lcd_setcursor(0,zeilenpos); zeilenpos++; if (zeilenpos > zeilennum) zeilenpos = 1; lcd_string(uart_recv_buf); } else lcd_string(uart_recv_buf); uart_done(); } //UART empfangen und Befehle ausführen: else if (uart_lf == 1){ sparreset(); // ----- Beleuchtung / backlight --------------------------------------------- if (uart_recv_buf[0] == 'B'){ if (uart_recv_buf[1] == '1') volllicht = 255; if (uart_recv_buf[1] == '0') volllicht = 0; if (uart_recv_buf[1] == '=') volllicht = uart_getnumber(2); OCR1A = volllicht; } // ----- Kontrast / contrast ------------------------------------------------- else if (uart_recv_buf[0] == 'C'){ if (uart_recv_buf[1] == '1') OCR1B = 255; if (uart_recv_buf[1] == '0') OCR1B = 0; if (uart_recv_buf[1] == '=') OCR1B = uart_getnumber(2); } // ----- alles löschen / delete all ------------------------------------------ else if (uart_recv_buf[0] == 'D'){ lcd_clear(); textloeschen(); } // ----- Energiesparer / energysaver ----------------------------------------- else if (uart_recv_buf[0] == 'E'){ lcd_clear(); textloeschen(); if (uart_recv_buf[1] == '1'){ TIMSK |= (1<= 2) dimmlicht = 3; else OCR1A = sparlicht; akticount = 0; } akticount++; sparcount = 0; } if (dimmlicht == 3){ OCR1A = OCR1A - 1; if (OCR1A <= sparlicht) dimmlicht = 1; } sparcount++; }