diff --git a/Core/Inc/lcd.h b/Core/Inc/lcd.h index 0558f54..9e849e3 100644 --- a/Core/Inc/lcd.h +++ b/Core/Inc/lcd.h @@ -13,8 +13,10 @@ typedef struct HAL_StatusTypeDef LCD_SendInternal(LCD_HandleTypeDef *lcd, uint8_t data, uint8_t flags); void LCD_SendCommand(LCD_HandleTypeDef *lcd, uint8_t cmd); +void LCD_MoveCursor(LCD_HandleTypeDef *lcd, uint8_t line, uint8_t column); void LCD_SendData(LCD_HandleTypeDef *lcd, uint8_t data); void LCD_Init(LCD_HandleTypeDef *lcd); +void LCD_SendChar(LCD_HandleTypeDef *lcd, char chr); void LCD_SendString(LCD_HandleTypeDef *lcd, char *str); #endif \ No newline at end of file diff --git a/Core/Src/lcd.c b/Core/Src/lcd.c index 25f643c..5e321cd 100644 --- a/Core/Src/lcd.c +++ b/Core/Src/lcd.c @@ -2,7 +2,7 @@ #define LCD_COLS 20 -#define LCD_DELAY_MS 5 +#define LCD_DELAY_MS 2 // commands #define LCD_CLEARDISPLAY 0x01 @@ -47,10 +47,12 @@ #define LCD_NOBACKLIGHT 0x00 //moving -#define LCD_LINE1 0x00 -#define LCD_LINE2 0x40 -#define LCD_LINE3 0x14 -#define LCD_LINE4 0x54 +const uint8_t LINE_BEGIN[4] = { + 0x00, + 0x40, + 0x14, + 0x54 +}; #define LCD_PIN_EN 0b00000100 // Enable bit #define LCD_PIN_RW 0b00000010 // Read/Write bit @@ -80,28 +82,38 @@ HAL_StatusTypeDef LCD_SendInternal(LCD_HandleTypeDef *lcd, uint8_t data, uint8_t } void LCD_SendCommand(LCD_HandleTypeDef *lcd, uint8_t cmd) { - LCD_SendInternal(lcd->address, cmd, 0); + LCD_SendInternal(lcd, cmd, 0); } void LCD_SendData(LCD_HandleTypeDef *lcd, uint8_t data) { - LCD_SendInternal(lcd->address, data, LCD_PIN_RS); + LCD_SendInternal(lcd, data, LCD_PIN_RS); +} + +void LCD_MoveCursor(LCD_HandleTypeDef *lcd, uint8_t line, uint8_t column) { + if (line < lcd->rows && column < lcd->cols) + LCD_SendCommand(lcd, LCD_SETDDRAMADDR | (LINE_BEGIN[line] + column) ); } void LCD_Init(LCD_HandleTypeDef *lcd) { //http://easyelectronics.ru/avr-uchebnyj-kurs-podklyuchenie-k-avr-lcd-displeya-hd44780.html - LCD_SendCommand(lcd->address, LCD_FUNCTIONSET | LCD_4BITMODE | LCD_MULTILINE | LCD_5x8DOTS); // 0b00110000); + LCD_SendCommand(lcd, LCD_FUNCTIONSET | LCD_4BITMODE | LCD_MULTILINE | LCD_5x8DOTS); // 0b00110000); // display & cursor home (keep this!) - LCD_SendCommand(lcd->address, LCD_RETURNHOME); + LCD_SendCommand(lcd, LCD_RETURNHOME); // display on, right shift, underline off, blink off - LCD_SendCommand(lcd->address, LCD_DISPLAYCONTROL|LCD_DISPLAYON|LCD_CURSOROFF|LCD_BLINKOFF); // 0b00001100); + LCD_SendCommand(lcd, LCD_DISPLAYCONTROL|LCD_DISPLAYON|LCD_CURSOROFF|LCD_BLINKOFF); // 0b00001100); // clear display (optional here) - LCD_SendCommand(lcd->address, LCD_CLEARDISPLAY); + LCD_SendCommand(lcd, LCD_CLEARDISPLAY); +} + +void LCD_SendChar(LCD_HandleTypeDef *lcd, char chr) { + if (chr) + LCD_SendData(lcd, (uint8_t)(chr)); } void LCD_SendString(LCD_HandleTypeDef *lcd, char *str) { while(*str) { - LCD_SendData(lcd->address, (uint8_t)(*str)); + LCD_SendData(lcd, (uint8_t)(*str)); str++; } } diff --git a/Core/Src/main.c b/Core/Src/main.c index 21c078d..8979b20 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -25,6 +25,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "lcd.h" +#include /* USER CODE END Includes */ @@ -123,6 +124,7 @@ int main(void) /* USER CODE BEGIN WHILE */ while (1) { + /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */