stm32链表实现LCD滚动显示串口消息
时间: 2023-11-19 07:06:33 浏览: 32
实现此功能需要以下步骤:
1. 创建一个链表结构体,用来存储串口消息。
2. 在串口中断函数中,将接收到的消息插入到链表的尾部。
3. 在LCD显示函数中,从链表的头部开始遍历,将消息逐个显示在LCD上。
4. 如果链表中的消息数量超过了LCD显示区域的限制,就需要进行滚动显示,即将链表头部的消息删除,并将链表指针指向下一个节点。
下面是一个简单的示例代码:
```c
#include "stm32f4xx.h"
#include "lcd.h"
#define MAX_MSG_NUM 10 // 链表最大存储消息数量
typedef struct MsgNode_t {
char msg[32];
struct MsgNode_t* next;
} MsgNode;
MsgNode* head = NULL; // 链表头指针
MsgNode* tail = NULL; // 链表尾指针
uint8_t msg_num = 0; // 链表当前存储消息数量
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
char c = USART_ReceiveData(USART1);
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
if (msg_num >= MAX_MSG_NUM) {
// 链表已满,删除头部消息
MsgNode* tmp = head;
head = head->next;
free(tmp);
msg_num--;
}
// 插入尾部节点
MsgNode* node = (MsgNode*)malloc(sizeof(MsgNode));
strcpy(node->msg, c);
node->next = NULL;
if (head == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
msg_num++;
}
}
void lcd_scroll_display(void)
{
int i;
MsgNode* node = head;
for (i = 0; i < MAX_MSG_NUM; i++) {
if (node == NULL) {
break;
}
lcd_display_string(node->msg);
node = node->next;
}
if (i >= MAX_MSG_NUM) {
// 链表已满,需要滚动显示
MsgNode* tmp = head;
head = head->next;
free(tmp);
msg_num--;
}
}
int main(void)
{
// 初始化串口和LCD
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
lcd_init();
while (1) {
lcd_scroll_display();
}
}
```
需要注意的是,链表的操作需要注意多线程安全性,因为串口中断函数和LCD显示函数可能同时访问链表。建议使用互斥锁或者其他同步机制来保证数据的正确性。