/** * @brief send a command to LCD display * @param uint8_t command * @retval None */ void lcd_send_command(uint8_t command) { GPIO_ResetBits(LCD_GPIO, LCD_PINS); lcd_set_data(command); GPIO_ResetBits(LCD_GPIO, LCD_RS); GPIO_SetBits(LCD_GPIO, LCD_EN); osDelay(1); GPIO_ResetBits(LCD_GPIO, LCD_EN); osDelay(2); }
/** * @brief display a character on the LCD display * @param uint8_t character * @retval None */ void lcd_send_character(uint8_t character) { GPIO_ResetBits(LCD_GPIO, LCD_PINS); lcd_set_data(character); GPIO_SetBits(LCD_GPIO, LCD_RS); GPIO_SetBits(LCD_GPIO, LCD_EN); osDelay(1); GPIO_ResetBits(LCD_GPIO, LCD_EN); osDelay(1); }
// generic send void lcd_send(uint8_t data, uint8_t type) { lcd_busy_wait(); if (type) { lcd_set_data(); } else { lcd_set_instruction(); } lcd_set_write(); lcd_set_enable_on(); lcd_set_port_write(); lcd_write(data); LCD_DELAY; LCD_DELAY; lcd_set_enable_off(); }
// generic get uint8_t lcd_get(uint8_t type) { uint8_t data; lcd_busy_wait(); lcd_set_port_read(); lcd_write(0xFF); if (type) { lcd_set_data(); } else { lcd_set_instruction(); } lcd_set_read(); lcd_set_enable_on(); LCD_DELAY; LCD_DELAY; data = lcd_read(); lcd_set_enable_off(); return data; }
static void lcd_putchar (lcd_t *lcd, short c) { int i; switch (lcd->esc_mode) { case 0: if (! lcd->unicode_char) { switch (c) { case '\n': if (lcd->new_line) { lcd->new_line = 0; return; } for (i = lcd->col; i < 20; ++i) lcd_set_data (lcd, ' '); //lcd->line = (lcd->line + 1) & 3; //lcd_set_line (lcd, lcd->line); return; case '\t': /* tab replaced by space */ c = ' '; break; case '\r': /* carriage return - go to begin of line */ lcd_set_line (lcd, lcd->line); return; case '\33': lcd->esc_mode = 1; return; case '&': c = 0xB0; break; case 0xD0: case 0xD1: lcd->unicode_char = c; return; } } else { c = translate_russian (lcd, c); lcd->unicode_char = 0; } break; case 1: if (c == '[') { lcd->esc_mode = 2; return; } else { lcd->esc_mode = 0; } break; case 2: if (c == 'H') { lcd_command (LCD_CMD_CURSOR_HOME); lcd->line = 0; lcd->col = 0; lcd->esc_mode = 0; return; } else if (c == '2') { lcd->esc_mode = 3; lcd->esc_buf = c; return; } else { lcd_set_data (lcd, '['); lcd->esc_mode = 0; } break; case 3: if (c == 'J') { lcd_command (LCD_CMD_CLEAR_DISPLAY); lcd->line = 0; lcd->col = 0; lcd->esc_mode = 0; return; } else { lcd_set_data (lcd, '['); lcd_set_data (lcd, lcd->esc_buf); lcd->esc_mode = 0; } break; default: lcd->esc_mode = 0; break; } lcd_set_data (lcd, c); }