最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

MicroPython

运维笔记admin53浏览0评论

MicroPython

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. 原理图解读

  1. 先看中间的引脚位置图,模块上下两排各8各引脚,下边引脚号①到⑧,上面倒序的⑨到⑯。我手上模块把印有型号的一边朝向自己就是①到⑧引脚了(确定方法见后)
  2. 最下面的电路图可以知道,每一行的阴极连接在一起,每一列的阳极连接在一起。所以1088AS之所以叫共阴LED点阵模块,应该是以行连接方式来命名的。
  3. 需要点亮其中的某一个led,只需要把该led对应的正负极引脚接通即可。特别注意的是,引脚号是带圆圈的那个数字,从①到⑯不重复的。
  4. 从整个原理看,跟前面学习数码管时的段码、位码如出一辙。所以凡是能驱动数码管的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)代表需要接通的引脚,其中

  1. x: 列引脚,给高电平
  2. y: 行引脚,给低电平
  3. 其他非红色位置不需要点亮,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的亮灭# 由于取模时采用的逆向走向,所以一般处理整行/列的编码时,从低位处理到高位

到这里原理部分就写这么多吧,接下来咱们下篇就是实操了,把点阵屏整亮,并先从简单的展示一个爱心图案开始玩起。

发布评论

评论列表(0)

  1. 暂无评论