LCD屏驱动

一、LCD 概述:

LCD(Liquid Crystal Display,液晶显示器)是嵌入式系统中常用的显示设备,广泛应用于智能家居、工业控制、医疗设备、消费电子等领域。以下是 LCD 的详细介绍:

1.1 嵌入式 LCD 的基本原理

LCD 通过控制液晶分子的排列来改变光的透过率,从而显示图像或文字。其核心组成部分包括:

  • 液晶层:通过电场控制液晶分子的排列
  • 背光模块:提供光源(如 LED 背光)
  • 驱动电路:控制液晶分子的电场和像素的显示
  • 控制芯片:负责处理图像数据并发送给驱动电路

1.2 接口类型

  • SPI(串行接口,适合低引脚数场景)。

支持的IC:st7796,st7789,st7735,st7735v,st7735s,gc9a01,gc9106l,gc9306x,ili9486

  • QSPI Air8000 支持QSPI LCD 屏幕,最高支持720*720

支持的IC:co5300,sh8601z

1.3 硬件连接示例(SPI 模式)

二、演示功能概述

本例程将使用 Air8000 的 LCD 功能,配合 Air8000 开发板配套的 LCD 屏幕显示内容。

三、准备硬件环境

3.1 ST7796 LCD 屏幕一个

3.2 8000 与 ST7796 LCD 屏幕 接线图如下

3.3 实物接线图

  • 核心板连接方式
  • 整机开发板连接方式

四、软件环境

在开始实践本示例之前,先筹备一下软件环境:

1. Luatools 工具

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V2014_Air8000_2.soc;参考项目使用的内核固件

3. luatos 需要的脚本和资源文件

脚本和资源文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/lcd

lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 核心板,将本篇文章中演示使用的项目文件烧录到 Air8000 核心板中。

五、使用 LCD 软硬件资料:

5.1 LCD 硬件参考资料

Air8000 支持 LCD 接口参考:LCD 参考电路和选型推荐

5.2 API 接口介绍

api 链接地址:lcd-api 地址

lcd.init(tp, args, spi_dev, init_in_service)

lcd 显示屏初始化

参数

返回值

例子

lcd.init("st7796", {
    port = port,
    pin_dc = pin_dc,
    pin_pwr = bl,
    pin_rst = pin_reset,
    direction = 0,
    -- direction0 = 0x00,
    w = 320,
    h = 480,
    xoffset = 0,
    yoffset = 0,
    sleepcmd = 0x10,
    wakecmd = 0x11,
})

lcd.clear(color)

lcd 清屏

参数

返回值

例子

-- lcd清屏lcd.clear()

lcd.drawLine(x0,y0,x1,y1,color)

在两点之间画一条线.

参数

返回值

例子

lcd.drawLine(100, 240, 240, 240, 0x001F)

lcd.drawRectangle(x0,y0,x1,y1,color)

从 x / y 位置(左上边缘)开始绘制一个框

参数

返回值

例子

lcd.drawRectangle(100, 240, 240, 70, 0xF800)

lcd.drawCircle(x0,y0,r,color)

从 x / y 位置(圆心)开始绘制一个圆

参数

返回值

例子

lcd.drawCircle(150, 240, 100, 0x0CE0)

lcd.setFont(font, indentation)

设置字体

参数

返回值

例子

-- 显示之前先设置为中文字体,对之后的drawStr有效
lcd.setFont(lcd.font_opposansm32)
lcd.drawStr(60,240,"hello hezhou") --显示字符
sys.wait(2000)
lcd.setFont(lcd.font_opposansm16_chinese) -- 具体取值可参考api文档的常量表
lcd.drawStr(120,240,"你好合宙")

lcd.drawStr(x,y,str,fg_color)

显示字符串

参数

返回值

例子

-- 显示之前先设置为中文字体,对之后的drawStr有效
lcd.setFont(lcd.font_opposansm32)
lcd.drawStr(60,240,"hello hezhou") --显示字符
sys.wait(2000)
lcd.setFont(lcd.font_opposansm16_chinese) -- 具体取值可参考api文档的常量表,需云编译支持中文大小的固件
lcd.drawStr(60,240,"你好合宙")

