/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2025-10-27 Administrator the first version */ #include "lvgl.h" #include "lv_port_disp.h" #include "ssd1963.h" // 屏幕分辨率(请根据实际 LCD 调整) #define LCD_WIDTH 480 #define LCD_HEIGHT 272 // 绘图缓冲区:建议为屏幕宽度 * 10 行 static lv_color_t draw_buf1[LCD_WIDTH * 10]; // 前缓冲 static lv_color_t draw_buf2[LCD_WIDTH * 10]; // 后缓冲(可选,用于双缓冲) // LVGL 绘图缓冲区描述符 static lv_disp_draw_buf_t draw_buf; // 刷屏完成回调 static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { // 设置 SSD1963 显示窗口 ssd1963_set_window(area->x1, area->y1, area->x2, area->y2); // 写入像素数据 uint32_t size = (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1); for (uint32_t i = 0; i < size; i++) { SSD1963_DATA_ADDR = color_p[i].full; // 使用 FSMC 写入 } // ✅ 必须调用!通知 LVGL 刷屏已完成 lv_disp_flush_ready(disp_drv); } /** * @brief 初始化 LVGL 显示驱动 */ void lv_port_disp_init(void) { // 1. 初始化 FSMC 总线(由 STM32CubeMX 生成) // MX_FSMC_Init(); // 2. 初始化 SSD1963 控制器 ssd1963_init(); // ✅ 使用 ssd1963.h 中的初始化函数 // 注释掉重复的 lcd_init() // lcd_init(); // ❌ 删除:与 ssd1963_init() 重复或冲突 // 3. 初始化 LVGL 的绘图缓冲区 // 参数:缓冲区结构体、第一个缓冲区、第二个缓冲区(可选)、总大小(像素数) lv_disp_draw_buf_init(&draw_buf, draw_buf1, draw_buf2, LCD_WIDTH * 10); // 4. 初始化显示驱动 static lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.hor_res = LCD_WIDTH; // 水平分辨率 disp_drv.ver_res = LCD_HEIGHT; // 垂直分辨率 disp_drv.flush_cb = disp_flush; // 刷屏回调 disp_drv.draw_buf = &draw_buf; // 绑定缓冲区 ✅ 必须赋值! // 5. 注册显示设备到 LVGL lv_disp_drv_register(&disp_drv); }