void ShowMessageLBJ(POCSAG_RESULT* POCSAG_Msg) { char LBJ_Info[3][7] = {{0},{0},{0}};、 for(uint8_t i = 0;i < 3;i++) { strncpy(LBJ_Info[i],POCSAG_Msg->txtMsg+i*5,5); OLED_ShowString(6*8,0,LBJ_Info[0],16); OLED_ShowString(7*8,4,LBJ_Info[2],16); } 这个是STM32F103C8T6和ssd1306的显示函数,现在是收到消息直接显示,不会息屏,能不能帮我把它修改为收到消息后常亮6秒,如果有新消息就替换显示
时间: 2024-03-07 22:50:23 浏览: 63
可以把显示函数改为一个带有参数的函数,参数为要显示的字符串和显示时间。然后在收到新消息时,判断是否已经显示了6秒,如果是则替换显示,否则不做处理。
下面是修改后的代码示例:
```
#define DISPLAY_TIME 6000 // 显示时间,单位为毫秒
void ShowMessageLBJ(char* msg, uint16_t display_time)
{
static uint32_t last_display_time = 0; // 上次显示时间
static char last_msg[16] = {0}; // 上次显示的消息
if (strcmp(msg, last_msg) != 0 || HAL_GetTick() - last_display_time >= DISPLAY_TIME)
{
strncpy(last_msg, msg, 15);
last_display_time = HAL_GetTick();
OLED_Clear();
OLED_ShowString(6*8, 0, last_msg, 16);
HAL_Delay(display_time);
}
}
void ReceiveMessageLBJ(POCSAG_RESULT* POCSAG_Msg)
{
char LBJ_Info[3][7] = {{0},{0},{0}};
for (uint8_t i = 0; i < 3; i++)
{
strncpy(LBJ_Info[i], POCSAG_Msg->txtMsg + i * 5, 5);
}
char msg[16];
snprintf(msg, 16, "%s %s", LBJ_Info[0], LBJ_Info[2]);
ShowMessageLBJ(msg, DISPLAY_TIME);
}
```
这里使用了静态变量来记录上次显示的消息和时间,如果收到的消息和上次不同或者距离上次显示已经超过6秒,则重新显示。在显示时还加入了延时函数,以保证屏幕能够一直亮着6秒钟。
阅读全文