#include "lcd_hd44780.h" #include static int isStructOk(cm_lcd_hd44780_t *inst){ if(inst == NULL)return 0; if(inst->setGetGpio_event == NULL) return 0; if(inst->wait_event == NULL) return 0; return 1; } void lcd_hd44780_writeToDisp(cm_lcd_hd44780_t *inst){ inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET); } /* void lcd_hd44780_clearDisp(lcd_hd44780_t *inst){ return; } void lcd_hd44780_printf(lcd_hd44780_t *inst, char *string){ return; }*/ static int lcd_write_8bit(cm_lcd_hd44780_t *inst, uint8_t dataOrCmd, hd44780_InstData_t mode){ // Set cmd on databus inst->gpio_data.data_bus = dataOrCmd; // We want to set display inst->gpio_data.rw_pin = LCD_HD44780_SET; // We want to write an instruction. inst->gpio_data.rs_pin = mode; // E pin must be high when data is not ready yet. inst->gpio_data.e_pin = 1; inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET); // Then Clock data in with E pin. Data is clocked on Falling edge: inst->gpio_data.e_pin = 0; inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET); // Then set E pin high so its ready for next time: inst->gpio_data.e_pin = 1; inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET); return 0; } static void lcd_writeCmd_disp(cm_lcd_hd44780_t *inst, hd44780_cmd_t cmd, hd44780_setGet_t getSet){ if(inst->bit_mode == LCD_HD44780_BITMODE_8BIT){ lcd_write_8bit(inst, cmd, LCD_HD44780_INSTRUCTION); }else{ // Write MSB first. lcd_write_8bit(inst, (cmd >> 4) & 0xf, LCD_HD44780_INSTRUCTION); // Write LSB last. lcd_write_8bit(inst, cmd & 0xf, LCD_HD44780_INSTRUCTION); } } void lcd_hd44780_initDisp(cm_lcd_hd44780_t *inst){ // Make sure E pin is high when data isnt ready on BUS! inst->gpio_data.e_pin = 1; inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET); // Wait for more than 15ms after VCC rise.. inst->wait_event(15); lcd_writeCmd_disp(inst, LCD_HD44780_FUNCTION_SET,LCD_HD44780_SET); // Wait for 4.1ms.. // Delay(4) inst->wait_event(4); lcd_writeCmd_disp(inst, LCD_HD44780_DISP_ONOFF_CTL,LCD_HD44780_SET); // delay 100us inst->wait_event(1); lcd_writeCmd_disp(inst, LCD_HD44780_ENTRY_MODE,LCD_HD44780_SET); } void lcd_hd44780_regGpioEvt(cm_lcd_hd44780_t *inst, setGet_Gpio_Event_fpt getGpioEvt_fpt){ if(inst == NULL)return; if(getGpioEvt_fpt == NULL) return; inst->setGetGpio_event = getGpioEvt_fpt; } void lcd_hd44780_regWaitEvt(cm_lcd_hd44780_t *inst, wait_ms_Event_fpt waitEvt_fpt){ if(inst == NULL)return; if(waitEvt_fpt == NULL) return; inst->wait_event = waitEvt_fpt; } void lcd_hd44780_init(cm_lcd_hd44780_t *inst, lcd_hd44780_bitmode bit_mode){ if(!isStructOk(inst)) return; inst->bit_mode = bit_mode; lcd_hd44780_initDisp(inst); return; }