// Datei: LCD.C // // Ansteuerung einer LCD-Anzeige // im 4 Bit Daten Mode // // Holger Klabunde // 11.10.2002 // Compiler AVR-GCC // 08.12.2005 // changed by Elmar Benninghaus // for own board elavr32 #ifndef __LCD_C #define __LCD_C #include "lcd.h" //******************************************* // Schreibt ein Datenbyte in die LCD-Anzeige //******************************************* void LCDWriteByte(unsigned char data) { unsigned char buff; LCDCS_OFF(); buff = data & 0xf0;//High Nibble first, PORTA = buff | 4;//and holding RS high LCDCS_ON(); LCDDELAYENABLE;//min. 240 ns for enable on LCDCS_OFF(); Delay1us(48);//46Microsec. Datasheet buff = data; buff<<=4; buff = buff & 0xf0;//Low Nibble, PORTA = buff | 4;//and holding RS high LCDCS_ON(); LCDDELAYENABLE;//min. 240 ns for enable on LCDCS_OFF(); Delay1us(48);//46Microsec. Datasheet } //******************************************* // Schreibt ein Commandbyte in die LCD-Anzeige //******************************************* void LCDWriteCmd(unsigned char data) { unsigned char buff; LCDCS_OFF(); PORTA = data & 0xf0;//High Nibble first, LCDCS_ON(); LCDDELAYENABLE;//min. 240 ns for enable on LCDCS_OFF(); Delay1us(48);//46Microsec. Datasheet buff = data; buff<<=4; PORTA = buff & 0xf0;//Low Nibble, LCDCS_ON(); LCDDELAYENABLE;//min. 240 ns for enable on LCDCS_OFF(); Delay1us(48);//46Microsec. Datasheet } //************************************************** //Schreibt einen Text in die LCD-Anzeige //************************************************** void LCDWrite(char *__putstr) { char __ps; while((__ps = *__putstr)) { __putstr++; if (__ps== 0) break; LCDWriteByte(__ps); } } //************************************************** //Schreibt einen Progmem-Text in die LCD-Anzeige //************************************************** void LCDWriteP(char *__putstr) { char __ps; while((__ps = PRG_RDB(__putstr))){ __putstr++; if (__ps== 0) break; LCDWriteByte(__ps); } } //**************************************************** // Springt auf Zeile x ( 0-3 ) und Position y ( 0-15) // der LCD-Anzeige. Gültig für 4 Zeilen //**************************************************** void LCDPos(unsigned char zeile,unsigned char position) { unsigned char buff; switch(zeile) { case 0: buff=0x00+position; break; case 1: buff=0x40+position; break; case 2: buff=0x10+position; break; case 3: buff=0x50+position; break; default : buff=0x00; break; //1,1 } LCDWriteCmd(buff | 0x80); Delay1us(45);//42 Mikroseconds datasheet } //***************************************** // Löscht die LCD Anzeige // Cursor steht dann auf Position 1,Zeile 1 // Gilt auch für mehrzeilige Anzeigen //***************************************** void LCDCls(void) { LCDWriteCmd(0x01); //CLS Delay1ms(2);//1.64ms datasheet } void LCDInit(void) { int i; LCDWR_ON(); LCDRS_OFF(); LCDCS_OFF(); //Software Reset after power up norm. > 15ms Delay1ms(50); //three times the first instruction set for(i=0; i<3; i++) { PORTA=0x30; LCDCS_ON(); LCDDELAYENABLE;//min. 240 ns for enable on LCDCS_OFF(); Delay1ms(10); //after this 4.1ms/100us/100us wait //see datasheet for first init of lcd } //End of software-reset //Der erste Schreibzugriff nach dem Reset ist ein 8 Bit //Zugriff!! Also nur einmal schreiben, nicht Low-High Nibble. //Um die 4Bit Operation einzuschalten PORTA=0x20; //Auf den Port legen LCDCS_ON(); //High Nibble schreiben LCDDELAYENABLE; LCDCS_OFF(); //LCD-Anzeige abwählen Delay1ms(10); //Nach einfügen von 5ms //kommt die LCD Anzeige nach dem Einschalten immer. //Ohne Wait's zeigte sie oft gar nix ! LCDWriteCmd(0x28); //4 Bit Operation,2 Line,5x7 Font Delay1ms(5); // LCDWriteCmd(0x0F); //Display on, Cursor on ,Cursor blink LCDWriteCmd(0x0E); //Display on, Cursor on ,Cursor no blink //LCDWriteCmd(0x0C); //Display on, Cursor off ,Cursor no blink Delay1ms(2); LCDWriteCmd(0x06); //Increment, Display Freeze Delay1ms(2); LCDRS_ON(); //LCD-Datenregister } //Zeigt ein Byte im HexCode an void ShowHex(unsigned char by) { unsigned char buff; buff=by>>4; //Highnibble zuerst if(buff<10) buff+='0'; //ASCII Code erzeugen else buff+=0x37; //Großbuchstaben LCDWriteByte(buff); buff=by&0x0f; //Danach das Lownibble if(buff<10) buff+='0'; //ASCII Code erzeugen else buff+=0x37; //Großbuchstaben LCDWriteByte(buff); } #endif