/**
 * @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;
}
Пример #5
0
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);
}