lcd.showImage(x, y, file)

显示图片,当前只支持 jpg,jpeg

参数

返回值

例子

lcd.showImage(0,0,"/luadb/logo.jpg")

lcd.flush()

主动刷新数据到界面, 仅设置 buff 且禁用自动属性后使用

参数

返回值

例子

-- 本API与 lcd.setupBuff lcd.autoFlush 配合使用lcd.flush()

lcd.setupBuff(conf, onheap)

设置显示缓冲区, 所需内存大小为 2× 宽 × 高 字节. 请衡量内存需求与业务所需的刷新频次.

参数

返回值

例子

-- 初始化lcd的buff缓冲区, 可理解为FrameBuffer区域.lcd.setupBuff()

lcd.autoFlush(enable)

设置自动刷新, 需配合 lcd.setupBuff 使用

参数

返回值

例子

-- 设置buff 并禁用自动更新lcd.setupBuff()lcd.autoFlush(false)-- 禁止自动更新后, 需要使用 lcd.flush() 主动刷新数据到屏幕

六、代码示例介绍

6.1 代码介绍

6.1.1 main.lua
PROJECT = "lcddemo"
VERSION = "1.0.0"

log.info("main", PROJECT, VERSION)

taskName = "lcd"
local airlcd = require "airlcd"


show_picture = "/luadb/picture.jpg"

local function lcd_setup()
    sys.wait(500)
    gpio.setup(141, 1, gpio.PULLUP)              -- 如果是整机开发板则需要GPIO141打开给lcd电源供电,如果是核心板,可以自行选择供电管脚,或者直接选择vdd_ext管脚
    sys.wait(1000)
    airlcd.lcd_init("AirLCD_1000")
end


local function lcd_task()
    lcd_setup()                     -- 初始化LCD
    lcd.setupBuff(nil, true)        -- 设置缓冲区大小,使用系统内存
    lcd.autoFlush(false)            -- 自动刷新LCD
    while 1 do
        lcd.clear()
        log.info("合宙 Air8000 LCD演示")
        -- API 文档 https://wiki.luatos.com/api/lcd.html
        if io.exists(show_picture) ~= true then
            log.info("picture.jpg 不存在,请检查下载的文件")
            sys.wait(100)
            return
        end

        -- 注意, jpg需要是常规格式, 不能是渐进式JPG
        -- 如果无法解码, 可以用画图工具另存为,新文件就能解码了
        lcd.showImage(0, 0, show_picture)
        sys.wait(100)

        -- log.info("lcd.drawLine", lcd.drawLine(100, 240, 240, 240, 0x001F)) -- 画线
        -- log.info("lcd.drawRectangle", lcd.drawRectangle(100, 240, 240, 70, 0xF800)) -- 画框
        -- log.info("lcd.drawCircle", lcd.drawCircle(150, 240, 100, 0x0CE0)) -- 画圆

        -- lcd.setFont(lcd.font_opposansm32)
        -- lcd.drawStr(60,240,"hello hezhou") --显示字符
        lcd.flush()
        sys.wait(1000)
    end
end


sysplus.taskInitEx(lcd_task, taskName)




-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
6.1.2 airlcd.lua
local airLCD = {}

function airLCD.lcd_init(sn)
    if sn == "AirLCD_1000" then
        width = 320
        height = 480
        lcd_ic = "st7796"
    elseif sn == "AirLCD_1001" then
        width = 320
        height = 480
        lcd_ic = "st7796"
    elseif  sn == "AirLCD_1002" then
        width = 480
        height = 480
        lcd_ic = "R395435T01"
    else
        log.info("lcd", "没有找到合适的LCD")
    end

    lcd_param = {
        port = lcd.HWID_0,                 -- 使用的spi id 号
        pin_dc = 0xff,            -- 命令选择硬件,不设置
        pin_pwr = 9,           -- 背光控制管脚,默认打开背光,不设置
        pin_rst = 2,             -- 屏幕reset 管脚
        direction = 0,            -- 屏幕方向
        -- direction0 = 0x00,
        w = width,                -- 屏幕宽度
        h = height,               -- 屏幕高度
        xoffset = 0,              -- X轴偏移像素
        yoffset = 0,              -- Y轴偏移像素
        sleepcmd = 0x10,          -- LCD睡眠命令
        wakecmd = 0x11,           -- LCD唤醒命令

    }


    lcd.init(lcd_ic, lcd_param)     -- 初始化LCD 参数
