跳转至

41 lcdseg-段式LCD驱动

一、概述

lcdseg 是 LuatOS 内核里的段式 LCD(段码屏)驱动库,走芯片内置的 LCD 控制器,不需要外部驱动芯片,直接由 COM/SEG 引脚驱动玻璃。适合电表、水表、温控器这类低功耗段码显示场景。

lcdseg 库主要功能:

1、初始化:配置偏置(bias)、占空比(duty)、驱动电压(vlcd)、COM 数量、刷新率;

2、使能:enable() 打开库功能,power() 打开段码输出;

3、按段控制:seg_set(com, seg, en) 精确点亮/熄灭某一个段。

注意事项:

1、编译开关是 LUAT_USE_LCDSEG,源码头部明确写了「本库当前没有任何主推模组是支持的」,也就是说要用它得先确认目标芯片有 LCD 控制器,并自行编译固件;

2、段码屏的点亮关系由玻璃的真值表决定,seg_set 的 com/seg 组合必须对着屏的真值表填,写错就是显示乱码而不是不亮;

3、vlcd 单位是 100mV,不是 V。

二、核心示例

-- 注意:需芯片带 LCD 控制器且固件打开 LUAT_USE_LCDSEG
-- 参数含义:1/3 bias、1/4 duty、3.3V、4 个 COM、60Hz 刷新
if lcdseg.setup(lcdseg.BIAS_ONETHIRD, lcdseg.DUTY_ONEFOURTH, 33, 4, 60) then
    lcdseg.enable(1)      -- 启用库功能
    lcdseg.power(1)       -- 打开段码输出,屏上才会真的有波形

    -- 按真值表点亮指定的段:COM0 的第 1 位、COM2 的第 0 位、COM3 的第 31 位
    lcdseg.seg_set(0, 1, 1)
    lcdseg.seg_set(2, 0, 1)
    lcdseg.seg_set(3, 31, 1)
else
    log.info("lcdseg", "setup fail")
end

要关掉某一段就把最后一个参数改成 0;整屏熄灭可以 lcdseg.power(0),功耗比逐段清零更低。

三、常量详解

3.1 偏置电压(bias)

常量 数值 含义
lcdseg.BIAS_STATIC 0 无偏置(静态驱动)
lcdseg.BIAS_ONEHALF 2 1/2 偏置
lcdseg.BIAS_ONETHIRD 3 1/3 偏置(最常用)
lcdseg.BIAS_ONEFOURTH 4 1/4 偏置

数值直接从 2 开始,没有 1;bias 与 duty 必须配对(一般 1/3 bias 配 1/4 duty、1/2 bias 配 1/2 duty 或静态),配错会出现「该亮的段发灰、不该亮的段微亮」的串影。

3.2 占空比(duty)

常量 数值 含义
lcdseg.DUTY_STATIC 0 静态,100% 占空比
lcdseg.DUTY_ONEHALF 2 1/2 占空比
lcdseg.DUTY_ONETHIRD 3 1/3 占空比
lcdseg.DUTY_ONEFOURTH 4 1/4 占空比
lcdseg.DUTY_ONEFIFTH 5 1/5 占空比
lcdseg.DUTY_ONESIXTH 6 1/6 占空比
lcdseg.DUTY_ONESEVENTH 7 1/7 占空比
lcdseg.DUTY_ONEEIGHTH 8 1/8 占空比

duty 决定用几个 COM:1/4 duty 就是 4 个 COM 分时扫描,com_number 要和它一致。

四、函数详解

4.1 lcdseg.setup(bias, duty, vlcd, com_number, fresh_rate, com_mark, seg_mark)

功能

初始化段式 LCD 控制器,配置偏置、占空比、驱动电压、COM 数量、刷新率,以及 COM/SEG 的启用掩码。

参数

bias

参数含义:偏置电压
数据类型:number
取值范围:lcdseg.BIAS_STATIC / ONEHALF / ONETHIRD / ONEFOURTH
是否必选:是
注意事项:按屏规格书选,常见 1/3 bias。

duty

参数含义:占空比
数据类型:number
取值范围:lcdseg.DUTY_STATIC ~ DUTY_ONEEIGHTH
是否必选:是
注意事项:要和 com_number 对得上,1/4 duty 配 4 个 COM。

vlcd

