显示器和触摸屏
概述
嵌入式设备,如智能家电、医疗设备、车载系统等,也经常使用显示器和触摸屏。这些设备通常专为特定的任务或功能设计,因此它们的显示器和触摸屏可能具有特定的用途或功能 。
显示器
显示器在嵌入式设备中的主要作用通常是提供一个界面,让用户可以看到设备的状态信息、反馈或者进行操作 。
- 状态显示:例如,洗衣机的显示器可能会显示当前洗衣程序的进度,或者微波炉的显示器可能会显示剩余的加热时间。
- 反馈信息:例如,医疗监测设备的显示器可能会显示患者的心率、血压等生命体征。
- 操作指南:例如,车载信息娱乐系统的显示器可能会显示地图、导航指南等 。
触摸屏
触摸屏在嵌入式设备中通常用作一个输入设备,让用户可以直接在屏幕上进行操作。
- 直接控制:例如,用户可以在智能家电的触摸屏上选择或调整设置,或者在车载信息娱乐系统的触摸屏上输入目的地。
- 便利的交互:对于某些嵌入式设备,如便携式医疗设备或者工业控制设备,触摸屏提供了一种方便且直观的交互方式。
- 多点操作:许多触摸屏支持多点触控,这使得用户可以使用更复杂的手势来控制设备。
总的来说,显示器和触摸屏在嵌入式设备中的主要作用和功能是提供了一种使设备易于使用和理解的用户界面。
显示器
许多应用需要把信息显示给用户,因此显示屏是很重要的一个显示设备。 QuecPython 系列模块为屏幕显示应用提供了丰富的外设支持,包含的接口类型有SPI
和 MIPI
一块屏幕通常有两个主要部分:显示基板
和 驱动 IC
。显示基板(也称显示面板)决定了显示的尺寸、分辨率、色彩等参数;驱动 IC (也称屏幕控制器)是匹配显示基板并与基板封装在一起的,它通过一定的接口对外通信并控制显示基板进行显示。
类型
现代显示器的种类非常多样化,它们用于各种不同的设备和应用,从个人计算机到商业广告屏,从手机到电视,从游戏设备到嵌入式设备等。以下是一些常见的显示器类型:
- 液晶显示器(Liquid Crystal Display,LCD):
- 工作原理:LCD 显示器使用液晶分子控制光线的通过,从而显示图像。液晶本身不发光,所以需要背光源。
- 特点:LCD 显示器体积小、功耗低、发热少,适合嵌入式系统使用。它可以根据需求进行各种尺寸和形状的定制。
- 应用:LCD 显示器广泛应用于各种嵌入式设备,如手持设备、仪器仪表、家用电器等。
- 有机发光二极管(Organic Light Emitting Diode,OLED):
- 工作原理:OLED 显示器利用有机物质发光的特性,通过施加电压使得有机物质发出光线,从而显示图像。每一个像素都可以单独发光。
- 特点:OLED 显示器具有色彩鲜明、对比度高、反应速度快的特点,且可以制造出柔性和透明的显示器。
- 应用:OLED 显示器目前主要应用于高端移动设备,如智能手机和可穿戴设备。
- 电子纸显示(E-Ink Display):
- 工作原理:电子纸通过在两个透明电极间夹层中的微胶囊改变显示颜色。每个微胶囊内含有黑色和白色粒子,通过施加电压使得黑色和白色粒子在微胶囊中的位置发生变化,从而改变显示颜色。
- 特点:电子纸的功耗极低,且具有非常好的阅读体验,尤其在光照条件下,清晰度极高。
- 应用:电子纸主要应用于电子阅读器,也逐渐被应用到各种显示标签和长时间显示的设备上。
- 微型 LED(Micro LED):
- 工作原理:微型 LED 显示器由无数微小的 LED 像素组成,每个像素可以单独发光和调整亮度。
- 特点:微型 LED 显示器色彩丰富、对比度极高、响应速度快,且功耗低、寿命长。
- 应用:目前微型 LED 主要被应用于高端的大型显示屏和电视产品,但随着技术的进步,未来可能会逐渐应用于更多的嵌入式设备中。
以上就是一些常见的嵌入式系统中的显示器类型。嵌入式系统中的显示器需求可能会根据具体的应用和性能需求有所不同,因此选择适合的显示器类型是非常重要的。
驱动框图
其主控,驱动 IC, 接口关系如下:
- 主控(MCU/CPU):这是嵌入式系统的核心部分,负责处理数据,执行代码,以及管理和控制系统的各个部分。
- 显示接口:这是主控和显示芯片之间的通信连接。常见的显示接口包括:SPI、I2C、HDMI、VGA、LVDS、MIPI DSI 等等。主控通过这些接口向显示芯片发送数据和命令。
- 显示芯片:显示芯片接收来自主控的数据和命令,然后根据这些信息驱动显示面板进行相应的显示。
- 显示基板(或显示面板):显示面板是嵌入式系统中实际显示图像的部分。它包含一系列像素,这些像素根据来自显示芯片的信号来改变其状态,从而显示出图像。
主控通过显示接口向显示芯片发送数据和命令,然后显示芯片根据这些信息驱动显示面板显示图像。这就是这些组件在一个嵌入式系统中的基本关系。
适配说明
大部分屏幕控制器可以支持多种显示接口。如 ILI9486 支持 MCU 接口(即 8080 接口)、SPI 接口、RGB 接口和 MIPI 接口。
QuecPython 目前支持接口如下:
SPI 接口
QuecPython 系列模块的 SPI 接口特点:
- SPI 时钟频率最高可达 50MHz
MIPI接口
QuecPython 系列模块的 MIPI 接口特点:
MIPI 时钟频率最高可达 100MHz
最高支持 2Lane
QuecPython 系列模组支持情况如下:
SoC | MIPI 接口 | SPI 接口 |
---|---|---|
EC200U_XXX | √ | √ |
EC600U_XXX | √ | √ |
EC600N_XXX | × | √ |
EC800N_XXX | × | √ |
EC600M_XXX | × | √ |
EC800M_XXX | × | √ |
EC800G_XXX | × | √ |
EC810M_XXX | × | √ |
EG912N_XXX | × | √ |
EG912U_XXX | √ | √ |
EG915N_XXX | × | √ |
EG915U_XXX | √ | √ |
已适配的屏幕控制器型号如下表所示:
控制器型号 | 类型 | 接口 | 分辨率 | 驱动 | 数据手册 |
---|---|---|---|---|---|
ILI9225 | Color | SPI | 176*220 | ILI9225.py | ILI9225.pdf |
ILI9341 | Color | SPI | 240*320 | ILI9341.py | ILI9341.pdf |
ILI9806 | Color | MIPI | 480*800 | ILI9806.py | ILI9806.pdf |
ST7735 | Color | SPI | 128*160 | ST7735.py | ST7735.pdf |
ST7789 | Color | SPI | 240*320 | ST7789.py | ST7789.pdf |
ST7701 | Color | MIPI | 480*854 | ST7701.py | ST7701.pdf |
JD9365 | Color | MIPI | 800*1280 | JD9365.py | JD9365.pdf |
SC7705 | Color | MIPI | 800*1280 | SC7705.py | SC7705.pdf |
SSD1306 | Mono | SPI | 128*64 | SSD1306.py | SSD1306.pdf |
UC1628 | Mono | SPI | 128*64 | UC1628.py | UC1628.pdf |
说明:使用 lcd 方法时,只要参数传输正确,理论是支持任意 SPI或MIPI 屏幕的。
驱动结构
QuecPython 为了更自由的控制屏幕,python 脚本可以通过 lcd.lcd_init 传入的参数驱动屏幕。
在设计上,每驱动一款屏幕差异点仅仅为脚本 lcd.lcd_init 或 lcd.mipi_init 中的参数不一样而已。
屏幕的分类
对屏幕进行分类的讨论将有助于我们对驱动的理解,这里将按照屏幕可显示的色彩来分类,而非 OLED、LCD 等屏幕的面板材料。 一般情况下,屏幕显示的色彩决定了 BPP (Bits Per Pixel),而 BPP 的不同导致程序的处理方式有一些不同,下面将更直观地列举几种 GRAM 映射到像素点的方式:
BPP = 16 GRAM 结构
BPP = 1 GRAM 结构
BPP = 4 GRAM 结构
从以上图中可以看出,映射方式大概可以分为两类:
- BBP >= 8,通常是支持 RGB888、RGB666、RGB565 等编码的彩色屏幕。
- BPP < 8,通常是单色的屏幕,可能是黑白的,也可能是灰阶的。
BPP < 8 时,一个字节映射到了多个像素,因此无法直接地控制单个像素。而 QuecPython 为了更好的控制单色屏幕这种情况,lcd_write 接口依旧传入 RGB565 数据,底层将自动完成转换,这样 python 脚本能达到访问单个像素的目的。BPP >= 8 时,则可以轻松地访问单个像素。
注意:对于彩色屏幕,驱动仅支持 RGB565 颜色编码。
屏幕控制器驱动
该部分将根据不同的屏幕控制器分别实现显示等功能 。
显示方向
这里设置的屏幕显示方向是完全由屏幕硬件实现的,这个功能在不同的屏幕控制器上会有差异。一共有 8 种可能的显示方向, 显示器可以旋转 0°、90°、180° 或 270°,也可以从顶部或底部查看,默认方向为 0° 和顶部查看。 这 8 (4 × 2) 个不同的显示方向也可以表示为 3 个二进制开关的组合:X-mirroring、Y-mirroring 和 X/Y swapping。
下表将列出全部 8 种组合显示的方向。如果显示方向不正常,请查看下表中的配置开关使其正常工作。
L2R_U2D | Y-mirroring [L2R_D2U] |
||
---|---|---|---|
X_mirroring [R2L_U2D] |
X-mirroring Y-mirroring [R2L_D2U] |
||
X/Y swapping [U2D_L2R] |
X/Y swapping Y-mirroring [D2U_L2R] |
||
X/Y swapping X-mirroring [U2D_R2L] |
X/Y swapping X-mirroring Y-mirroring [D2U_R2L] |
对于不同屏幕控制器,屏幕显示方向的实现并不完全相同,通常分为以下的情况:
- 对于彩色屏幕,支持 8 个方向的旋转。
- 对于单色屏幕,如 SSD1306 等屏幕来说,只支持前 4 个方向,即不支持交换 XY 轴。
注解:
显示方向还和使用的屏幕面板有关系,你可能会发现两种异常的情况:
显示方向设置为 L2R_U2D,屏幕却不是按照上表中对应的显示方向。这可能是因为屏幕面板上的走线对 X/Y 方向上进行了镜像,这时应该根据实际情况调整旋转以得到期望的显示方向。
旋转了屏幕后,显示内容不见了。这可能是因为屏幕面板的分辨率小于屏幕控制器的分辨率,导致旋转后显示区域没有完全落在屏幕面板上,这时应考虑设置正确的显示区域偏移。
常见屏幕参数解析
屏幕驱动 IC 包含多种寄存器,它们控制着各种功能和设定。以下是一些你可能需要关注的寄存器参数:
模式寄存器:这些寄存器通常控制显示模式(如分辨率、颜色深度等)和电源管理模式。例如,一些屏幕驱动 IC 可能有专门的寄存器用于切换睡眠模式或正常模式。
控制寄存器:控制寄存器用于配置屏幕驱动 IC 的各种功能,如屏幕旋转、翻转、反色等。
定时寄存器:这些寄存器用于控制像素时钟、水平同步和垂直同步信号的定时。
Gamma 寄存器:Gamma 寄存器用于设置屏幕的 gamma 校正。这对于图像质量和颜色准确性非常重要。
RAM 寄存器:RAM 寄存器是用来存储帧缓冲区数据的。驱动 IC 会从这些寄存器读取数据,然后把数据发送到屏幕。
状态寄存器:状态寄存器可以让你读取 IC 的当前状态,比如是否在正常工作、是否有错误发生等。
亮度/对比度寄存器:一些驱动 IC 可能会有这些寄存器来调整屏幕的亮度或对比度。
偏移寄存器:这些寄存器通常用于控制图像在屏幕上的位置。
需要注意的是 ,每个屏幕驱动 IC 都有其自己的寄存器映射和功能。所以在开始使用新的驱动 IC 时,你应该阅读其数据手册来了解其寄存器的详细信息。
API 说明
详细的接口说明请参考 class LCD - LCD显示屏
注意:该部分为 QuecPython LCD 驱动的相关 API,请驱动屏幕前,详细阅读
屏幕调试
SPI LCD
SPI LCD 显示屏是使用 SPI 接口进行通信的 LCD 显示屏。这种显示屏的优点在于其接口简单,线数少,使得硬件布线更加简洁。它们非常适合用于微控制器和其他资源有限的系统。
在 SPI LCD 中,数据和命令通过 MOSI 线发送到显示器,而 SCLK 线用于同步数据传输。CS 线用于在与多个设备通信时,选择特定的设备进行通信。
在一般使用中,控制器(如微控制器)会根据显示器的规格(例如分辨率和颜色深度)以及需要显示的内容,通过 SPI 接口发送适当的命令和数据。这可能包括设置显示参数、写入像素数据等。
本章节将基于 QuecPython 开发板驱动[st7789(240*320)](TODO 链接)屏幕,介绍 SPI LCD 的调试。
前期准备工作
在实现 LCD 驱动之前,我们需要一些准备工作,该部分让我了解 QuecPython 驱动一款屏幕需要
哪些前期准备,我们需要知道 quecpython lcd 驱动 LCD 接口以及接口需要哪些参数。还需要对拿到
手的屏幕了解其 ID,驱动 IC 的类型,以及相关的命令。
注意: 原厂提供的初始化参数非常重要,后面 SPI LCD 初始化时,实际为将该参数替换成 lcd.lcd_init 所需要格式的参数。
了解QuecPython LCD接口,才能更好是利用它点亮屏幕 。
注意:目前 QuecPython SPI 驱动分为两种,LCM( Liquid Crystal Module )和通用 SPI( Serial Peripheral Interface )。两者的初始化接口有差异,具体详细可参考QuecPython LCD接口
了解 LCD.lcd_init 中的参数,对于 QuecPython 驱动 LCD 至关重要,请仔细阅读如下内容。
参数格式如下所示:
type + len + value
参数 | 含义 | 说明 |
---|---|---|
type | 类型 | 表示value的类型 0:命令 1:数据 2:延时 |
len | 数据个数 | 若 type 为命令时,len 表示后面接多少个数据 若 type 为数据时,len 表示数据的长度。注:数据可以为 1byte 也可能为 2byte 若 type 为延时,len 无实际意义。为 0 接口。 |
value | 数据 | 若 type 为命令时,value 表示命令值 若 type 为数据时,value 表示数据值。 若 type 为延时时,value 表示延时的时长,单位 ms。 |
注意:由于lcd_init传入的是字节数组,需要进行 bytearray 转换。后续初始化参数,区域写屏参数,亮屏,息屏等参数均是按照该格式进行。
举例说明:
init = (
0,1,0xXX, #命令,后接一个data, cmd 值为 0xXX
1,2,0xXX,0xXX, #数据,数据长度为2,data值为0x0100
2,0,120, #延时 120ms
0,2,0xXX, #命令,后接 2个data, cmd 值为0xXX
1,1,0xXX, #数据,命令的第一个data,data值为0xXX
1,2,0xXX,0xFF #数据,命令的第二个data,数据的长度为 2,data值为0xXXFF
…
)
初始化参数
该部分比较容易出错且非常重要,请重点关注
该部分参数主要由屏幕厂家提供的源码转换而来,而厂家提供大多数为 C 代码,下面我们将 C 代码转换为 lcd_init 所需要的参数。转换示例如下:
小技巧:在VSCode中,使用正则表达式替换原始文本,以达到快速生成lcd_init方法所需的参数。
区域写屏参数
不同的 LCD屏有不同的设置区域方式,我们将参数设置之后,用户就无需关心底层如何调用了。
一般屏幕设置有两种方式:(以 ili9225 和 st7789v 为例)
一:分两次写:高八位和低八位,此参数根据具体的屏幕去驱动而定(如 st7789v)
二:一次写一个两个字节(如 ili9225)
关于显示区域有几个重要的参数需要提交了解。
XSTART_H = 0xf0 #代表X起始坐标 高八位 (以此值写入,底层会识别该位是x坐标的高位)
XSTART_L = 0xf1 #代表X起始坐标 低八位 (以此值写入,底层会识别该位是x坐标的低位)
YSTART_H = 0xf2 #代表Y起始坐标的高八位
YSTART_L = 0xf3 #代表Y起始坐标的低八位
XEND_H = 0xE0 #代表X结束坐标的高八位
XEND_L = 0xE1 #代表X结束坐标的低八位
YEND_H = 0xE2 #代表Y结束坐标的高八位
YEND_L = 0xE3 #代表Y结束坐标的低八位
XSTART = 0xD0 #代表X的起始坐标
XEND = 0xD1 #代表X的结束坐标
YSTART = 0xD2 #代表Y的起始坐标
YEND = 0xD3 #代表Y的结束坐标
注意:该参数为定位符,用于底层 lcd.lcd_write 接口替换坐标使用
#举例如下:
#ILI9225 – 一次写两个字节
ili9225_invalid = (
0,1,0x36,
1,2,XEND,
0,1,0x37,
1,2,XSTART,
0,1,0x38,
1,2,YEND,
0,1,0x39,
1,2,YSTART,
0,1,0x20,
1,2,XSTART,
0,1,0x21,
1,2,YSTART,
0,1,0x22,
)
#st7789v - 分两次写,一次一个字节:
st7789_invalid = (
0,4,0x2a,
1,1,XSTART_H,
1,1,XSTART_L,
1,1,XEND_H,
1,1,XEND_L,
0,4,0x2b,
1,1,YSTART_H,
1,1,YSTART_L,
1,1,YEND_H,
1,1,YEND_L,
0,0,0x2c,
)
原厂提供 C 转 Python 示例如下:
亮屏息屏参数
由于每款 LCD 的亮屏命令不一样,故需要用户提供该配置参数。此参数根据具体的屏幕去驱动而定。
以 ST7789V 为例:
根据图中内容可以确认该 LCD 的亮屏息屏参数 为 29h 和 28h。退出休眠和进入休眠对应的命令为 11h 和 10h。即可确定亮屏和息屏参数(也可由屏厂提供的示例确定)。
故亮屏息屏参数如下:
lcd_displayON_data = (
0,0,0x11, #写命令0x11, 后面不接data
2,0,120, #延时120ms
0,0,0x29, #写命令0x29, 后面不接data
)
lcd_displayON_data = bytearray(lcd_displayON_data)
lcd_displayOFF_data = (
0,0,0x28, #写命令0x28, 后面不接data
2,0,120, #延时120ms
0,0,0x10, #写命令0x10, 后面不接data
)
lcd_displayOFF_data = bytearray(lcd_displayOFF_data)
脚本编写
创建对象
from machine import LCD
mipi_lcd = LCD()
SPI LCD 初始化接口介绍
请参考LCM 接口 API 和 SPI LCD 接口 API。
编写初始化参数
以前期准备中的参数,按照接口介绍中顺序,传入 lcd.lcd_init 中即可。
以 ST7789V 为例:
XSTART_H = 0xf0
XSTART_L = 0xf1
YSTART_H = 0xf2
YSTART_L = 0xf3
XEND_H = 0xE0
XEND_L = 0xE1
YEND_H = 0xE2
YEND_L = 0xE3
XSTART = 0xD0
XEND = 0xD1
YSTART = 0xD2
YEND = 0xD3
init_st7789_240X320=(
0, 0, 0x11,
2, 0, 120,
0, 0, 0x00,
0, 1, 0x36,
1, 1, 0x00,
0, 1, 0x3A,
1, 1, 0x05,
0, 1, 0x35,
1, 1, 0x00,
0, 1, 0xC7,
1, 1, 0x00,
0, 1, 0xCC,
1, 1, 0x09,
0, 5, 0xB2,
1, 1, 0x0C,
1, 1, 0x0C,
1, 1, 0x00,
1, 1, 0x33,
1, 1, 0x33,
0, 1, 0xB7,
1, 1, 0x35,
0, 1, 0xBB,
1, 1, 0x36,
0, 1, 0xC0,
1, 1, 0x2C,
0, 1, 0xC2,
1, 1, 0x01,
0, 1, 0xC3,
1, 1, 0x0D,
0, 1, 0xC4,
1, 1, 0x20,
0, 1, 0xC6,
1, 1, 0x0F,
0, 2, 0xD0,
1, 1, 0xA4,
1, 1, 0xA1,
0, 14, 0xE0,
1, 1, 0xD0,
1, 1, 0x17,
1, 1, 0x19,
1, 1, 0x04,
1, 1, 0x03,
1, 1, 0x04,
1, 1, 0x32,
1, 1, 0x41,
1, 1, 0x43,
1, 1, 0x09,
1, 1, 0x14,
1, 1, 0x12,
1, 1, 0x33,
1, 1, 0x2C,
0, 14, 0xE1,
1, 1, 0xD0,
1, 1, 0x18,
1, 1, 0x17,
1, 1, 0x04,
1, 1, 0x03,
1, 1, 0x04,
1, 1, 0x31,
1, 1, 0x46,
1, 1, 0x43,
1, 1, 0x09,
1, 1, 0x14,
1, 1, 0x13,
1, 1, 0x31,
1, 1, 0x2D,
0, 0, 0x29,
0, 1, 0x36,
1, 1, 0x00,
0, 0, 0x2c,
)
init_st7789_240X320_p = bytearray(init_st7789_240X320)
invalid_st7789_240X320 = (
0,4,0x2a,
1,1,XSTART_H,
1,1,XSTART_L,
1,1,XEND_H,
1,1,XEND_L,
0,4,0x2b,
1,1,YSTART_H,
1,1,YSTART_L,
1,1,YEND_H,
1,1,YEND_L,
0,0,0x2c,
)
invalid_st7789_240X320_p = bytearray(invalid_st7789_240X320)
displayOFF_st7789_240X320 = (
0,0,0x28,
2,0,120,
0,0,0x10,
)
displayOFF_st7789_240X320_p = bytearray(displayOFF_st7789_240X320)
displayON_st7789_240X320 = (
0,0,0x11,
2,0,20,
0,0,0x29,
)
displayON_st7789_240X320_p = bytearray(displayON_st7789_240X320)
from machine import LCD
spilcd = LCD()
spilcd.lcd_init(init_st7789_240X320_p, 240,320,52000,1,4,0,invalid_st7789_240X320_p,displayON_st7789_240X320_p,displayOFF_st7789_240X320_p,None)
效果如下:
区域写屏
该接口 十分重要,UI 就是基于该接口对屏幕进行 UI 绘制。
注意:
QuecPython 屏幕数据为大端模式。
示例如下(ST7789V):
buf = bytearray(10240) #此时buf值全为0, 颜色体现为黑色
spilcd.lcd_write(buf,110,150,130,170)
效果如下:
清屏
示例如下(ST7789V):
spilcd.lcd_clear(0xf800) #0xf800 is represented in red in RGB565
效果如下:
图片显示
注意 :该接口并非所有模组都支持,具体支持情况请咨询移远通信技术支持。
示例如下(ST7789V):
spilcd.lcd_show_jpg("usr/background1.jpeg", 0, 0)
效果如下:
MIPI LCD
MIPI 协议实际上是一系列接口的协议,包含液晶、摄像头等等。液晶中所用的 MIPI 接口,其专业名称叫 DSI,全称 Display Serial Interface。顾名思义,该接口是指用于显示模块的一个串行接口,基于 MIPI 协议而产生,兼容 DPI(显示像素接口,Display Pixel Interface)、DBI(显示总线接口,Display Bus Interface)和 DCS(显示命令集,Display Command Set)。
本章节将基于 QuecPython 铀 235 开发板驱动 ST7701S(480*854)屏幕,介绍 MIPI LCD 的调试。
由于 QuecPython 下 LCD 的相关API已经开发好,用户可以直接依照API格式,编写 MIPI 屏幕驱动。
注意: 目前 QuecPython 支持 mipi 的平台仅支持 RGB565 格式.
注意:实际使用中,LCD 多与 UI([LVGL](TODO 链接))搭配使用。
前期准备工作
确定使用的 MIPI 屏幕,咨询阅读其 datasheet 和驱动 IC 的技术手册。了解屏幕的特性,确定屏幕的初始化参数(分辨率, Lane 数等)。屏幕的初始化参数可以找屏幕原厂提供。
注意: 原厂提供的初始化参数非常重要,后面 MIPI LCD 初始化时,实际为将该参数替换成 lcd.mipi_init 所需要格式的参数。
从原厂给出的屏幕 datasheet 中可以看出其分辨率(480*854)、驱动 IC(ST7701S)、接口接口(2-LINE MIPI)、触摸 IC(GT911)和触摸接口(I2C)。
脚本编写
创建 LCD 对象
from machine import LCD
mipi_lcd = LCD()
MIPI 初始化接口介绍
lcd.mipi_init(initbuf, **kwargs)
参数 | 类型 | 说明 |
---|---|---|
initbuf | bytearray | 必传,传入 MIPI 的配置命令 |
width | int | 缺省值:480,屏幕的宽度,单位像素,示例:width=400 |
hight | int | 缺省值:854,屏幕的高度,单位像素,示例:hight=800 |
bpp | int | 缺省值:16,像素深度 |
DataLane | int | 缺省值:2,数据通道 |
MipiMode | int | 缺省值:0 模式: 0:DSI_VIDEO_MODE 1:DSI_CMD_MODE |
PixelFormat | int | 缺省值:0 像素格式: 0:RGB_PIX_FMT_RGB565 16:RGB_PIX_FMT_RGB888 32:RGB_PIX_FMT_XRGB888 48:RGB_PIX_FMT_RGBX888 |
DsiFormat | int | 缺省值:0 DSI 格式: 0:DSI_FMT_RGB565 1:DSI_FMT_RGB666 2:DSI_FMT_RGB666L 3:DSI_FMT_RGB888 |
TransMode | int | 缺省值:3 转换模式: 0:DSI_CMD 1:DSI_PULSE 2:DSI_EVENT 3:DSI_BURST |
RgbOrder | int | 缺省值:8 RGB 顺序: 0:RGB 8:BGR |
BllpEnable | bool | 缺省值:true,blank low power 模式使能 |
HSync | int | 缺省值:10,水平同步 |
HBP | int | 缺省值:10,水平后肩 |
HFP | int | 缺省值:10,水平前肩 |
VSync | int | 缺省值:4,垂直同步 |
VBP | int | 缺省值:10,垂直后肩 |
VFP | int | 缺省值:14,垂直前肩 |
FrameRate | int | 缺省值:60,帧率 |
TESel | bool | 缺省值:false,TE 选择 |
RstPolarity | int | 缺省值:1,reset 极性 |
编写初始化参数
该部分比较容易出错且非常重要,请重点关注
参数格式如下所示:
cmd + delay_ms + data_len + data_list
参数 | 含义 | 说明 |
---|---|---|
cmd | 命令 | 初始化时命令值 |
delay_ms | 延时 | 延时多久后发送命令,单位 ms |
data_len | 数据长度 | 命令后配置数据搭配的数据个数 |
data_list | 数据 | 命令后配置的实际数据,个数由 data_len 指定 |
注意:由于lcd_init传入的是字节数组,需要进行 bytearray 转换。
示例如下(st7701s):
该部分参数主要由屏幕厂家提供的源码转换而来
init_480X854 = (
0x11,0,0, #命令为0x11, 延时0ms, 命令所接参数无
0xFF,120,5,0x77,0x01,0x00,0x00,0x10, #命令为0xFF,延时120ms, 命令对应5个参数数据,分别为 #0x77,0x01,0x00,0x00,0x10
0xC0,0,2,0xE9,0x03, #命令为0xC0, 延时0ms, 命令对应2个参数数据,分别为 #0xE9,0x03
0xC1,0,2,0x11,0x02, # ... 下面依此类推
0xC2,0,2,0x31,0x08,
0xCC,0,1,0x10,
0xB0,0,16,0x00,0x0D,0x14,0x0D,0x10,0x05,0x02,0x08,0x08,0x1E,0x05,0x13,0x11,0xA3,0x29,0x18,
0xB1,0,16,0x00,0x0C,0x14,0x0C,0x10,0x05,0x03,0x08,0x07,0x20,0x05,0x13,0x11,0xA4,0x29,0x18,
0xFF,0,5,0x77,0x01,0x00,0x00,0x11,
0xB0,0,1,0x6C,
0xB1,0,1,0x43,
0xB2,0,1,0x07,
0xB3,0,1,0x80,
0xB5,0,1,0x47,
0xB7,0,1,0x85,
0xB8,0,1,0x20,
0xB9,0,1,0x10,
0xC1,0,1,0x78,
0xC2,0,1,0x78,
0xD0,0,1,0x88,
0xE0,100,3,0x00,0x00,0x02,
0xE1,0,11,0x08,0x00,0x0A,0x00,0x07,0x00,0x09,0x00,0x00,0x33,0x33,
0xE2,0,13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xE3,0,4,0x00,0x00,0x33,0x33,
0xE4,0,2,0x44,0x44,
0xE5,0,16,0x0E,0x60,0xA0,0xA0,0x10,0x60,0xA0,0xA0,0x0A,0x60,0xA0,0xA0,0x0C,0x60,0xA0,0xA0,
0xE6,0,4,0x00,0x00,0x33,0x33,
0xE7,0,2,0x44,0x44,
0xE8,0,16,0x0D,0x60,0xA0,0xA0,0x0F,0x60,0xA0,0xA0,0x09,0x60,0xA0,0xA0,0x0B,0x60,0xA0,0xA0,
0xEB,0,7,0x02,0x01,0xE4,0xE4,0x44,0x00,0x40,
0xEC,0,2,0x02,0x01,
0xED,0,16,0xAB,0x89,0x76,0x54,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x10,0x45,0x67,0x98,0xBA,
0xFF,0,5,0x77,0x01,0x00,0x00,0x00,
0x3A,0,1,0x77,
0x36,0,1,0x00,
0x35,0,1,0x00,
0x29,0,0)
from machine import LCD
mipilcd = LCD()
mipilcd.mipi_init(initbuf=bytearray(init_480X854), TransMode=1)
效果如下:
注意 :该处花屏属于正常现象,显示缓冲区中数据为随机数据,导致屏幕显示随机像素,表现即为花屏。此时清屏一下即可。
区域写屏
该接口 十分重要 ,UI 就是基于该接口对屏幕进行 UI 绘制。
注意:
QuecPython 屏幕数据为大端模式。
示例如下(st7701s):
test_buf = (
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,
)
test_buf1 = bytearray(test_buf)
mipilcd.lcd_write(test_buf1,10,10,20,20)
清屏
示例如下(st7701s):
mipilcd.lcd_clear(0xf800) #0xf800 is represented in red in RGB565
效果如下:
图片显示
注意 :该接口并非所有模组都支持,具体支持情况请参考 WIKI.
示例如下(st7701s):
mipilcd.lcd_show_jpg("usr/background.jpeg", 0, 0)
效果如下:
常见问题
花屏
初始化显示屏但未写入任何数据,显示屏可能会出现所谓的“花屏”现象,主要原因可能包括:
- 显示缓冲区的初始状态:当你初始化显示屏但未写入任何数据时,显示缓冲区可能包含随机数据,这可能导致在屏幕上显示随机的像素,即出现花屏现象。这是因为大多数系统并不会在初始化时自动清除显示缓冲区。
- 电源和信号问题:如果显示屏的电源不稳定,或者数据信号存在干扰,也可能导致花屏。这可能需要检查电源和信号线路的质量。
- 显示驱动程序或硬件问题:如果显示驱动程序存在问题,或者显示硬件有故障,也可能导致花屏。例如,驱动程序可能未正确初始化显示硬件,或者硬件存在故障。
为了解决这个问题,可以尝试在初始化显示屏后立即清除显示缓冲区,即将其所有像素设置为同一颜色(通常是黑色或白色)。这应该可以消除花屏现象。如果问题仍然存在,可能需要检查你的电源和信号线路,或者检查显示驱动程序和硬件是否存在问题。
刷新率低
LCD 刷新率低可以有多种原因,包括:
- 硬件性能限制:内存或数据总线带宽的限制。目前 QuecPython 各个模组对应的最大 SPI 频率为 50Mhz,且大多数屏幕无法适配这么大的频率,导致屏幕较大时,刷新帧率较小。
- 驱动程序或操作系统问题:驱动程序或操作系统可能没有正确配置或优化来充分利用硬件性能。例如,驱动程序可能没有正确配置显示控制器,或者操作系统可能没有正确调度图形任务。
- 显示设置问题:显示设置,如分辨率,可能过高,超出了硬件或驱动程序的性能能力。试着降低分辨率看是否可以提高刷新率。
- 显示控制器或面板问题:显示控制器或 LCD 面板本身也可能有性能限制,不能达到更高的刷新率。
- 信号干扰或质量问题:如果使用的是长数据线或信号质量差,可能会导致刷新率降低。尝试更换数据线或改善信号质量。
- 应用程序问题:运行的应用程序可能占用了大量的图形资源,导致刷新率降低。尝试关闭不需要的应用程序,或者降低应用程序的图形需求。
屏幕无法点亮
LCD 屏幕无法点亮可能有很多原因,以下列出了一些常见的可能性:
- 电源问题:LCD 屏幕需要电源供应,如果电源供应有问题,例如供电电压过高或过低,电源线接触不良,电源适配器故障,都可能导致 LCD 屏幕无法点亮。
- 接口问题:LCD 屏幕通常通过某种接口(例如 MIPI SPI 等)连接到驱动电路或者主控板。如果这些接口连接不稳定或者接口线路有问题,可能会导致 LCD 屏幕无法正常工作。驱动 MIPI 时,因为MIPI频率较高,若连接线过长或者有折痕,也可能导致 LCD 无法工作。
- 驱动问题:如果驱动程序有问题,或者主控板没有正确配置 LCD 屏幕的参数,也可能导致 LCD 屏幕无法点亮。例如分辨率、色深、帧率等参数设置不正确,或者驱动程序本身有 bug。
- 硬件故障:LCD 屏幕自身也可能出现故障,如液晶面板、背光源、驱动 IC 或者其他电子元件损坏,都可能导致 LCD 屏幕无法点亮。
- 信号问题:例如信号线损坏,或者信号质量不好(如噪声过大,信号过弱等),也可能导致 LCD 屏幕无法正常显示。
触摸屏
在嵌入式设备中,触摸屏是一种常见的输入设备,用于替代鼠标或其他指针设备,以实现对设备界面的操作和控制。它通常是一块平面表面,用户可以通过手指在其上进行触摸和滑动来实现相应的操作。
分类
以下是一些常见的触摸屏类型,以及它们的工作原理,特点和应用:
- 电阻式触摸屏:
- 工作原理:电阻式触摸屏包括两层电阻层,当触摸时,两层会在接触点产生电连接,电阻改变,通过测量电阻的改变,计算出触摸点的位置。
- 特点:成本较低,耐用性高,能应对各种环境因素(如灰尘和水)。缺点是触摸精度较低,且只能支持单点触控,透光性和色彩也不如其他类型。
- 应用:常见于低成本设备和工业设备,如 POS 系统,工业控制面板等。
- 电容式触摸屏:
- 工作原理:电容式触摸屏通过测量屏幕上的电容变化来确定触摸位置。当手指接近屏幕表面时,会引起电容的变化,从而检测到触摸事件。
- 特点:触摸精度高,支持多点触控,色彩和透光性好。缺点是成本相对较高,而且只能通过手指或特殊的触摸笔进行触摸。
- 应用:电容式触摸屏现在被广泛用于智能手机,平板电脑和笔记本电脑等个人电子设备。
- 红外触摸屏:
- 工作原理:红外触摸屏通过测量被触摸对象阻挡的红外光线来检测触摸位置。屏幕边缘装有红外发射器和接收器,当触摸事件发生,会阻挡部分红外线。
- 特点:可以支持多点触控,且可以通过任何物体进行触摸。缺点是精度不如电容式和电阻式触摸屏,且容易受到光线的干扰。
- 应用:通常应用于大型显示设备,如交互式电视,电子白板等。
- 声表面波(SAW)触摸屏:
- 工作原理:SAW 触摸屏使用超声波来检测触摸位置。当你触摸屏幕时,会吸收或扰动一部分超声波,通过测量这种变化,就可以确定触摸的位置。
- 特点:具有很高的触摸精度和优良的图像质量,但对环境变化敏感,比如温度、湿度和液体溅落等都可能影响其性能。
- 应用:常见于游戏机和一些需要高精度和高质量图像的设备。
每种类型的触摸屏都有其优点和适用的场合,选择哪种类型主要取决于具体的应用需求。
驱动框图
其主控,驱动 IC, 接口关系如下:
- 触摸屏控制器(Touch Controller):也被称为主控,它是触摸屏系统中的核心部分。它负责接收从触摸屏传感器发来的信号,并将这些信号转换成我们可以理解的坐标信息。触摸控制器可能是一个单独的 IC,也可能是一个内置在微处理器或微控制器中的模块。
- 触摸屏传感器(Touch Sensor):这是触摸屏系统中的物理部分,它可以是一个薄膜,也可以是一个玻璃面板。当我们触摸这个传感器时,它会将我们的触摸行为转换成电信号,并发送给触摸屏控制器。
- 接口(Interface):这是触摸屏控制器与其它部分(比如微处理器或微控制器)通信的方式。常见的接口类型包括 I2C、SPI 和 USB 等。
- 微处理器或微控制器(Microprocessor or Microcontroller):它处理来自触摸屏控制器的数据,并将这些数据转换为有用的指令,比如移动光标、打开应用等。
因此,这个系统的工作过程可以被简化为如下几个步骤:
触摸 -> 触摸屏传感器 -> 电信号 -> 触摸屏控制器 -> 数据 -> 接口 -> 微处理器或微控制器 -> 指令
适配说明
接口说明请参考[WIKI_Touch](TODO 链接)
QuecPython 系列模块支持情况如下:
名称 | 功能 | 接口 | 驱动 | 数据手册 |
---|---|---|---|---|
xpt2046 | 电阻触控芯片 | SPI | tm1650.py | xpt2046.pdf |
gt9xx | 电容触控芯片 | I2C | gt9xx.py | gt9xx.pdf |
cst816 | 电容触控芯片 | I2C | cst816.py | cst816.pdf |
校准触摸屏
在实际应用中,电阻触摸屏必须在使用前进行校准,而电容触摸屏则一般由控制芯片完成该工作,无需额外的校准步骤。驱动中已经集成了电阻触摸屏的校准算法,校准过程屏幕会点亮四个点,依次点击来校准,采集数据进行数据比对,误差太大则点击失败,重新点击。
调用校准函数 xtp2046.adjust()将会在屏幕上开始校准的过程,校准完成后,将参数保存在文件中,下次初始化 xtp2046 时读取校准数据,避免每次使用前的重复校准。
触摸屏的按下
不论是电阻还是电容触摸屏,通常的触摸屏控制芯片会有一个用于通知触摸事件的中断引脚,可以通过该引脚中断来读取电平。但触摸控制器给出的信号往往不如程序通过寄存器判断的准确性高。创建触摸对象时,会要求传入中断引脚号。
对于电阻触摸屏来说,判断按下的依据是 Z 方向的压力大于配置的阈值;对于电容触摸屏则是判断至少有一个触摸点存在。
触摸屏的旋转
触摸屏具有与显示屏一样的 8 个方向。定义在创建触摸对象的参数中(x_inv, y_inv, xy_swap)。 这里的旋转是通过软件换算来实现的 。
触摸屏的分辨率设置也是很重要的,因为触摸屏旋转后的换算依赖于触摸屏的宽和高分辨率大小,设置不当将无法得到正确的旋转效果。
注解:
在使用电阻屏时,由于电阻屏在每个方向上的电阻值不一定均匀分布,这会导致经过旋转换算后触摸位置的不准确,所以建议电阻屏校准后不再进行旋转操作。
示例
QuecPython 内部已适配三款触摸驱动,可以直接使用。
以[铀开发板](TODO 链接)触摸屏(GT911)为例:
from tp import gt9xx
tp_gt911 = gt9xx(irq=40,reset=20)
tp_gt911.activate()
tp_gt911.init()
tp_gt911.read_xy()
效果如下:
常见问题
触摸不准确
触摸不准确可能是由以下原因引起的:
- 校准问题:如果触摸屏未经过正确的校准,或者校准过程中有误,那么触摸屏可能无法准确地识别触摸位置。此时,需要进行触摸屏校准。
- 驱动问题:如果触摸屏的驱动程序存在问题,可能会导致触摸定位不准确。在这种情况下,可能需要更新或者修复触摸屏驱动程序。
- 硬件问题:硬件的问题也可能会导致触摸不准确。例如,触摸屏的感应器有损坏,或者触摸屏和控制器之间的连接存在问题等。
- 电磁干扰:在某些环境中,电磁干扰可能会导致触摸定位不准确。这可能需要更换设备的使用环境或者增加电磁防护措施。
- 软件问题:某些情况下,应用程序的问题可能会影响到触摸的准确性。例如,某些应用程序可能没有正确地处理触摸输入,导致触摸定位偏离。
触摸失灵
触摸屏失灵的原因可能有以下几种:
- 硬件故障:触摸屏自身或与其连接的硬件(如控制器、数据线等)可能出现故障,包括物理损坏、老化、接触不良等。
- 驱动问题:触摸屏驱动软件可能出现故障,如驱动程序存在缺陷、兼容性问题、驱动未正确安装或更新等。
- 软件冲突:操作系统中,其他软件或驱动可能与触摸屏驱动产生冲突。
- 电源问题:触摸屏的电源供应不稳定,或电源供应不足,都可能导致触摸屏失灵。
- 环境因素:极端的环境条件,如温度、湿度、静电等,都可能影响触摸屏的正常工作。
触摸响应延迟
触摸响应延迟可能是由以下几个因素导致的:
- 处理器过载:如果嵌入式设备的处理器正在处理大量任务,它可能没有足够的资源来快速处理触摸输入,这会导致触摸响应延迟。
- 软件问题:触摸屏的驱动程序或操作系统可能存在问题,导致触摸事件处理延迟。另外,如果运行在设备上的应用程序设计或优化不佳,也可能导致用户感觉到触摸响应延迟。
- 硬件问题:如果触摸屏或其相关硬件存在问题,也可能导致触摸响应延迟。例如,触摸屏的感应器或控制器可能存在性能问题。
- 通信延迟:在某些嵌入式系统中,触摸屏与处理器之间的数据传输可能存在延迟,这可能是由于接口速度较慢或数据线质量问题等原因造成的。
数码管
数码管/LED 点阵是嵌入式系统中常见的显示方案,该方案比 LCD 显示屏占用更少的引脚和内存资源,实现也更加简单,比较适合计时、计数、状态显示等具有单一显示需求的应用场景。
数码管主要有 LED 数码管、LCD 数码管和 VFD 数码管等类型。
LED 数码管
- 工作原理:LED 数码管是利用发光二极管(LED)的 PN 结正向导通时产生发光的原理制成的。数码管内部通常有 7 段或 14 段 LED 条组成,可以通过控制器控制这些 LED 条的亮暗,从而显示出各种数字或字符。
- 特点:LED 数码管具有亮度高、视角大、寿命长、耐震性能好等优点,缺点是功耗较大。
- 应用:广泛应用于各种电子设备和仪表中,如电子表格、计时器、计算器和闹钟等。
LCD 数码管
- 工作原理:LCD 数码管利用液晶材料在电场作用下对光的传输性质产生变化的特性来显示信息。通常有 7 段或 14 段液晶条组成,通过控制器控制液晶的状态,从而显示各种数字或字符。
- 特点:LCD 数码管具有功耗低、显示效果柔和、对环境适应性强等优点,缺点是视角较小、对温度敏感。
- 应用:广泛应用于各种便携式和低功耗电子设备,如手表、电子词典、移动电话等。
VFD 数码管
- 工作原理:VFD 数码管是利用气体放电原理来产生发光的。数码管内部通常有 7 段或 14 段荧光发射体,通过控制器控制发射体的放电状态,从而显示各种数字或字符。
- 特点:VFD 数码管具有亮度高、显示颜色丰富、视角大、反应速度快等优点,缺点是功耗大、寿命较短。
- 应用:广泛应用于各种家电和娱乐设备中,如电视、DVD 播放器、音响等。
驱动框图
- 主控微处理器(MCU):主控微处理器是系统的核心,负责处理并执行所有的操作。它根据需要显示的信息,通过接口向显示驱动 IC 发送指令。
- 显示驱动 IC:显示驱动 IC(也被称为数码管驱动 IC)是一个专门用于驱动数码管显示的集成电路。它接收来自主控微处理器的指令,并根据这些指令来驱动数码管显示相应的数字或字符。
- 接口(SPI, I2C 等):接口是用于连接主控微处理器和显示驱动 IC 的通信路径。主控微处理器通过接口向显示驱动 IC 发送指令。
- 数码管显示:数码管是显示驱动 IC 驱动的显示设备。根据显示驱动 IC 的指令,数码管显示相应的数字或字符。
在一个基本的数码管显示系统中,这些组件的关系可以概括为以下几个步骤:
- 主控微处理器根据需要显示的信息,生成相应的指令。
- 主控微处理器通过接口将指令发送给显示驱动 IC。
- 显示驱动 IC 接收这些指令,根据指令驱动数码管显示相应的数字或字符。
这就是一个基本的数码管显示系统的工作原理。不同的数码管显示系统可能会有不同的具体实现,但大部分系统都会遵循这个基本模式。
适配说明
QuecPython 系列模块适配设备情况如下:
名称 | 功能 | 接口 | 驱动 | 数据手册 |
---|---|---|---|---|
TM1650 | 带键盘扫描的 LED 驱动控制芯片,支持 8 段 ×4 位和 7 段 ×4 位 | I2C | tm1650.py | TM1650 |
TM1650
TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路。内部集成有 MCU 输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。
支持两种显示模式:8 段 ×4 位和 7 段 ×4 位
可通过 I2C 接口与 QuecPython 模组进行通信
tm1650 脚本已对 TM1650 的基本操作进行了封装,用户可以直接调用 Tm1650.show_num Tm1650.show_str Tm1650.show_dp 等接口再数码管上进行显示
from usr.tm1650 import Tm1650
tube = Tm1650(Pin.GPIO13, Pin.GPIO12) #600U PIN60,PIN59
tube.on()
tube.all_show()
utime.sleep(1)
tube.clear_bit(3)
utime.sleep(1)
tube.all_clear()
utime.sleep(1)
tube.show_dp(3)
utime.sleep(1)
tube.show_str("PPJ")
utime.sleep(1)
tube.show_num(-537)
utime.sleep(1)
tube.show_num(8537)
utime.sleep(1)
tube.circulate_show("AbCdEFH")
常见问题
- 数码管不亮:这可能是供电问题,如电源线接触不良或电源电压不足。也可能是数码管本身的问题,如内部电路损坏。此外,如果使用的是控制器驱动的数码管,驱动程序或控制器的硬件可能存在问题。
- 数码管显示不全或显示错误:这通常是驱动电路或控制程序的问题。例如,如果驱动程序没有正确地设置或更新显示数据,可能会导致显示错误。
- 数码管闪烁:如果数码管在没有意图的情况下闪烁,可能是供电不稳定或驱动程序问题。例如,如果供电电压不稳定,可能会导致数码管的亮度不断变化,造成闪烁现象。另外,如果驱动程序没有正确地刷新显示数据,也可能导致数码管闪烁。
- 数码管亮度不均或颜色不一:这可能是数码管本身的质量问题,或者是驱动电路的问题。例如,如果数码管的某些 LED 不均匀地老化,可能会导致亮度不均或颜色不一。