end



return airLCD

6.2 结果演示

1.使用 Air8000 开发板 + 分辨率为 320*480 的 LCD 屏幕显示图片,效果如下图所示:

2.使用 Air8000 开发板 + 分辨率为 320*480 的 LCD 屏幕画线,效果如下图所示:

3.使用 Air8000 开发板 + 分辨率为 320*480 的 LCD 屏幕画框,效果如下图所示:

4.使用 Air8000 开发板 + 分辨率为 320*480 的 LCD 屏幕画圆,效果如下图所示:

5.使用 Air8000 开发板 + 分辨率为 320*480 的 LCD 屏幕中文显示,效果如下图所示:

6.使用 Air8000 开发板 + 分辨率为 320*480 的 LCD 屏幕中文显示,效果如下图所示:

6.3 烧录代码注意事项

因为烧录脚本区可用空间有限,所以烧录时仅放置自己所用照片即可

七、总结

本文演示如何在 Air8000 开发板上实现 LCD 屏幕显示图片、中英文和画线,框,圆的功能。

SPI接口LCD屏幕驱动相关资料包含多方面信息。在现代嵌入式系统里,LCD12864图形点阵显示屏作为高效、精确的显示设备,被广泛应用于工业控制、仪表显示、智能家居等领域,后续会探讨其与SPI通信协议的配合使用及驱动程序设计等内容,这为SPI接口LCD屏幕驱动提供了应用背景与研究方向[^1]。 对于SPI驱动程序的编写与实现,涉及SPI驱动框架的组成等基本结构内容,这是驱动LCD屏幕的基础,在实际开发中编写驱动程序时需参考这部分内容来构建合理的驱动框架[^2]。 以Renesas MCU之SCI_SPI接口驱动LCD为例,给出了各引脚的功能说明,如6SDI(MOSI)是SPI总线写数据信号(SD卡和液晶屏共用),7SCK是SPI总线时钟信号(SD卡和液晶屏共用)等,这些引脚信息对于硬件连接和驱动程序中对引脚的操作至关重要[^3]。 使用模拟SPI接口驱动串行接口LCD(STM32F4)的代码示例展示了头文件里对MOSI、SCK和MISO的电平状态的定义,还声明了SPI_WriteByte、SPI_ReadByte等函数,这为具体的驱动程序实现提供了代码层面的参考,可帮助开发者理解如何通过代码控制SPI接口LCD屏幕进行通信[^4]。 以下是一个简单的代码片段示例(来自引用[4]的部分代码): ```c #ifndef __LCD_SPI_H #define __LCD_SPI_H #include <stdlib.h> #include <stdio.h> #include "main.h" // spi port io // set IO to high #define SPI_SCLK_SET HAL_GPIO_WritePin(lcd_sck_GPIO_Port,lcd_sck_Pin, GPIO_PIN_SET ) #define SPI_MOSI_SET HAL_GPIO_WritePin(lcd_mosi_GPIO_Port,lcd_mosi_Pin, GPIO_PIN_SET ) // set IO to low #define SPI_SCLK_CLR HAL_GPIO_WritePin(lcd_sck_GPIO_Port,lcd_sck_Pin, GPIO_PIN_RESET ) #define SPI_MOSI_CLR HAL_GPIO_WritePin(lcd_mosi_GPIO_Port,lcd_mosi_Pin, GPIO_PIN_RESET ) #define SPI_MISO_READ ((HAL_GPIO_ReadPin(lcd_miso_GPIO_Port, lcd_miso_Pin) == GPIO_PIN_SET)?1:0) void SPI_WriteByte(uint8_t Byte); uint8_t SPI_ReadByte(void); void lcd_delay_us(uint32_t us); #endif /* __LCD_SPI_H */ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值