/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2025-10-26 Administrator the first version */ /** * @file ssd1963.c * @brief SSD1963 TFT LCD Controller Driver for STM32F407 + FSMC + RT-Thread * @author Qwen (Generated for RTT) * @date 2025-10-26 */ #include "rtthread.h" #include "rtdevice.h" #include "ssd1963.h" // 确保路径正确 #include // ==================== 引脚定义 (根据你的硬件修改) ==================== #define LCD_RST_PIN GET_PIN(B,2) // 复位引脚 #define LCD_BL_PIN GET_PIN(B,0) // 背光控制引脚 (PWM) // ==================== SSD1963 命令定义 ==================== #define SSD1963_NOP 0x00 #define SSD1963_SOFT_RESET 0x01 #define SSD1963_GET_PWR_MODE 0x0A #define SSD1963_GET_ADDR_MODE 0x0B #define SSD1963_GET_PIX_FORMAT 0x0C #define SSD1963_GET_SIG_MODE 0x0D #define SSD1963_GET_DIAGNOSTIC 0x0F #define SSD1963_ENTER_SLEEP 0x10 #define SSD1963_EXIT_SLEEP 0x11 #define SSD1963_ENTER_PARTIAL 0x12 #define SSD1963_ENTER_NORMAL 0x13 #define SSD1963_EXIT_INVERT 0x20 #define SSD1963_ENTER_INVERT 0x21 #define SSD1963_SET_GAMMA 0x26 #define SSD1963_BLANK_OFF 0x28 #define SSD1963_BLANK_ON 0x29 #define SSD1963_CLEAR_WINDOW 0x2D #define SSD1963_WRITE_MEMORY_START 0x2C #define SSD1963_READ_MEMORY 0x2E #define SSD1963_SET_PARTIAL_AREA 0x30 #define SSD1963_SET_SCROLL_AREA 0x33 #define SSD1963_SET_TEAR_OFF 0x34 #define SSD1963_SET_TEAR_ON 0x35 #define SSD1963_MEM_ACCESS_CTRL 0x36 #define SSD1963_VERTICAL_SCROLL 0x37 #define SSD1963_IDLE_OFF 0x38 #define SSD1963_IDLE_ON 0x39 #define SSD1963_SET_PIX_FORMAT 0x3A #define SSD1963_SET_IMAGE_FUNC 0x3B #define SSD1963_WRITE_MEMORY_CONTINUE 0x3C #define SSD1963_READ_MEMORY_CONTINUE 0x3E #define SSD1963_SET_COLUMN 0x2A #define SSD1963_SET_ROW 0x2B #define SSD1963_SET_XY 0x2C #define SSD1963_SET_TE_LINE 0x40 #define SSD1963_GET_SCAN_LINE 0x45 #define SSD1963_GET_HOR_PERIOD 0x44 #define SSD1963_SET_PLL_MN 0xE0 #define SSD1963_SET_PLL 0xE2 #define SSD1963_SET_PLL_ENABLE 0xE3 #define SSD1963_SET_DESKTOP_START 0xEA // ==================== 基础操作函数 ==================== /** * @brief 写入命令 * @param cmd 命令字节 */ static void ssd1963_write_cmd(uint8_t cmd) { SSD1963_CMD_ADDR = cmd; } /** * @brief 写入数据字节 * @param data 数据字节 */ static void ssd1963_write_data(uint8_t data) { SSD1963_DATA_ADDR = data; } /** * @brief 写入 16 位数据 * @param data 16 位数据 */ static void ssd1963_write_data_16(uint16_t data) { SSD1963_DATA_ADDR = data; } /** * @brief 写入 32 位数据(分 4 次) * @param data 32 位数据 */ static void ssd1963_write_data_long(uint32_t data) { ssd1963_write_data((data >> 24) & 0xFF); ssd1963_write_data((data >> 16) & 0xFF); ssd1963_write_data((data >> 8) & 0xFF); ssd1963_write_data(data & 0xFF); } // ==================== 显示设置函数 ==================== /** * @brief 设置显示窗口(GRAM 区域) * @param x1 起始 X 坐标 * @param y1 起始 Y 坐标 * @param x2 结束 X 坐标 * @param y2 结束 Y 坐标 */ void ssd1963_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { ssd1963_write_cmd(SSD1963_SET_COLUMN); ssd1963_write_data_long(x1); ssd1963_write_data_long(x2); ssd1963_write_cmd(SSD1963_SET_ROW); ssd1963_write_data_long(y1); ssd1963_write_data_long(y2); ssd1963_write_cmd(SSD1963_WRITE_MEMORY_START); // 准备写 GRAM } /** * @brief 清屏 * @param color 填充颜色 (RGB565) */ void ssd1963_clear(rt_uint16_t color) { uint32_t i; uint32_t total_pixels = 480 * 272; // 根据实际分辨率调整 ssd1963_set_window(0, 0, 479, 271); for (i = 0; i < total_pixels; i++) { SSD1963_DATA_ADDR = color; } } // ==================== 初始化函数 ==================== /** * @brief 初始化 SSD1963 控制器 * 支持 480x272 分辨率,16位色 */ void ssd1963_init(void) { rt_pin_mode(LCD_RST_PIN, PIN_MODE_OUTPUT); // 复位 rt_pin_write(LCD_RST_PIN, PIN_LOW); rt_thread_mdelay(100); rt_pin_write(LCD_RST_PIN, PIN_HIGH); rt_thread_mdelay(150); // 软件复位 ssd1963_write_cmd(SSD1963_SOFT_RESET); rt_thread_mdelay(10); // ============= 设置 PLL ============= // PLL = (CLK * (M+1)) / (N+1), 典型主频 10MHz 输入 ssd1963_write_cmd(SSD1963_SET_PLL_MN); ssd1963_write_data(0x23); // M = 35, M+1=36 ssd1963_write_data(0x02); // N = 2, N+1=3 ssd1963_write_data(0x04); // DIV = 4 // 启用 PLL ssd1963_write_cmd(SSD1963_SET_PLL_ENABLE); ssd1963_write_data(0x01); // 开启 PLL rt_thread_mdelay(1); ssd1963_write_cmd(SSD1963_SET_PLL_ENABLE); ssd1963_write_data(0x03); // 锁定 PLL rt_thread_mdelay(5); // 选择 PLL 作为系统时钟 ssd1963_write_cmd(SSD1963_SET_PLL); ssd1963_write_data(0x03); // ============= 设置 LCD 模式 ============= ssd1963_write_cmd(0xB0); // Set LCD Mode ssd1963_write_data(0x20); // 24-bit/pixel, TFT 模式 ssd1963_write_data(0x01); // HSYNC+VSYNC 控制 ssd1963_write_data_long(480); // LCD 宽度 ssd1963_write_data_long(272); // LCD 高度 ssd1963_write_data_long(41); // HSYNC 脉冲宽度 (41) ssd1963_write_data_long(2); // HSYNC 起始延迟 (HBP) ssd1963_write_data_long(2); // HSYNC 结束延迟 (HFP) ssd1963_write_data_long(10); // VSYNC 脉冲宽度 (10) ssd1963_write_data_long(2); // VSYNC 起始延迟 (VBP) ssd1963_write_data_long(2); // VSYNC 结束延迟 (VFP) // ============= 设置像素格式 ============= ssd1963_write_cmd(SSD1963_SET_PIX_FORMAT); ssd1963_write_data(0x55); // 16位色 (RGB565) // ============= 设置内存访问方向 ============= ssd1963_write_cmd(SSD1963_MEM_ACCESS_CTRL); ssd1963_write_data(0x08); // RGB, 正常方向 // ============= 设置背光 ============= // rt_pin_mode(LCD_BL_PIN, PIN_MODE_OUTPUT); // rt_pwm_enable(LCD_BL_PIN); // rt_pwm_set(LCD_BL_PIN, 1000, 50000); // 1kHz, 50% 占空比 (可调) // rt_pin_write(LCD_BL_PIN, PIN_HIGH); // 直接输出高电平点亮 // ============= 开启显示 ============= ssd1963_write_cmd(SSD1963_EXIT_SLEEP); rt_thread_mdelay(10); ssd1963_write_cmd(SSD1963_BLANK_OFF); ssd1963_write_cmd(SSD1963_ENTER_NORMAL); rt_thread_mdelay(10); ssd1963_write_cmd(SSD1963_IDLE_OFF); // 初始窗口 ssd1963_set_window(0, 0, 799, 479); // 可选:清屏为黑色 ssd1963_clear(0x00f0); } // ==================== LVGL 对接接口 (可选封装) ==================== /** * @brief 获取屏幕宽度 * @return 宽度 */ rt_uint16_t ssd1963_get_width(void) { return 800; } /** * @brief 获取屏幕高度 * @return 高度 */ rt_uint16_t ssd1963_get_height(void) { return 480; }