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.
 
 
 
 
 
 

248 lines
6.9 KiB

/*
* 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 <board.h>
// ==================== 引脚定义 (根据你的硬件修改) ====================
#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;
}