参数含义:LCD 驱动电压
数据类型:number
取值范围:单位 100mV,例如 2.7V 写 27、3.3V 写 33
是否必选:是
注意事项:按屏规格书的推荐值给,给太高会加快液晶老化、对比度过大;给低了对比度不足。

com_number

参数含义:COM 引脚数量
数据类型:number
取值范围:取决于具体芯片与屏
是否必选:是
注意事项:必须与实际接出的 COM 数一致。

fresh_rate

参数含义:刷新率
数据类型:number
取值范围:通常 60,单位 Hz
是否必选:是
注意事项:不能太低(低于 30Hz 会闪),也不能太高(功耗上升且可能超出控制器能力)。

com_mark

参数含义:COM 启用掩码
数据类型:number
取值范围:默认 0xFF(全部启用);只启用 COM0/COM1 写 0x03
是否必选:否
注意事项:掩码位与 COM 序号一一对应,屏蔽掉的 COM 不再输出波形。

seg_mark

参数含义:SEG 启用掩码
数据类型:number
取值范围:默认 0xFFFFFFFF(全部启用);只启用前 16 个写 0xFFFF
是否必选:否
注意事项:用不到的 SEG 屏蔽掉可以降低功耗与干扰。

返回值

bool:成功返回 true,失败返回 false。

示例

-- 1/3 bias、1/4 duty、3.3V、4 个 COM、60Hz,只启用前 2 个 COM
lcdseg.setup(lcdseg.BIAS_ONETHIRD, lcdseg.DUTY_ONEFOURTH, 33, 4, 60, 0x03)

注意事项

  1. setup 只做配置,屏上不会立刻有显示,还要 enable(1) 再 power(1);

  2. 参数顺序不要和 ht1621.setup 混淆,两者是完全不同的驱动方式(ht1621 走 SPI 类三线,lcdseg 走芯片内置 LCD 控制器)。

4.2 lcdseg.enable(en)

功能

启用或禁用 lcdseg 库功能(控制器层面的开与关)。

参数

en

参数含义:启用标志
数据类型:number
取值范围:1 启用,0 禁用
是否必选:是
注意事项:与 power() 分工不同,enable 管功能,power 管输出。

返回值

bool:成功返回 true,失败返回 false。

示例

lcdseg.enable(1)

4.3 lcdseg.power(en)

功能

启用或禁用段码输出。关掉后屏上内容会消失,但配置与段状态保留,重新打开即可恢复。

参数

en

参数含义:输出开关
数据类型:number
取值范围:1 启用,0 禁用
是否必选:是
注意事项:低功耗场景可以在不显示时 power(0),比逐段清零更省电。

返回值

bool:成功返回 true,失败返回 false。

示例

lcdseg.power(1)   -- 打开显示
sys.wait(3000)
lcdseg.power(0)   -- 3 秒后熄灭

4.4 lcdseg.seg_set(com, seg, en)

功能

设置某一个段的状态(点亮或熄灭)。

参数

com

参数含义:COM 号
数据类型:number
取值范围:0 ~ com_number-1
是否必选:是
注意事项:从 0 开始编号。

seg

参数含义:段号,即该 COM 下要修改的位的索引
数据类型:number
取值范围:0 ~ (每 COM 的 SEG 数 - 1)
是否必选:是
注意事项:具体哪一位对应屏上的哪一段,必须查屏的真值表,不能凭感觉试。

en

参数含义:点亮标志
数据类型:number
取值范围:1 点亮,0 熄灭
是否必选:是
注意事项:只改这一位,不影响同 COM 下的其它段。

返回值

bool:成功返回 true,失败返回 false。

示例

-- 点亮 COM0 的第 1 段,熄灭 COM2 的第 0 段
lcdseg.seg_set(0, 1, 1)
lcdseg.seg_set(2, 0, 0)

注意事项

  1. 段码屏没有「写字符串」的接口,数字、图标都要自己按真值表把段组合算出来,再逐段 seg_set;

  2. 刷一整屏时逐段调用会产生多次底层写,建议把需要变化的段集中处理,或者自己维护一份段状态表做差量更新。

五、产品支持说明

lcdseg 依赖芯片内置的 LCD 控制器,编译开关 LUAT_USE_LCDSEG。源码注释明确说明当前没有任何主推模组默认支持该库,使用前需要确认目标芯片具备 LCD 控制器能力,并自行编译固件或向 FAE 确认。

固件支持列表(确认是否包含本库):

Air780EPM/Air780EHx 系列固件支持列表

Air8000 系列固件支持列表

搜索