MicroPython
MicroPython-On-ESP8266——8x8LED点阵模块(1)驱动原理
1. 8x8LED点阵模块介绍
1.1. 显示模块的升级
之前已经试过点亮8段数码管,并能够使用两片HC595芯片来驱动数码管。今天我又找来了一个8x8点阵LED屏,下面分析一下这个屏幕并尝试点亮它。
首先大家要建立一个概念,这个8x8点阵,其实根8个数码管是一样一样的。看看后面的原理图就知道了。
1.2. 8x8LED点阵介绍
因为这个模块是个淘宝货,没查到权威的官方手册,只是从网上搜罗了一些资料过来。我手上这个led点阵型号是1088AS(AS共阴,BS共阳),点阵内部结构原理如下:
2. 原理图解读
2.1. 原理图解读
- 先看中间的引脚位置图,模块上下两排各8各引脚,下边引脚号①到⑧,上面倒序的⑨到⑯。我手上模块把印有型号的一边朝向自己就是①到⑧引脚了(确定方法见后)
- 最下面的电路图可以知道,每一行的阴极连接在一起,每一列的阳极连接在一起。所以1088AS之所以叫共阴LED点阵模块,应该是以行连接方式来命名的。
- 需要点亮其中的某一个led,只需要把该led对应的正负极引脚接通即可。特别注意的是,引脚号是带圆圈的那个数字,从①到⑯不重复的。
- 从整个原理看,跟前面学习数码管时的段码、位码如出一辙。所以凡是能驱动数码管的IC,都一样能驱动这个点阵屏。
备注:
为了确认手上点阵屏具体的引脚号,咱么可以拿万用表,换到LED档,正负极接上对应的引脚试试。如下图,我正极接③脚,负极接①脚,点亮的led刚好跟原理图一致。再试其他也对应的上,那就能确认下来了。
2.2. 点亮多个led的逻辑
按照原理图,横排的led负极都短接在一起,纵排的led正极短接在一起。当我们电源正极接③脚,负极接①脚后,虽然亮的只是其中一个led,实际上①、③脚对应的横排和竖排都处于半导通状态。
我们使用这个屏幕可不是只为了点亮某一个led,而是根据实际需要点亮多个led。
比如咱们来实现一个常见的爱心图案:
根据这个图案,我们需要接通的管脚如表所示
(x,y) | 列1 | 列2 | 列3 | 列4 | 列5 | 列6 | 列7 | 列8 |
---|---|---|---|---|---|---|---|---|
行1 | (13,9) | (3,9) | (4,9) | (10,9) | (6,9) | (11,9) | (15,9) | (16,9) |
行2 | (13,14) | (3,14) | (4,14) | (10,14) | (6,14) | (11,14) | (15,14) | (16,14) |
行3 | (13,8) | (3,8) | (4,8) | (10,8) | (6,8) | (11,8) | (15,8) | (16,8) |
行4 | (13,12) | (3,12) | (4,12) | (10,12) | (6,12) | (11,12) | (15,12) | (16,12) |
行5 | (13,1) | (3,1) | (4,1) | (10,1) | (6,1) | (11,1) | (15,1) | (16,1) |
行6 | (13,7) | (3,7) | (4,7) | (10,7) | (6,7) | (11,7) | (15,7) | (16,7) |
行7 | (13,2) | (3,2) | (4,2) | (10,2) | (6,2) | (11,2) | (15,2) | (16,2) |
行8 | (13,5) | (3,5) | (4,5) | (10,5) | (6,5) | (11,5) | (15,5) | (16,5) |
表格里面红色(x,y)代表需要接通的引脚,其中
- x: 列引脚,给高电平
- y: 行引脚,给低电平
- 其他非红色位置不需要点亮,x,y同时给高电平或低电平都行
3. 底层驱动方法:动态扫描
3.1. 底层驱动方式确定
因为led灯的两极短接在一起,所以不可能一次性通过控制16个管脚的高低电平来点亮咱们的爱心图案。
根据前面学习数码管的知识,需要使用动态扫描机制来实现。遗忘的话可以回看一下: MicroPython-On-ESP8266——数码管的使用,四位数码管及动态扫描显示
具体到咱们这个8x8点阵来说呢,可以依照按行扫描的方式来逐行点亮对应的位置,通过快速循环而让人眼看到需要的图案。
3.2. 底层驱动代码
伪代码:
# 初始
引入GPIO库
初始需要的开发板引脚为输出状态# 准备工作
定义行列需要显示爱心图案的管脚
所有行列管脚都置为高电平 # 没有电位差整体不亮# 按行扫描点亮该行需要位置的led
while 1:for 行y in [行1 ~ 行8]:for 列x in [列1 ~ 列8]:根据爱心对应位置,不需要点亮时,'列x'置为低电平根据爱心对应位置,需要点亮时,'列x'置为高电平'行y'管脚置为低电平 # 亮起本行指定的led'行y'管脚置为低电平 # 熄灭本行
3.3. 实际上层驱动
为什么说这里又是“底层”,又是“上层”的。这个概念是相对的。
底层:也就是直接跟点阵屏幕的16个管脚相连的GPIO,需要使用上面咱们分析出来的动态扫码的机制(可以按行也可以按列来扫描)
上层:因为ESP8266能作为GPIO输出的引脚不够16个,需要借助其他模块来辅助转化为16个GPIO。相应的,上层的编码方式就可以不拘泥于动态扫描了,可以根据实际使用的驱动IC来调整实现方式。
点阵屏专用的驱动IC实在是太多,咱手上资源有限,后面就实验一下595锁存器和MAX7219来驱动点阵屏。
那么上下层之间如何更换的衔接呢,或者说我想随意输出一个想要的字符(8x8暂时显示不了中文,中文问题后续再提),那这个字符怎么来?怎么转换成上层想要的编码?又如何由上层发送给下层去驱动点阵屏呢?
有问题就好办,先解决字符怎么来的问题。
4. 显示图案取模
4.1. 取模软件
为了在点阵屏上显示出我们需要的图案(无论是数字、字母、符号,都是一个组合图案),就像前面画的那个爱心一样,点亮需要位置坐标上的led,其他的不亮,那就得到结果了。
8x8LED,我们直观的把它看做8x8=64个像素点,那么想要指定的图案这个问题就转换为该点亮哪些坐标的像素问题,也就是像素取模问题。
前面写了一篇介绍OLED屏幕的文章,MicroPython-On-ESP8266——OLED屏幕的使用方法(含显示中文) 其中有介绍到使用PCtoLCD2002这个取模软件来绘制需要的字符并生成字库。那咱么8x8LED也一样用这个来实现。
4.2. 实现方式
新建一个8 * 8像素的图案,用鼠标点击出爱心图形。字模选项可以按如图方式进行设置。其实,取模方式和取模走向完全可以自主决定,只不过要根据自己的配置去调整接线方式和实现代码了。
通过上面的配置,我们生产出来的字模呢,结果只是列码。
{0x00, 0x66, 0x99, 0x81, 0x42, 0x24, 0x18, 0x00}
因为我们选择的是“行列式”,相对于行需要由我们自行控制,可以像前面学习4段数码管时一样,把每段当作这里点阵屏的一行。数码管的位码就跟这里的列码对应起来了。数码管显示数字或字母时位码是固定的,我们这里需要显示自由图案,列码就从取模软件里面拿就行了。
4.3. 上层驱动代码
伪代码
# 定义由何种产生驱动16个点阵屏管脚的方式,并初始相应的GPIO# 逐行编码,相当于拉低当前行的电平,配合列码就能显示当前行需要的led,其他行高电平都不亮
row = [0x7F, # 011111110xBF, # 101111110xDF, # 110111110xEF, # 111011110xF7, # 111101110xFB, # 111110110xFD, # 111111010xFE, # 11111110
]
# 逐列编码,这里就是对应不同行时,列led的亮灭
col = [0x00, # 000000000x66, # 011001100x99, # 100110010x81, # 100000010x42, # 010000100x24, # 001001000x18, # 000110000x00, # 00000000
]while True:取出整行、整列的编码,再把该编码去驱动底层代码(见上)控制每个led的亮灭# 由于取模时采用的逆向走向,所以一般处理整行/列的编码时,从低位处理到高位
到这里原理部分就写这么多吧,接下来咱们下篇就是实操了,把点阵屏整亮,并先从简单的展示一个爱心图案开始玩起。