Display auf zwei Zeilen umgebaut

This commit is contained in:
Carsten Keller 2024-06-09 17:58:24 +02:00
parent f17fe678a8
commit 04bf1cf86a
Signed by: carsten
GPG Key ID: DF06343A3A9B8868
3 changed files with 71 additions and 25 deletions

View File

@ -41,13 +41,27 @@ namespace ElektronischeLast
void Display::run(void)
{
char *data;
switch (this->current_state)
{
case StateIdle:
if(this->new_data)
if(this->active_line == ActiveLineNone)
{
this->new_data = false;
this->current_state = StateWriteData;
if(this->new_data1)
{
this->new_data1 = false;
this->active_line = ActiveLine1;
this->next_state = StateWriteData;
set_cursor(Line1, 0U);
}
else if(this->new_data2)
{
this->new_data2 = false;
this->active_line = ActiveLine2;
this->next_state = StateWriteData;
set_cursor(Line2, 0U);
}
this->pointer = 0U;
}
break;
case StateDelay:
@ -117,10 +131,20 @@ namespace ElektronischeLast
this->next_state = StateIdle;
break;
case StateWriteData:
write_data_4bit((std::uint8_t)this->string[this->pointer++]);
if(this->string[this->pointer] == '\0')
if(this->active_line == ActiveLine1)
{
data = this->line1;
}
else if(this->active_line == ActiveLine2)
{
data = this->line2;
}
write_data_4bit((std::uint8_t)data[this->pointer++]);
if(data[this->pointer] == '\0')
{
this->next_state = StateIdle;
this->active_line = ActiveLineNone;
}
else
{
@ -175,11 +199,18 @@ namespace ElektronischeLast
}
}
void Display::print(const char* const string)
void Display::print(Display::Line_t line, const char* const string)
{
strncpy(this->string, string, sizeof(this->string));
this->pointer = 0U;
this->new_data = true;
if(line == Display::Line1)
{
strncpy(this->line1, string, sizeof(this->line1));
this->new_data1 = true;
}
else if(line == Display::Line2)
{
strncpy(this->line2, string, sizeof(this->line2));
this->new_data2 = true;
}
}
bool Display::ready_for_data(void)

View File

@ -114,16 +114,27 @@ namespace ElektronischeLast
void set_backlight(bool on);
void set_cursor(Line_t line, std::uint32_t position);
void lcd_set_display(eDisplay_t display, eCursor_t cursor, eCursorBlink_t blink);
void print(const char* const string);
void print(Display::Line_t line, const char* const string);
bool ready_for_data(void);
void lcd_set_user_chars(Display::UserDefinedCharakter_t character, const uint8_t character_data[]);
private:
typedef enum
{
ActiveLineNone,
ActiveLine1,
ActiveLine2,
} ActiveLine_t;
State_t current_state;
State_t next_state;
std::uint32_t timer;
char string[17];
char line1[17];
char line2[17];
std::uint8_t pointer;
bool new_data;
ActiveLine_t active_line;
bool new_data1;
bool new_data2;
bool timer_elapsed(void);
void start_timer(std::uint32_t timeout);
void lcd_cmd(uint8_t cmd);

View File

@ -133,7 +133,7 @@ int main (void)
lcd.run();
}
lcd.lcd_set_display(Display::eDispalyOn, Display::eCursorOff, Display::eCursorBlinkOff);
lcd.print("Elektronische Last");
lcd.print(Display::Line1, "Elektronische Last");
while(1)
{
@ -179,25 +179,29 @@ int main (void)
char data[17U];
lcd.set_cursor(Display::Line1, 0U);
int32_t len = snprintf(data, sizeof(data) - 1, "U:%" PRIu32 ".%02" PRIu32 "V",
int32_t len = snprintf(data, sizeof(data) - 1, "%2" PRIu32 ".%02" PRIu32 "V",
spannung / 1000U, spannung % 1000U / 10U);
std::memset(&data[len], (int)' ', 16U - len);
snprintf(&data[10], sizeof(data) - 10, "T:%" PRIu32 "%cC", temperatur, 0x1);
snprintf(&data[12], sizeof(data) - 12, "%2" PRIu32 "%cC", temperatur, 0x1);
data[16] = '\0';
lcd.print(data);
#if 0
lcd.set_cursor(Display::Line2, 0U);
len = snprintf(data, sizeof(data) - 1, "I:%" PRIu32 ".%02" PRIu32 "A",
strom / 1000U, strom % 1000U / 10U);
lcd.print(Display::Line1, data);
if(strom < 1000UL)
{
len = snprintf(data, sizeof(data) - 1, "%3" PRIu32 "mA", strom);
}
else
{
len = snprintf(data, sizeof(data) - 1, "%" PRIu32 ".%02" PRIu32 "A",
strom / 1000U, strom % 1000U / 10U);
}
std::memset(&data[len], (int)' ', 16U - len);
snprintf(&data[10], sizeof(data) - 10, "S:%" PRIu32 "W", geschwindigkeit);
snprintf(&data[9], sizeof(data) - 9, "%4" PRIu32 "RPM", geschwindigkeit);
data[16] = '\0';
lcd.print(data);
#endif
lcd.print(Display::Line2, data);
}
lcd.run();
}
lcd.run();
break;
}
serial_cyclic();