You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.2 KiB

/*
* 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);
}