# LCD ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- # 基础知识 Liquid Crystal Display,简称 LCD,是一种利用液晶分子控制光线通过与否来显示图像的平面面板。其核心在于驱动电路接收来自处理器(如MCU、MPU)的图像数据,并通过特定的物理接口将其转换为控制每个像素点所需的电压。 **LCD驱动包括以下几个基本要素:** 1. LCD面板:显示图像的物理界面,由大量的像素点矩阵构成。 2. 驱动IC:面板的关键芯片,负责接收主机发送的图像数据与指令,并生成精确的电压来控制液晶偏转。 3. 接口:连接主控处理器与LCD驱动IC的物理通道和通信协议,负责传输图像数据、控制指令和时钟信号。 4. 背光:为被动发光的LCD提供光源的组件,通常需要独立的电源驱动。 ## LCD驱动流程概述 LCD驱动流程是指主控处理器通过特定接口向LCD驱动IC发送图像数据和控制信号,最终在屏幕上点亮像素的过程。这个过程的核心在于接口协议的时序交互,确保数据能够被驱动IC准确接收并锁存。 ### LCD的驱动流程详细步骤 1. 初始化:主控处理器向LCD驱动IC发送一系列指令,配置其工作模式,如颜色深度、扫描方向等。 2. 帧数据传输:主控处理器将帧缓存中的图像数据通过数据线发送,驱动IC接收数据并将其存储到内部的GRAM中。 3. 行/像素驱动:驱动IC将GRAM中的数据按行取出,并转换为对应的模拟电压,施加到相应的行和列电极上,控制每个像素的透光率。 4. 图像刷新:当一帧图像完全显示后,驱动IC等待下一帧数据的到来。对于动态画面,此过程以固定的刷新率循环进行。 ## LCD驱动常用接口模式 ### SPI接口 SPI接口是驱动中小型LCD屏的常用串行接口,以其线路简单、协议成熟而广泛应用。根据数据线方向可分为I型(双向)和II型(独立输入输出)。 | **SPI 模式** | **数据线配置** | **关键特征** | | --- | --- | --- | | 3-Line SPI I | SCLK, CS, SDA(双向) | 最省引脚,D/CX信号通过指令模拟 | | 4-Line SPI I | SCLK, CS, SDA(双向), D/CX | 最常用,有独立D/CX线,协议直观 | | 3-Line SPI II | SCLK, CS, SDA(输入), SDO(输出) | 数据线独立,支持读状态和更高时钟 | | 4-Line SPI II | SCLK, CS, SDA(输入), SDO(输出), D/CX | 全功能SPI,兼具独立数据线和D/CX | | 2 Data Lane SPI | SCLK, CS, D/CX, SDA0, SDA1 | 双数据线并行,传输速率翻倍 | #### 3-Line SPI I (双向数据线) - 线路配置:SCLK(时钟)、CS(片选)、SDA(双向数据线) - 工作原理:通过单一的SDA线进行双向数据传输。命令/数据选择(D/CX)通过发送特定的指令字节来模拟,而非使用独立的物理引脚。 - 应用场景:最节省引脚的模式,适合对成本极其敏感、MCU引脚资源非常紧张的应用。 #### 4-Line SPI I(双向数据线) - 线路配置:SCLK、CS、SDA(双向数据线)、D/CX(命令/数据选择) - 工作原理:使用独立的D/CX引脚来直接区分当前传输的是命令(低电平)还是数据(高电平),协议简单直观,无需模拟。 - 应用场景:最常用、最标准的SPI LCD驱动方式,在引脚资源和使用便利性间取得良好平衡。 #### 3-Line SPI II(独立输入输出) - 线路配置:SCLK、CS、SDA(数据输入)、SDO(数据输出) - 工作原理:数据输入和输出分离,支持全双工通信。命令/数据选择仍需要通过指令模拟。 - 应用场景:需要读取LCD状态寄存器或显存数据的应用,由于输入输出隔离,可支持更高的通信时钟频率。 #### 4-Line SPI II (独立输入输出) - 线路配置:SCLK、CS、SDA(数据输入)、SDO(数据输出)、D/CX - 工作原理:结合了独立数据线和独立D/CX信号的双重优势,既能高速读写,又具有清晰简单的协议。 - 应用场景:高性能SPI应用,需要频繁读取显示状态或进行高速双向通信的场合。 #### 2 Data Lane SPI (双数据线SPI) - 线路配置:SCLK、CS、D/CX、SDA0、SDA1(双数据线) - 工作原理:两条数据线并行传输数据,在相同时钟频率下实现近乎双倍的数据传输率。 - 应用场景:需要较高刷新率的中分辨率屏幕,在保持SPI接口简单性的同时有效提升带宽。 #### SPI接口通用特点 - 优点:引脚占用少,协议简单,成本低廉,几乎所有MCU都原生支持。 - 缺点:传输带宽有限,通常适用于分辨率较低(如QVGA及以下)的屏幕。 - 开发要点:需仔细阅读驱动IC数据手册,正确配置接口模式。 ### MCU接口 1. 基本概念:一种面向控制的并行接口,因早期在微控制器单元中广泛应用而得名。它直接将驱动IC视为一个带显存的外设。 2. 工作原理: - 8080模式:基于Intel 8080总线时序,控制引脚包括写使能、读使能、命令/数据选择。 - 6800模式:基于Motorola 6800总线时序,使用使能信号和读写信号进行控制。 - 数据传输:通过8位、16位或18位的并行数据总线进行。 3. 优点: - 接口简单,易于在低端MCU上实现。 - 无需专用视频控制器,成本低。 - 在显示静态图像时功耗较低。 4. 缺点: - 并行总线占用IO口多。 - 传输速率有限,通常用于中小尺寸分辨率较低的屏幕。 ### RGB接口 1. 基本概念:一种直接传输像素数据的并行接口。它模拟了显示器标准的信号时序,将每个像素的RGB数据、行场同步信号和时钟直接送给驱动IC。 2. 工作原理: - 主控端通常需要专用的LCD控制器。 - 数据线包括:RGB各6/8位数据线、像素时钟、行同步、场同步。 - 数据在像素时钟的驱动下连续传输,无需等待应答。 3. 优点: - 传输速率高,支持大尺寸和高分辨率的屏幕。 - 显示动态画面流畅,CPU负担小。 4. 缺点: - 需要大量的数据线,布线复杂。 - 对时序要求严格。 ### MIPI DSI接口 1. 基本概念:由MIPI联盟制定的串行显示接口。它采用差分信号传输,将数据和时钟打包成数据包进行高速串行通信。 2. 工作原理: - 采用1对时钟线和1~4对数据线。 - 传输的数据是打包后的指令和视频流数据包。 - 支持高速模式和低功耗模式,在不需要刷新显示时可以切换到低功耗模式以节省电量。 3. 优点: - 线数少,布线简单,抗干扰能力强。 - 传输速率极高,支持超高分辨率和高刷新率。 - 功耗控制优秀。 4. 缺点: - 协议复杂,开发调试难度较大。 - 通常需要主控芯片原生支持。 ## 接口选择与应用场景说明 1. SPI 接口:适用于引脚资源紧张、显示内容相对简单且屏幕尺寸较小的设备,如智能手表、小型物联网设备显示屏、便携式仪表的单色或低色彩深度屏幕。 2. MCU接口:适用于计算能力有限、显示内容相对简单的嵌入式设备,如智能家居面板、工业仪表盘等。 3. RGB接口:适用于需要显示丰富动态内容、但对成本和功耗不是极度敏感的设备,如中高端工业HMI、车载显示屏等。 4. MIPI DSI接口:是现代移动设备(智能手机、平板电脑)和高性能嵌入式设备的主流选择,追求高分辨率、高刷新率、低功耗和紧凑的物理设计。 # API说明 ## 头文件 *qosa_lcd.h* ## LCD 函数列表 | **函数** | **描述** | | --- | --- | | *qosa_lcd_init()* | 初始化LCD控制器 | | *qosa_lcd_deinit()* | 反初始化LCD控制器 | | *qosa_lcd_clear_screen()* | 清除LCD屏幕 | | *qosa_lcd_display_on()* | 开启LCD显示 | | *qosa_lcd_display_off()* | 关闭LCD显示 | | *qosa_lcd_write_cmd()* | 向LCD发送配置命令 | | *qosa_lcd_write_cmd_data()* | 向LCD发送数据 | | *qosa_lcd_flush_cmd()* | 刷新所有缓存的命令和命令数据 | | *qosa_lcd_read_cmd_data()* | LCD控制器读取LCD配置 | | *qosa_lcd_write()* | 向LCD指定位置发送图片数据 | | *qosa_lcd_ioctl()* | LCD控制接口 | ## 函数定义 ### LCD基础控制 #### qosa_lcd_init ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_init(qosa_lcd_channel_e lcd_no) ``` ##### 功能描述 初始化指定通道的LCD控制器,配置相关硬件参数和驱动设置 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 在调用其他LCD函数之前必须先调用此函数进行初始化 2. 重复初始化同一通道会返回 `QOSA_LCD_INIT_REPEAT_ERR` 错误 3. 初始化过程会配置GPIO、SPI等硬件外设,请确保相关引脚未被其他功能占用 ``` #### qosa_lcd_deinit ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_deinit(qosa_lcd_channel_e lcd_no) ``` ##### 功能描述 反初始化LCD控制器,释放相关资源 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 反初始化后需要重新初始化才能再次使用LCD功能 2. 建议在系统关机或进入低功耗模式前调用此函数 3. 反初始化会关闭显示并释放内存资源 ``` #### qosa_lcd_ioctl ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_ioctl(qosa_lcd_channel_e lcd_no, qosa_lcd_ioctl_cmd_e cmd, void *arg) ``` ##### 功能描述 LCD控制接口,用于执行各种控制命令 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | | cmd | `qosa_lcd_ioctl_cmd_e` | 是 | 参考 `qosa_lcd_ioctl_cmd_e` 枚举 | 对应的控制命令 | | arg | void * | 是 | 无 | 对应的控制命令参数 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 不同的命令需要不同类型的参数,请参考枚举体说明 ``` ### 显示控制 #### qosa_lcd_clear_screen ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_clear_screen(qosa_lcd_channel_e lcd_no, qosa_uint16_t color) ``` ##### 功能描述 使用指定颜色清除整个LCD屏幕 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | | color | qosa_uint16_t | 是 | 0x0000~0xffff | 需要填充的颜色值(RGB565格式) | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 颜色值应符合当前设置的输出格式(默认为RGB565) 2. 该操作会覆盖屏幕上所有现有内容 3. 在显示动态内容前建议先清屏以避免残影 ``` #### qosa_lcd_display_on ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_display_on(qosa_lcd_channel_e lcd_no) ``` ##### 功能描述 开启LCD显示,使屏幕内容可见 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 与 `qosa_lcd_display_off` 配合使用可实现低功耗控制 ``` #### qosa_lcd_display_off ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_display_off(qosa_lcd_channel_e lcd_no) ``` ##### 功能描述 关闭LCD显示,屏幕内容不可见 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 关闭显示可显著降低系统功耗 2. 重新开启显示后,原有显示内容保持不变 ``` #### qosa_lcd_write ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_write(qosa_lcd_channel_e lcd_no, qosa_uint8_t *buffer, qosa_uint16_t start_x, qosa_uint16_t start_y, qosa_uint16_t end_x, qosa_uint16_t end_y) ``` ##### 功能描述 向LCD指定矩形区域发送图片数据 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | | buffer | qosa_uint8_t * | 是 | 无 | 需要发送的数据地址 | | start_x | qosa_uint16_t | 是 | 0~屏幕最大宽度 | 起始X坐标 | | start_y | qosa_uint16_t | 是 | 0~屏幕最大高度 | 起始Y坐标 | | end_x | qosa_uint16_t | 是 | 0~屏幕最大宽度 | 结束X坐标 | | end_y | qosa_uint16_t | 是 | 0~屏幕最大高度 | 结束Y坐标 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 坐标范围必须在LCD分辨率范围内:0 ≤ `start_x` ≤ `end_x` < `lcd_width`,0 ≤ `start_y` ≤ `end_y` < `lcd_height` 2. 数据缓冲区格式应与配置的输入格式一致 3. 大数据量传输时注意缓冲区大小,避免内存溢出 ``` ### 命令和数据操作 #### qosa_lcd_write_cmd ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_write_cmd(qosa_lcd_channel_e lcd_no, qosa_uint8_t cmd) ``` ##### 功能描述 向LCD发送配置命令 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | | cmd | qosa_uint8_t | 是 | 0x00-0xff | 需要发送的命令 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 命令值需参考具体LCD驱动IC的数据手册 2. 某些命令需要配合 `qosa_lcd_write_cmd_data` 发送参数数据 3. 在SPI模式下,命令和数据通过D/CX引脚区分 ``` #### qosa_lcd_write_cmd_data ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_write_cmd_data(qosa_lcd_channel_e lcd_no, qosa_uint8_t cmd_data) ``` ##### 功能描述 向LCD发送命令数据,配合命令使用 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | | cmd_data | qosa_uint8_t | 是 | 0x00-0xff | 需要发送的命令数据 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 通常在前一个 `qosa_lcd_write_cmd` 后调用,用于发送命令参数 2. 数据格式和长度取决于前导命令的要求 3. 多个参数数据需要多次调用此函数 ``` #### qosa_lcd_flush_cmd ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_flush_cmd(qosa_lcd_channel_e lcd_no) ``` ##### 功能描述 刷新所有缓存的命令和命令数据,确保所有操作被执行 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 在批量发送命令后调用,确保所有命令被LCD控制器执行 2. 由于LCD控制器设计不同,部分平台该函数可能无实际作用 ``` #### qosa_lcd_read_cmd_data ##### 函数原型 ```plaintext qosa_lcd_error_e qosa_lcd_read_cmd_data(qosa_lcd_channel_e lcd_no, qosa_uint8_t cmd, qosa_uint8_t *data, qosa_uint32_t length, qosa_uint32_t dummyCycleLen) ``` ##### 功能描述 LCD控制器读取LCD配置信息 ##### 参数说明 | **参数名** | **类型** | **是否必填** | **范围/单位** | **说明** | | --- | --- | --- | --- | --- | | lcd_no | `qosa_lcd_channel_e` | 是 | 参考 `qosa_lcd_channel_e` 枚举 | LCD通道号选择 | | cmd | qosa_uint8_t | 是 | 0x00~0xff | 需要读取的LCD配置地址指令 | | data | qosa_uint8_t * | 是 | 无 | 待读取数据的地址 | | length | qosa_uint32_t | 是 | 无 | 待读取数据的长度 | | dummyCycleLen | qosa_uint32_t | 是 | 无 | 命令传输后驱动程序等待的虚拟周期长度 | ##### 返回值说明 成功返回 `QOSA_LCD_SUCCESS`,失败返回其他错误码 ```{note} **注意:** 1. 需要确保LCD驱动IC支持读取操作 2. `dummyCycleLen` 参数需根据具体LCD型号设置,通常为1-2个时钟周期 3. 读取的数据格式需参考LCD驱动IC数据手册解析 ``` ## 数据结构定义 ### qosa_lcd_operations_t ```c /** * @struct qosa_lcd_operations_t * @brief LCD操作回调函数集。 */ typedef struct { void (*init)(qosa_lcd_channel_e lcd_no); /*!< LCD初始化完成后执行的函数 */ void (*deInit)(qosa_lcd_channel_e lcd_no); /*!< LCD反初始化前执行的函数 */ void (*enterSleep)(qosa_lcd_channel_e lcd_no, qosa_bool_t is_sleep); /*!< 尝试显示LCD开/关前执行的函数 */ void (*setDisplayWindow)(qosa_lcd_channel_e lcd_no,uint16_t left,uint16_t top,uint16_t right,uint16_t bottom); /*!< 尝试向LCD写入数据包前执行的函数 */ qosa_uint32_t (*readId)(qosa_lcd_channel_e lcd_no); /*!< 需要读取LCD ID时执行的函数 */ } qosa_lcd_operations_t; ``` ### qosa_lcd_reset_func_t ```cpp /** * @struct qosa_lcd_reset_func_t * @brief LCD复位功能配置。 */ typedef struct { qoes_gpio_num_e reset_gpio; /*!< 复位引脚对应的GPIO编号 */ qosa_uint32_t low_level_time; /*!< 复位引脚保持低电平的时间(毫秒) */ } qosa_lcd_reset_func_t; ``` ### qosa_lcd_spi_func_t ```cpp /** * @struct qosa_lcd_spi_func_t * @brief LCD SPI功能配置。 */ typedef struct { qosa_spi_frame_format_e frame_format; /*!< SPI时钟极性和相位配置 */ qosa_spi_bit_order_e bit_order; /*!< SPI数据传输位序 */ qosa_spi_transmit_mode_e transmit_mode; /*!< SPI传输模式 */ qosa_spi_nss_mode_e nss_mode; /*!< SPI片选信号控制方式 */ qoes_gpio_num_e nss_gpio; /*!< 标准SPI片选引脚(若nss_mode为硬件控制,此参数无效) */ qoes_gpio_num_e ds_gpio; /*!< 使用标准SPI时,需要通过软件控制的LCD数据/命令选择引脚 */ } qosa_lcd_spi_func_t; ``` ### qosa_lcd_drv_cfg_t ```cpp /** * @struct qosa_lcd_drv_cfg_t * @brief LCD驱动配置选项。 */ typedef struct { qosa_lcd_channel_e lcd_channel; /*!< LCD通道配置 */ qosa_uint8_t *lcd_name; /*!< LCD名称 */ qosa_uint32_t lcd_device_id; /*!< LCD设备ID */ qosa_uint32_t lcd_width; /*!< LCD宽度配置 */ qosa_uint32_t lcd_height; /*!< LCD高度配置 */ qosa_lcd_bus_mode_e bus_mode; /*!< LCD操作总线模式 */ qosa_lcd_input_format_opt_e lcd_input_format; /*!< LCD输入数据格式 */ qosa_lcd_output_format_opt_e lcd_output_format; /*!< LCD输出数据格式 */ qosa_lcd_operations_t *operation; /*!< LCD操作回调函数集 */ qosa_uint32_t lcd_write_frequence; /*!< LCD控制器写入频率 */ qosa_uint32_t lcd_read_frequence; /*!< LCD控制器读取频率 */ qosa_lcd_reset_func_t lcd_reset_func; /*!< LCD复位功能配置 */ qosa_lcd_spi_func_t lcd_spi_func; /*!< LCD标准SPI功能配置 */ } qosa_lcd_drv_cfg_t; ``` ## 枚举类型定义 ### qosa_lcd_error_e ```cpp /** * @enum qosa_lcd_error_e * @brief LCD错误代码定义。 */ typedef enum { QOSA_LCD_SUCCESS = 0, /*!< 操作成功 */ QOSA_LCD_EXECUTE_ERR = 1 | QOSA_LCD_ERRCODE_BASE, /*!< LCD执行错误 */ QOSA_LCD_MEM_ADDR_NULL_ERR, /*!< 内存地址为空 */ QOSA_LCD_INVALID_PARAM_ERR, /*!< 参数无效 */ QOSA_LCD_MEM_LOW_ERR, /*!< 内存不足 */ QOSA_LCD_INIT_REPEAT_ERR, /*!< LCD重复初始化 */ QOSA_LCD_INIT_ERR, /*!< LCD初始化错误 */ QOSA_LCD_NO_INIT_ERR, /*!< LCD未初始化 */ QOSA_LCD_OPTION_NOT_SUPPORT_ERR, /*!< LCD配置不支持 */ QOSA_LCD_OPTION_NOT_FIND_ERR, /*!< 未找到LCD配置 */ QOSA_LCD_INPUT_FORMAT_NOT_SUPPORT_ERROR, /*!< 输入格式不支持 */ QOSA_LCD_OUTPUT_FORMAT_NOT_SUPPORT_ERROR, /*!< 输出格式不支持 */ QOSA_LCD_SEM_CREATE_ERROR, /*!< 信号量创建失败 */ QOSA_LCD_SEM_WAIT_ERROR, /*!< 等待信号量失败 */ QOSA_LCD_MUTEX_NOT_CREATE_ERROR, /*!< 互斥锁未创建 */ } qosa_lcd_error_e; ``` ### qosa_lcd_channel_e ```cpp /** * @enum qosa_lcd_channel_e * @brief LCD通道枚举定义。 */ typedef enum { QOSA_LCD_SPECIAL_PORT = 0, /*!< LCD专用控制器 */ QOSA_LCD_SPI_PORT_0, /*!< 标准SPI端口0 */ QOSA_LCD_SPI_PORT_1, /*!< 标准SPI端口1 */ QOSA_LCD_SPI_PORT_2, /*!< 标准SPI端口2 */ QOSA_LCD_PORT_MAX, /*!< 最大端口数 */ } qosa_lcd_channel_e; ``` ### qosa_lcd_input_format_opt_e ```cpp /** * @enum qosa_lcd_input_format_opt_e * @brief 输入数据原始格式定义。 */ typedef enum { QOSA_LCD_INPUT_FORMAT_RGB565 = 0, /*!< RGB565格式输入(默认) */ QOSA_LCD_INPUT_FORMAT_RGB444, /*!< RGB444格式输入 */ QOSA_LCD_INPUT_FORMAT_RGB555, /*!< RGB555格式输入 */ QOSA_LCD_INPUT_FORMAT_RGB666, /*!< RGB666格式输入 */ QOSA_LCD_INPUT_FORMAT_RGB888, /*!< RGB888格式输入 */ QOSA_LCD_INPUT_FORMAT_GREY, /*!< 仅亮度Y分量输入 */ QOSA_LCD_INPUT_FORMAT_YUV422, /*!< YUV422格式输入 */ QOSA_LCD_INPUT_FORMAT_YUV420, /*!< YUV420格式输入 */ QOSA_LCD_INPUT_FORMAT_YUV400, /*!< YUV400格式输入 */ QOSA_LCD_INPUT_FORMAT_YUV420_3PLANE, /*!< YUV420三平面格式输入 */ QOSA_LCD_INPUT_FORMAT_MAX, /*!< 最大输入格式 */ } qosa_lcd_input_format_opt_e; ``` ### qosa_lcd_output_format_opt_e ```cpp /** * @enum qosa_lcd_output_format_opt_e * @brief 输出数据目标格式定义。 */ typedef enum { QOSA_LCD_OUTPUT_FORMAT_RGB565 = 0, /*!< RGB565格式输出(默认) */ QOSA_LCD_OUTPUT_FORMAT_RGB444, /*!< RGB444格式输出 */ QOSA_LCD_OUTPUT_FORMAT_RGB666, /*!< RGB666格式输出 */ QOSA_LCD_OUTPUT_FORMAT_RGB888, /*!< RGB888格式输出 */ QOSA_LCD_OUTPUT_FORMAT_MAX, /*!< 最大输出格式 */ } qosa_lcd_output_format_opt_e; ``` ### qosa_lcd_bus_mode_e ```cpp /** * @enum qosa_lcd_bus_mode_e * @brief LCD SPI总线模式定义。 */ typedef enum { QOSA_LCD_BUS_MODE_3_WIRE_I_SPI = 0, /*!< 3线I型SPI接口(默认) */ QOSA_LCD_BUS_MODE_3_WIRE_II_SPI, /*!< 3线II型SPI接口 */ QOSA_LCD_BUS_MODE_4_WIRE_I_SPI, /*!< 4线I型SPI接口 */ QOSA_LCD_BUS_MODE_4_WIRE_II_SPI, /*!< 4线II型SPI接口 */ QOSA_LCD_BUS_MODE_4_WIRE_II_2_DATA_SPI, /*!< 4线II型双数据SPI接口 */ QOSA_LCD_BUS_MODE_8080, /*!< 8080(MCU)并行接口 */ QOSA_LCD_BUS_MODE_MIPI, /*!< MIPI接口 */ } qosa_lcd_bus_mode_e; ``` ### qosa_lcd_ioctl_cmd_e ```cpp /** * @enum qosa_lcd_ioctl_cmd_e * @brief LCD控制命令定义。 */ typedef enum { QOSA_LCD_IOCTL_NONE, /*!< 空命令 */ QOSA_LCD_IOCTL_GET_STD_CHANNEL, /*!< 获取标准版本LCD默认通道号 - 配置值参考 @ref qosa_lcd_channel_e */ QOSA_LCD_IOCTL_SET_DRV_CFG, /*!< 设置LCD驱动配置 - 配置值参考 @ref qosa_lcd_drv_cfg_t */ QOSA_LCD_IOCTL_GET_DRV_CFG, /*!< 获取LCD驱动配置 - 配置值参考 @ref qosa_lcd_drv_cfg_t */ QOSA_LCD_IOCTL_SET_SLEEP, /*!< 控制LCD控制器进入/退出睡眠模式 - 配置值参考 @ref qosa_bool_t */ } qosa_lcd_ioctl_cmd_e; ``` # 应用示例 ## LCD完整示例Demo 请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/peripheral/lcd/lcd_demo.c