/* * LCD_4_Bit.c * * Created: 06.09.2022 08:51:40 * Author: Peter Hell */ #include #include #include #include "LCD_I2C.h" #include "I2C_MASTER.h" extern uint8_t TWI_SADR; // Standarddatei laden extern uint8_t TWI_LADR; // Standarddatei laden extern uint8_t TWI_DATA; // Standarddatei laden extern uint8_t BEFEHL; uint8_t lcd_command; uint8_t daten; // ENABLED toggeln void toggle_enable(void) { daten = daten | LCD_PIN_E; // ENABLED =1 TWI_DATA=daten; TWI_START(); TWI_MT_SLA_ACK(); TWI_MT_DATA_ACK(); TWI_STOP(); _delay_us(1); daten = daten &~ LCD_PIN_E; // ENABLED =0 TWI_DATA=daten; TWI_START(); TWI_MT_SLA_ACK(); TWI_MT_DATA_ACK(); TWI_STOP(); _delay_us(1); } //Initialisieren LCD void lcd_init() { // 8 Bit Modus einstellen _delay_us(60); daten = daten | LCD_PIN_D4; daten = daten | LCD_PIN_D5; toggle_enable(); // Wert übernehmen _delay_ms(40); toggle_enable(); // Wert übernehmen _delay_ms(1); toggle_enable(); // Wert übernehmen _delay_ms(5); // 4 Bit Modus einstellen daten = daten &~ LCD_PIN_D4; daten = daten | LCD_PIN_D5; toggle_enable(); // Wert übernehmen _delay_ms(10); //LCD auf 2 Zeilen, 4 Bit und 5x7 Matrix lcd_send(LCD_Befehl, LCD_SET_4BIT); _delay_ms(5); lcd_send(LCD_Befehl, LCD_OFF); _delay_ms(5); lcd_send(LCD_Befehl, LCD_CLEAR); _delay_ms(5); lcd_send(LCD_Befehl, LCD_SET_2); _delay_ms(5); lcd_send(LCD_Befehl, LCD_ON_C); _delay_ms(5); } //1 Byte an LCD senden void lcd_send(uint8_t type, uint8_t lcd_command) { if (type == LCD_Befehl) // Befehl an LCD daten= daten &~ LCD_PIN_RS; // 0 else // Daten an LCD daten= daten | LCD_PIN_RS; // 1 //High Nibble senden if (lcd_command &0x80) daten= daten | LCD_PIN_D7; // 1 else daten= daten &~ LCD_PIN_D7; // 0 if (lcd_command &0x40) daten= daten | LCD_PIN_D6; // 1 else daten= daten &~ LCD_PIN_D6; // 0 if (lcd_command &0x20) daten= daten | LCD_PIN_D5; // 1 else daten= daten &~ LCD_PIN_D5; // 0 if (lcd_command &0x10) daten= daten | LCD_PIN_D4; // 1 else daten= daten &~ LCD_PIN_D4; // 0 // Übernahme High Nibble toggle_enable(); // Low Nibble senden if (type == LCD_Befehl) // Befehl an LCD daten= daten &~ LCD_PIN_RS; // 0 else // Daten an LCD daten= daten | LCD_PIN_RS; // 1 if (lcd_command &0x08) daten= daten | LCD_PIN_D7; // 1 else daten= daten &~ LCD_PIN_D7; // 0 if (lcd_command &0x04) daten= daten | LCD_PIN_D6; // 1 else daten= daten &~ LCD_PIN_D6; // 0 if (lcd_command &0x02) daten= daten | LCD_PIN_D5; // 1 else daten= daten &~ LCD_PIN_D5; // 0 if (lcd_command &0x01) daten= daten | LCD_PIN_D4; // 1 else daten= daten &~ LCD_PIN_D4; // 0 // Übernahme Low Nibble toggle_enable(); // auf LCD warten _delay_ms(5); } //Zeichenkette dastellen void lcd_write(char * t) { uint8_t i; for (i=0; i<255; i++) { if (t[i]==0) return; else lcd_send(LCD_Daten, t[i]); } } void lcd_ein(void) { lcd_send(LCD_Befehl, LCD_ON_C); } void lcd_aus(void) { lcd_send(LCD_Befehl, LCD_OFF); } void sekunde(uint8_t i) { uint8_t k; for(;i>0;i++) { for (k=0;k<10;k++) _delay_ms(50); } }