• MicroPython-On-ESP8266——8x8LED点阵模块(1)驱动原理


    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'管脚置为低电平  # 熄灭本行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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,  # 01111111
        0xBF,  # 10111111
        0xDF,  # 11011111
        0xEF,  # 11101111
        0xF7,  # 11110111
        0xFB,  # 11111011
        0xFD,  # 11111101
        0xFE,  # 11111110
    ]
    # 逐列编码,这里就是对应不同行时,列led的亮灭
    col = [
        0x00,  # 00000000
        0x66,  # 01100110
        0x99,  # 10011001
        0x81,  # 10000001
        0x42,  # 01000010
        0x24,  # 00100100
        0x18,  # 00011000
        0x00,  # 00000000
    ]
    
    while True:
        取出整行、整列的编码,再把该编码去驱动底层代码(见上)控制每个led的亮灭
        # 由于取模时采用的逆向走向,所以一般处理整行/列的编码时,从低位处理到高位
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

  • 相关阅读:
    家政管理系统设计与实现
    力扣hot100:146. LRU 缓存
    Linux 下以其他用户运行程序
    OpenCV4(C++)—— 直方图
    前端实现给文字添加动态背景
    微信小程序:js实现不改变原数组的情况下增加一条对象到新数组中
    maven多模块间引用时
    Qt各种指针的使用总结
    第十节:多态【java】
    [C++][数据结构][图][中][图的遍历][最小生成树]详细讲解
  • 原文地址:https://blog.csdn.net/fatway/article/details/127799808