some progress on 4 bit mode.. but doesnt work

This commit is contained in:
2025-06-14 19:47:03 +02:00
parent f55529eb52
commit b1559460ee
2 changed files with 35 additions and 4 deletions

View File

@@ -28,6 +28,32 @@ void lcd_hd44780_printf(lcd_hd44780_t *inst, char *string){
}*/ }*/
static int WaitUntilReady(cm_lcd_hd44780_t *inst){
// If display is init, then use Polling Busy Flag!
if(inst->isInit){
// RS = 0, RW = 1
inst->gpio_data.rs_pin = 0;
inst->gpio_data.rw_pin = 1;
// Read from the data bus
inst->setGetGpio_event(&(inst->gpio_data), LCD_HD44780_GET);
// Loop until Busy Flag (D7) is clear
while (inst->gpio_data.data_bus & 0x80) {
inst->setGetGpio_event(&(inst->gpio_data), LCD_HD44780_GET);
}
return 1;
}else{
inst->wait_event(1);
return 1;
}
}
static int lcd_write_8bit(cm_lcd_hd44780_t *inst, uint8_t dataOrCmd, hd44780_InstData_t mode){ static int lcd_write_8bit(cm_lcd_hd44780_t *inst, uint8_t dataOrCmd, hd44780_InstData_t mode){
// Set cmd on databus // Set cmd on databus
@@ -41,13 +67,15 @@ static int lcd_write_8bit(cm_lcd_hd44780_t *inst, uint8_t dataOrCmd, hd44780_Ins
// E pin must be high when data is not ready yet. // E pin must be high when data is not ready yet.
inst->gpio_data.e_pin = 1; inst->gpio_data.e_pin = 1;
inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET); inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET);
// Then Clock data in with E pin. Data is clocked on Falling edge: // Then Clock data in with E pin. Data is clocked on Falling edge:
inst->gpio_data.e_pin = 0; inst->gpio_data.e_pin = 0;
inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET); inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET);
// Wait until display is ready:
WaitUntilReady(inst);
// Then set E pin high so its ready for next time: // Then set E pin high so its ready for next time:
inst->gpio_data.e_pin = 1; inst->gpio_data.e_pin = 1;
inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET); inst->setGetGpio_event(&(inst->gpio_data),LCD_HD44780_SET);
@@ -66,9 +94,9 @@ static void lcd_writeCmd_disp(cm_lcd_hd44780_t *inst, hd44780_cmd_t cmd, hd44780
}else{ }else{
// Write MSB first. // Write MSB first.
lcd_write_8bit(inst, (cmd >> 4) & 0xf, LCD_HD44780_INSTRUCTION); lcd_write_8bit(inst, ((cmd >> 4) & 0x0F) << 4, LCD_HD44780_INSTRUCTION);
// Write LSB last. // Write LSB last.
lcd_write_8bit(inst, cmd & 0xf, LCD_HD44780_INSTRUCTION); lcd_write_8bit(inst, (cmd & 0x0F) << 4, LCD_HD44780_INSTRUCTION);
} }
} }
@@ -94,7 +122,8 @@ void lcd_hd44780_initDisp(cm_lcd_hd44780_t *inst){
lcd_writeCmd_disp(inst, LCD_HD44780_ENTRY_MODE,LCD_HD44780_SET); lcd_writeCmd_disp(inst, LCD_HD44780_ENTRY_MODE,LCD_HD44780_SET);
// Init has been done, and we can now use Busy Flag polling instead of delay!
inst->isInit = 0x1;
} }

View File

@@ -76,6 +76,8 @@ typedef struct{
wait_ms_Event_fpt wait_event; wait_ms_Event_fpt wait_event;
lcd_hd44780_bitmode bit_mode; lcd_hd44780_bitmode bit_mode;
hd44780_gpioset_t gpio_data; hd44780_gpioset_t gpio_data;
// Flag for showing that init has been done.. After init im using polling Busy Flag instead of delay..
uint8_t isInit;
}cm_lcd_hd44780_t; }cm_lcd_hd44780_t;