/****************************************************************** LCD Library für das Pollin-I2C-LCD-Modul *******************************************************************/ // I2C-Adresse des LC-Displays #define I2C_ADDR_LCD 68 //Steuerzeichen #define DISPLAY_MODE 0x28 //Modus: 4-Bit-Interface, 2 Zeilen, 5*7 Font #define CURSOR_MODE 0x0F //Display an, Cursor an, Blinken #define CURSOR_HOME 0x02 #define CURSOR_SHIFT 0x14 #define DISPLAY_CLEAR 0x01 // Nur während der Initialisierung im 8-Bit-Mode zu verwendende Befehle: //Schaltet erstmal definiert den 8-Bit-Modus ein) #define SOFT_RESET 0x03 // Soft-Reset bei Initialisierung #define FOUR_BIT_MODE 0x02 // Eigentlich müsste es 0x20 sein... // Physische Pins des Pollin-LC-Displays: #define RS_PIN 0x10 #define RW_PIN 0x20 #define ENABLE_PIN 0x40 #define BACKLIGHT_PIN 0x80 #define HIGH_ZERO_MASK 0x0F; // Zur Maskierung der oberen 4 Bit bei byte-Daten // Wartezeiten (Die HD44780-Chips des LC-Displays sind am Anfang etwas "lahm" #define WAIT1 500 #define WAIT2 50 #define WAIT3 1 #define ON 1 #define OFF 0 byte backlight_status; void LCD_Init(void) { // Display initialisieren: int i; for (i=0; i<4; i++) { //3 * Soft-Reset - laut Datenblatt unbedingt vorgeschrieben! PCF8574_W(I2C_ADDR_LCD, ENABLE_PIN | SOFT_RESET); // Enable HIGH schalten und High-Nibbel "3" senden DELAY_MS(WAIT2); PCF8574_W(I2C_ADDR_LCD, SOFT_RESET); // Enable LOW schalten DELAY_MS(WAIT2); } //Der erste Schreibzugriff nach dem Reset ist ein 8 Bit- //Zugriff!! Also nur einmal schreiben, noch nicht Low-High Nibble! //4-Bit-Modus einstellen: PCF8574_W(I2C_ADDR_LCD, FOUR_BIT_MODE | ENABLE_PIN); // Enable HIGH schalten und High-Nibbel "2" senden DELAY_MS(WAIT2); PCF8574_W(I2C_ADDR_LCD, FOUR_BIT_MODE); // Enable LOW schalten DELAY_MS(WAIT2); // Ab hier HIGH- und LOW-Nibbel schreiben (4-Bit-Mode) - mit der Funktion LCD_LCD_SendCommand() // Funktionen des Displays festlegen: LCD_SendCommand(DISPLAY_MODE); DELAY_MS(WAIT2); LCD_SendCommand(CURSOR_MODE); DELAY_MS(WAIT2); LCD_BacklightOn(); } //------------------------------------------------------------------------------ // LCD_WriteChar // This function writes one character to the display memory //------------------------------------------------------------------------------ void LCD_WriteChar(char character) { byte High_Nibble; byte Low_Nibble; byte Send_Data; High_Nibble = character>> 4; // 4 Bit Rechtsverschiebung High_Nibble = High_Nibble & HIGH_ZERO_MASK; //Obere 4 Bit mit 0 maskieren - nur wichtig bei Datentypen > 8 Bit! Low_Nibble = character & HIGH_ZERO_MASK; //Obere 4 Bit mit 0 maskieren if (backlight_status == OFF) Send_Data = High_Nibble | ENABLE_PIN | RS_PIN; // Enable und RS High setzen else Send_Data = High_Nibble | ENABLE_PIN | RS_PIN | BACKLIGHT_PIN; // Enable und RS High setzen PCF8574_W(I2C_ADDR_LCD, Send_Data); DELAY_US(); if (backlight_status == OFF) Send_Data = High_Nibble | RS_PIN; //Enable auf LOW; RS muss HIGH bleiben! else Send_Data = High_Nibble | RS_PIN | BACKLIGHT_PIN; //Enable auf LOW; RS muss HIGH bleiben! PCF8574_W(I2C_ADDR_LCD, Send_Data);//Enable Datenübernahme DELAY_US(); if (backlight_status == OFF) Send_Data = Low_Nibble | ENABLE_PIN | RS_PIN; // Enable und RS High setzen else Send_Data = Low_Nibble | ENABLE_PIN | RS_PIN | BACKLIGHT_PIN; // Enable und RS High setzen PCF8574_W(I2C_ADDR_LCD, Send_Data); DELAY_US(); if (backlight_status == OFF) Send_Data = Low_Nibble | RS_PIN; //Enable auf LOW; RS muss HIGH bleiben! else Send_Data = Low_Nibble | RS_PIN | BACKLIGHT_PIN; //Enable auf LOW; RS muss HIGH bleiben! PCF8574_W(I2C_ADDR_LCD, Send_Data);//Enable Datenübernahme DELAY_US(); } //------------------------------------------------------------------------------ // Set cursor position // LCD_locate(Zeile, Position) - Zeile 1 oder 2 - Position 1 bis 16 //------------------------------------------------------------------------------ void LCD_Locate(int Zeile, int Pos) { LCD_CursorHome(); if (Zeile==1) { int i; // Zeile=1 for(i=1; i1 for(i=1; i<(Pos+40); i++) { LCD_SendCommand(0x14); } } } //------------------------------------------------------------------------------ // LCD_WriteWord(Word Variable) NEW 03.08.2007 // schreibt direkt eine Word Variable mit den Befehl LCD_WriteWord //------------------------------------------------------------------------------ void LCD_WriteWord(word Variable, byte Length) { char String[6]; Str_WriteWord(Variable,10,String,0,Length); // Zahl mit Basis 10, Offset 0, x stellig in String schreiben LCD_WriteText(String); // String xStellig ausgeben, rest wird mit Nullen aufgefüllt } //------------------------------------------------------------------------------ // LCD_WriteFloat(Word Variable) NEW 12.08.2007 // schreibt direkt eine Single Variable mit den Befehl LCD_WriteFloat //------------------------------------------------------------------------------ void LCD_WriteFloat(float Variable, byte Length) { char String[20]; Str_WriteFloat(Variable,Length,String,0); // Variable Float wird in String x Stellig gewandelt LCD_WriteText(String); // String xStellig ausgeben, rest wird mit Nullen aufgefüllt } //------------------------------------------------------------------------------ // Clear LCD // clears the Display and switches cursor on //------------------------------------------------------------------------------ void LCD_ClearLCD(void) { LCD_SendCommand(DISPLAY_CLEAR); } //------------------------------------------------------------------------------ // Cursor on first display position //------------------------------------------------------------------------------ void LCD_CursorHome(void) { LCD_SendCommand(CURSOR_HOME); } //----------------------------------------------------------------------------- // LCD_WriteText("Text") //------------------------------------------------------------------------------ void LCD_WriteText(char text[]) { int i; i=0; while(text[i]) LCD_WriteChar(text[i++]); } //----------------------------------------------------------------------------- // Backlight on //------------------------------------------------------------------------------ LCD_BacklightOn(void) { backlight_status = ON; LCD_SendCommand(DISPLAY_CLEAR | BACKLIGHT_PIN); return 0; } //----------------------------------------------------------------------------- // Backlight off //------------------------------------------------------------------------------ LCD_BacklightOff(void) { backlight_status = OFF; LCD_SendCommand(DISPLAY_CLEAR); return 0; } //----------------------------------------------------------------------------- // Sends Commands to the display - LCD_SendCommand(CURSOR_HOME)etc. //------------------------------------------------------------------------------ LCD_SendCommand(byte command) { byte High_Nibble; byte Low_Nibble; byte Send_Data; High_Nibble = command >> 4; // 4 Bit Rechtsverschiebung High_Nibble = High_Nibble & HIGH_ZERO_MASK; //Obere 4 Bit mit 0 maskieren - nur wichtig bei Datentypen > 8 Bit! Low_Nibble = command & HIGH_ZERO_MASK; //Obere 4 Bit mit 0 maskieren if (backlight_status == OFF) Send_Data = High_Nibble | ENABLE_PIN; // nur Enable setzen else Send_Data = High_Nibble | ENABLE_PIN | BACKLIGHT_PIN; // Enable + Backlight setzen PCF8574_W(I2C_ADDR_LCD, Send_Data); DELAY_US(); if (backlight_status == OFF) Send_Data = High_Nibble; //Enable auf LOW else Send_Data = High_Nibble | BACKLIGHT_PIN; //Enable auf LOW PCF8574_W(I2C_ADDR_LCD, Send_Data);//Enable Datenübernahme DELAY_US(); if (backlight_status == OFF) Send_Data = Low_Nibble | ENABLE_PIN; // Enable HIGH setzen else Send_Data = Low_Nibble | ENABLE_PIN | BACKLIGHT_PIN; // Enable HIGH setzen PCF8574_W(I2C_ADDR_LCD, Send_Data); DELAY_US(); if (backlight_status == OFF) Send_Data = Low_Nibble | RS_PIN; //Enable auf LOW else Send_Data = Low_Nibble | RS_PIN | BACKLIGHT_PIN; //Enable auf LOW und Backlight auf HIGH PCF8574_W(I2C_ADDR_LCD, Send_Data);//Enable Datenübernahme DELAY_US(); return 0; } void DELAY_US(void) { int i; for(i=1; i<13; i++) { } }