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+i5,5); OLED_ShowString(68,0,LBJ_Info[0],16); OLED_ShowString(7*8,4,LBJ_Info[2],16); } 这个是STM32F103C8T6和ssd1306的显示函数,现在是收到消息直接显示,不会息屏,能不能帮我把它修改为收到消息后常亮6秒,如果有新消息就替换显示,不用HAL_GetTick
时间: 2024-03-07 16:50:24 浏览: 93
可以使用定时器来实现消息显示和替换的功能。具体做法是,在接收到新消息时,启动一个定时器,定时器到达后关闭屏幕,然后在新消息到达时重新启动定时器,以此循环。
下面是修改后的代码示例:
```
#define DISPLAY_TIME 6000 // 显示时间,单位为毫秒
TIM_HandleTypeDef htim3; // 定时器句柄
void StartDisplayTimer(uint16_t time)
{
HAL_TIM_Base_Start_IT(&htim3);
__HAL_TIM_SET_AUTORELOAD(&htim3, time);
}
void StopDisplayTimer()
{
HAL_TIM_Base_Stop_IT(&htim3);
OLED_Clear();
}
void ShowMessageLBJ(char* msg)
{
OLED_Clear();
OLED_ShowString(68, 0, msg, 16);
StartDisplayTimer(DISPLAY_TIME);
}
void ReceiveMessageLBJ(POCSAG_RESULT* POCSAG_Msg)
{
static char last_msg[16] = {0}; // 上次显示的消息
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]);
if (strcmp(msg, last_msg) != 0)
{
strncpy(last_msg, msg, 15);
ShowMessageLBJ(msg);
}
else
{
StartDisplayTimer(DISPLAY_TIME);
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM3)
{
StopDisplayTimer();
}
}
```
这里使用了定时器来实现屏幕显示和关闭。在接收到新消息时,判断是否和上一次显示的消息相同,如果不同则调用`ShowMessageLBJ`函数显示新消息,否则重新启动定时器。在定时器到达时,调用`StopDisplayTimer`函数关闭屏幕。定时器的实现可以参考STM32 HAL库的定时器使用方法。
阅读全文