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) void Display::run(void)
{ {
char *data;
switch (this->current_state) switch (this->current_state)
{ {
case StateIdle: case StateIdle:
if(this->new_data) if(this->active_line == ActiveLineNone)
{ {
this->new_data = false; if(this->new_data1)
this->current_state = StateWriteData; {
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; break;
case StateDelay: case StateDelay:
@ -117,10 +131,20 @@ namespace ElektronischeLast
this->next_state = StateIdle; this->next_state = StateIdle;
break; break;
case StateWriteData: case StateWriteData:
write_data_4bit((std::uint8_t)this->string[this->pointer++]); if(this->active_line == ActiveLine1)
if(this->string[this->pointer] == '\0') {
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->next_state = StateIdle;
this->active_line = ActiveLineNone;
} }
else 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)); if(line == Display::Line1)
this->pointer = 0U; {
this->new_data = true; 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) bool Display::ready_for_data(void)

View File

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

View File

@ -133,7 +133,7 @@ int main (void)
lcd.run(); lcd.run();
} }
lcd.lcd_set_display(Display::eDispalyOn, Display::eCursorOff, Display::eCursorBlinkOff); lcd.lcd_set_display(Display::eDispalyOn, Display::eCursorOff, Display::eCursorBlinkOff);
lcd.print("Elektronische Last"); lcd.print(Display::Line1, "Elektronische Last");
while(1) while(1)
{ {
@ -179,25 +179,29 @@ int main (void)
char data[17U]; char data[17U];
lcd.set_cursor(Display::Line1, 0U); int32_t len = snprintf(data, sizeof(data) - 1, "%2" PRIu32 ".%02" PRIu32 "V",
int32_t len = snprintf(data, sizeof(data) - 1, "U:%" PRIu32 ".%02" PRIu32 "V",
spannung / 1000U, spannung % 1000U / 10U); spannung / 1000U, spannung % 1000U / 10U);
std::memset(&data[len], (int)' ', 16U - len); 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'; data[16] = '\0';
lcd.print(data); lcd.print(Display::Line1, data);
#if 0
lcd.set_cursor(Display::Line2, 0U); if(strom < 1000UL)
len = snprintf(data, sizeof(data) - 1, "I:%" PRIu32 ".%02" PRIu32 "A", {
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); strom / 1000U, strom % 1000U / 10U);
}
std::memset(&data[len], (int)' ', 16U - len); 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'; data[16] = '\0';
lcd.print(data); lcd.print(Display::Line2, data);
#endif }
} }
lcd.run(); lcd.run();
}
break; break;
} }
serial_cyclic(); serial_cyclic();