/* 显示任务 */ /* Includes ----------------------------------------------------------------- */ #include "task\user_task.h" #include "device\can.h" #include "task\user_task.h" #include "bsp\led.h" #include "bsp\buzzer.h" #include "device\lcd.h" #include "bsp\gpio.h" #include "lvgl.h" // 它为整个LVGL提供了更完整的头文件引用 #include "lv_port_disp.h" // LVGL的显示支持 #include "lv_port_indev.h" // LVGL的触屏支持 #include "tim.h" /* Private typedef ---------------------------------------------------------- */ /* Private define ----------------------------------------------------------- */ /* Private macro ------------------------------------------------------------ */ /* Private variables -------------------------------------------------------- */ static CAN_t can; CAN_Sick_t sick; /* Private function --------------------------------------------------------- */ /* Exported functions ------------------------------------------------------- */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6) { lv_tick_inc(1); // LVGL的tick计数器 } } void Task_Disp(void *argument) { (void)argument; // 消除未使用参数的警告 const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_DISP; // 50Hz uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */ LCD_Init(); lv_init(); // LVGL 初始化 lv_port_disp_init(); // 注册LVGL的显示任务 lv_port_indev_init(); // 注册LVGL的触屏检测任务 LCD_Clear(WHITE); HAL_TIM_Base_Start_IT(&htim6); // 启动定时器中断 // 按钮 1 lv_obj_t *myBtn1 = lv_btn_create(lv_scr_act()); // 创建按钮; 父对象:当前活动屏幕 lv_obj_set_pos(myBtn1, 170, 80); // 设置坐标 lv_obj_set_size(myBtn1, 60, 20); // 设置大小 // 按钮 1 的文本 lv_obj_t *label_btn1 = lv_label_create(myBtn1); // 创建文本标签,父对象:上面的btn按钮 lv_obj_align(label_btn1, LV_ALIGN_CENTER, 0, 0); // 对齐于:父对象 lv_label_set_text(label_btn1, "NEXT"); // 设置标签的文本 // 按钮 2 lv_obj_t *myBtn2 = lv_btn_create(lv_scr_act()); // 创建按钮; 父对象:当前活动屏幕 lv_obj_set_pos(myBtn2, 170, 110); // 设置坐标 lv_obj_set_size(myBtn2, 60, 20); // 设置大小 // 按钮 2 的文本 lv_obj_t *label_btn2 = lv_label_create(myBtn2); // 创建文本标签,父对象:上面的btn按钮 lv_obj_align(label_btn2, LV_ALIGN_CENTER, 0, 0); // 对齐于:父对象 lv_label_set_text(label_btn2, "OK"); lv_obj_t *label_sick1 = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕 lv_obj_set_pos(label_sick1, 10, 10); // 设置坐标 lv_label_set_text(label_sick1, "Sick1: 0"); // 设置初始文本 // 创建 Sick2 标签 lv_obj_t *label_sick2 = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕 lv_obj_set_pos(label_sick2, 120, 10); // 设置坐标 lv_label_set_text(label_sick2, "Sick2: 0"); // 设置初始文本 // 创建 Sick3 标签 lv_obj_t *label_sick3 = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕 lv_obj_set_pos(label_sick3, 10, 40); // 设置坐标 lv_label_set_text(label_sick3, "Sick3: 0"); // 设置初始文本 // 创建 Sick4 标签 lv_obj_t *label_sick4 = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕 lv_obj_set_pos(label_sick4, 120, 40); // 设置坐标 lv_label_set_text(label_sick4, "Sick4: 0"); // 设置初始文本 // 创建 作者 标签 lv_obj_t *label_board = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕 lv_obj_set_pos(label_board, 10, 95); // 设置坐标 lv_label_set_text(label_board, "Mini_croe"); // 设置初始文本 lv_obj_t *label_name = lv_label_create(lv_scr_act()); // 父对象:当前活动屏幕 lv_obj_set_pos(label_name, 10, 114); // 设置坐标 lv_label_set_text(label_name, "By Robofish"); // 设置初始文本 while (1) { tick += delay_tick; /* 计算下一个唤醒时刻 */ // 读取数据 lv_timer_handler(); // LVGL的定时器处理函数 if (osMessageQueueGet(task_runtime.msgq.can.feedback.sick, &can, NULL, 100) == osOK) { osKernelLock(); // 更新显示内容 char buffer[16]; snprintf(buffer, sizeof(buffer), "Sick1: %d", can.sick.named.sick[0]); // 假设 sick.value1 是 Sick1 的值 lv_label_set_text(label_sick1, buffer); snprintf(buffer, sizeof(buffer), "Sick2: %d", can.sick.named.sick[1]); // 假设 sick.value2 是 Sick2 的值 lv_label_set_text(label_sick2, buffer); snprintf(buffer, sizeof(buffer), "Sick3: %d", can.sick.named.sick[2]); // 假设 sick.value3 是 Sick3 的值 lv_label_set_text(label_sick3, buffer); snprintf(buffer, sizeof(buffer), "Sick4: %d", can.sick.named.sick[3]); // 假设 sick.value4 是 Sick4 的值 lv_label_set_text(label_sick4, buffer); osKernelUnlock(); } osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */ } }