MicroPython-On-ESP8266——8x8LED点阵模块(4)基于MAX7219滚动显示字符/图案

news2024/9/24 11:30:17

MicroPython-On-ESP8266——8x8LED点阵模块(4)基于MAX7219滚动显示字符/图案

1. 继续折腾点阵模块

咱们已经学习了点阵屏基础电路与驱动原理,并用74HC595和MAX7219都成功地驱动点阵屏显示了爱心图案。

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

MicroPython-On-ESP8266——8x8LED点阵模块(2)使用74HC595驱动

MicroPython-On-ESP8266——8x8LED点阵模块(3)使用MAX7219驱动

使用max7219只显示一个爱心未免单调了一些,该整些小花活儿了。
我们来实现展示多个图案,并逐步深入到能整体切换、按行动态滚动、按列动态滚动,滚动还能带首位衔接的效果。

2. 显示多个图案

2.1. 先对图案取模

这次咱们来三个图案:I♡U

照旧在PCtoLCD里取模,建立24x8的图案,手动编辑出需要的图案出来。按行列式、顺向、十六进制的方式来取模。如下图所示(当然也可以自己发挥其他想要的图案):
在这里插入图片描述
得到取模结果:

{0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00},
{0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00},
{0x00,0x66,0x66,0x66,0x66,0x7E,0x3C,0x00},

2.2. 先分析一下前面的单图案显示代码

from machine import Pin,freq
import time

# 准备数据引脚
pin_clk = Pin(14, Pin.OUT, value=1) #D5,时钟,上升跳变时数据位移锁存
pin_cs  = Pin(15, Pin.OUT, value=1) #D8,上升跳变时,数据全部推入锁存
pin_din = Pin(13, Pin.OUT, value=1) #D7,待移入的数据

def write_byte(data):
    "按位移入数据到模块"
    pin_cs.off()
    for i in range(8):
        pin_clk.off()
        pin_din.value(1 if ((data << i) & 0x80) else 0)  # 从高位开始送数据
        pin_clk.on()

def write_data(addr, data):
    "写入地址和对应的数据"
    pin_cs.off()
    write_byte(addr)
    write_byte(data)
    time.sleep_us(5)
    pin_cs.on()

def init_max7219():
    "初始化模块"
    write_data(0x0c, 0x00)  #关断处于关闭状态 
    write_data(0x0f, 0x00)  #不测试
    write_data(0x0b, 0x07)  #扫描所有位码
    write_data(0x0a, 0x0F)  #亮度0x07,半亮
    write_data(0x09, 0x00)  #不译码
    write_data(0x0c, 0x01)  #关断处于显示状态 

## 初始化模块
time.sleep_ms(50)
init_max7219()

## 显示逻辑:单图案
## 多图案只需要更换此部分逻辑即可
col = [0x00, 0x66, 0x99, 0x81, 0x42, 0x24, 0x18, 0x00]  # 爱心
for n in range(8):
    write_data(n+1, col[n])

前面的导入Pin库、定义管脚、定义写入数据方案以及初始化模块,这些通过的东西不能省。

最后的显示逻辑部分,单图案时就是直接按行刷入对应的数据一次即可。那我们要显示多个图案其实也简单,遍历每个字符/图案(就是上面取模到的三组值),依次刷入即可。

2.3. 多个图案的显示逻辑

# 显示逻辑:多图案逐个切换
col1 = [
    0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00, # I
    0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00, # ♡
    0x00,0x66,0x66,0x66,0x66,0x7E,0x3C,0x00  # U
]
while 1:
    for i in range(3):  # 遍历三个图案
        for n in range(8):  # 每个图案刷入取模的值
            write_data(n+1, col1[i*8+n])
        time.sleep(1)

三个图案取模得到的所有值都放入col1数组,取某个图案时计算一下下标即可,不需要弄二元数组。

写个while循环不断重复显示I♡U,每个图案之间sleep一下,让图案在屏幕上保持一段时间。

2.4. 实验效果

在这里插入图片描述

3. 按行(纵向)滚动显示多图案

3.1. 按行滚动原理

上面实现了切换多个图案进行显示的效果,但这样切换的效果太生硬了,现在改进一下,用动态逐行滚动的形式来显示。

原理就是显示的时候,一个图案整体是8行,我们递进1行来展示,当前图案显示一部分,再跨到下个图案显示一部分;
再让每行递进的时间缩小到秒级以内,停留时间变短,这样人眼观察就会形成滚动的效果了。

三个图案取模的结果都在一个大数组内,我们直接从首位开始递进取8个字节来展示,直到取到数组的最后。

在这里插入图片描述

3.2. 显示逻辑代码

# 显示逻辑:逐行递进切换
col2 = [
    0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00, # I
    0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00, # ♡
    0x00,0x66,0x66,0x66,0x66,0x7E,0x3C,0x00  # U
]
while 1:
    for i in range(len(col2)-8):  # 取到最后图案的第一个字节,避免截取后面8个字节时越界
        for n in range(8):
            write_data(n+1, col2[i+n])
        time.sleep_ms(150)

3.3. 实验效果

在这里插入图片描述

4. 按行(纵向)滚动显示多图案,增加首尾衔接过渡效果

4.1. 首尾衔接过渡处理

上一步实现了按行滚动,但首尾图案的处理还是不理想,第一个图案直接出现,最后一个图案没有逐步退出的效果。

要解决这个问题,我们需要在取模数组前部增加一个空白图案,最开始先显示空白图案再逐步滚入后续图案。
而最后一个图案,前面为了避免数组越界,当图案全部出现时就结束了。那我们需要故意越界一下,只不过是越到了整个数组的头部(用求模的算法)。这样尾部滚入完成后就又过渡到了头部图案的展示了。实现了衔接效果。

4.2. 实操代码与效果

# 显示逻辑:逐行递进切换,首位衔接起来
col3 = [
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, # 空
    0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00, # I
    0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00, # ♡
    0x00,0x66,0x66,0x66,0x66,0x7E,0x3C,0x00  # U
]
while 1:
    for i in range(len(col3)):  # 取完所有的字节
        for n in range(8):
            idx = (i+n) % len(col3)  # 最后图案不完整时,用求模的方式去取数组最前面的值
            write_data(n+1, col3[idx])
        time.sleep_ms(150)

在这里插入图片描述

5. 按列(横向)滚动显示多图案

5.1. 横向滚动原理

从取模软件那边的效果来看,我们led点阵屏始终显示8*8的区域,如下图红框部分。该区域内显示的图案,如果整体做一个左移动作,相对红框做一个右移动作。红框右移后,框起来的部分是当前图案的右n列以及下一个图案左8-n列。

也就是说,我们当前显示区域的每一行数值,左移一次,左移后空出来的最低位,需要把下一个图案的对应行数值的最高位放置过来。然后重复做左移与补位的动作。

在这里插入图片描述
需要特别注意的地方:

  • python数值没有char类型,我们定义取模的数组时,默认都是int,那么左移1次需要先把当前的最高位清空,否则int数会被乘2后变得非常大
  • 为了向左滚动移入的效果更好看,我们一样在前面补一个空白图案。

5.2. 代码与效果

# 显示逻辑:横向递进切换
col4 = [
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, # 空
    0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00, # I
    0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00, # ♡
    0x00,0x66,0x66,0x66,0x66,0x7E,0x3C,0x00  # U
]
while 1:
    for n in range(8):
        write_data(n+1, col4[n])
    # 所有数据左移,并在当前最低位补充下一字符对应位置的最高位
    for ch in range(len(col4)/8):  # 遍历所有图案
        for i in range(8):  # 每个图案的8行
            col4[ch*8+i] = (col4[ch*8+i] & 0x7F) << 1  # (python类型限制)清空最高位再左移1位
            if ch != len(col4)/8 - 1:  # 非最后一个图案,要把下个图案对应行的最高位补到当前最低位
                col4[ch*8+i] += (col4[ch*8+i+8]>>7)
    time.sleep_ms(150)

在这里插入图片描述

有个问题是,当所有的有效数据都左移完后,数组的所有元素都变成 0x00了,也就是后面不会再显示任何内容了。这就要求我们像前面处理按行滚动的首位衔接过渡的效果一样,把列滚动也衔接起来。

6. 按列滚动图案并具体首位衔接过渡效果

6.1. 过渡原理

上一步,我们不断的左移,相当于红框一直右移,直到移出到待显示图案的外部(无尽虚空),导致后续屏幕空白。
在这里插入图片描述
既然知道红框移动到的区域超出了最后一个图案的边界,那我们可以就可以把超出的边界的部分再用第一个图案的头部列区域来填补,这样就实现了过渡的衔接。
在这里插入图片描述
由于位移动作不像前面按行滚动时那样直接数组取对应的值就能解决,我们需要另外定义一个缓存区,把需要额外补位部分的各行数值缓存起来。或者说把第一个图案的第1列缓存起来,所有图案的各列都做了一次左移动作,再把刚才缓存的首图案的首列补位到最后一个图案的最后一列。这样就实现了一个无尽循环,从而我们各个图案就能一直循环地滚动下去了。

6.2. 代码与效果

# 显示逻辑:横向递进切换,首位接起来
col5 = [
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, # 空
    0x00,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00, # I
    0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00, # ♡
    0x00,0x66,0x66,0x66,0x66,0x7E,0x3C,0x00  # U
]
tmp = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]  # 缓存区
while 1:
    for n in range(8):
        write_data(n+1, col5[n])
    # 所有数据左移,并在当前最低位补充下一字符对应位置的最高位
    for ch in range(len(col5)/8):
        for i in range(8):
            if ch == 0:
                tmp[i] = col5[ch*8+i] >> 7  #缓存下来当前显示内容的最高位
            col5[ch*8+i] = (col5[ch*8+i] & 0x7F) << 1  # 清空最高位再左移1位
            if ch != len(col5)/8 - 1:   #非最后一个图案,要补下个字符对应位
                col5[ch*8+i] += (col5[ch*8+i+8]>>7)
            else:                       #最后一个图案,补缓存下来的最高位到后面
                col5[ch*8+i] += tmp[i]
    time.sleep_ms(150)

在这里插入图片描述
为了左移效果好看,第一个图案是空白,所以动图上不能直观的看出这是一个无尽的循环。自己实操体会一下就明白了,代码部分我加了注释,这里也不过去解释,多理解一下就好。

7. 后记

至此,咱们实现了多图案的按行滚动、按列滚动的效果。并且都能实现首位衔接过渡。人眼观察看效果都还比较平顺。

那本节就到此,后续再继续深入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-(6-5-2)爬虫---处理cookie来获取书架数据

文章目录一 需求二 流程分析1 登录2 获取书架的数据三 完整代码一 需求 通过处理cookie来访问自己的书架资源。 二 流程分析 带着cookie&#xff0c;去请求url&#xff0c;得到书架内容。 要将上述的两个操作连续起来&#xff0c;可以使用session。 session是一连串的请求…

自动驾驶之多任务方法调研

1. YOLOP github C TRT TX2 我们提出了一种高效的多任务网络&#xff0c;该网络可以联合处理自动驾驶中的目标检测(车&#xff0c;没有红绿灯)、可驾驶区域分割和车道检测三个关键任务 速度&#xff1a; TX2上23FPS&#xff1b;TAITAN XP上41FPS. 自测结果: 灵活性: 支持…

RNN LSTM GRU

GRU是LSTM的简化结构&#xff0c;而LSTM是RNN的优化结构。 1.RNN RNN对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息. 将网络的输出保存在一个记忆单元中&#xff0c;这个记忆单元的输出经过权重参数调整后和下一次的输入一起进入神经网络中…

队列之王: Disruptor 原理、架构、源码 一文穿透

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

MySQL innodb引擎架构分析-Redo log

文章目录系列文章目录前言一、Redo log是什么&#xff1f;二、Redo log是怎么工作的Redo log的组成Redo log的配置Redo log何时刷盘总结系列文章目录 1. MySQL innodb引擎架构分析-Buffer Pool 2. MySQL innodb引擎架构分析-Redo log 前言 在MySQL的事物处理过程中&#xff0c…

12 款 yyds 的 IDEA插件,配上18条使用技巧,绝了

工欲善其事&#xff0c;必先利其器。想要提升编程开发效率&#xff0c;必须选择一款顺手的开发工具。 JetBrains 公司提供了一系列功能强大、风格统一的开发工具&#xff0c;深受开发者喜爱。其中&#xff0c;IDEA 是面向 Java 开发的专业 IDE&#xff08;集成开发环境&#x…

python os.system调用别的系统程序总出现一闪而过的黑框解决办法

python os.system调用别的系统程序总出现一闪而过的黑框解决办法 今天打包了py程序&#xff0c;运行的时候发现老是有个黑框一闪而过。经过多次尝试发现是os.system的问题&#xff0c;调用这个函数会调用cmd&#xff0c;所有会出现短暂的黑框显示。 解决办法1&#xff1a;换用…

HarmonyOS跨端迁移开发代码演示

目录说些废话开源代码环境代码ability_main.xmlconfig.jsonMainAbility.javaMainAbilitySlice.java测试说些废话 官方文档&#xff1a;跨端迁移开发指导&#xff08;基于java开发&#xff09;     下面环境里写的两台真机我测试的时候无法正常产生回迁效果&#xff0c;所以…

以太网 DHCP(DHCP的8种报文、DHCP配置、DHCP中继)

2.13.1 以太网 DHCP&#xff08;DHCP的8种报文、DHCP配置、DHCP中继&#xff09; DHCP-22.13.1 以太网 DHCP&#xff08;DHCP的8种报文、DHCP配置、DHCP中继&#xff09;一、DHCP的8种报文二、DHCP配置接口配置&#xff1a;全局配置&#xff1a;三、DHCP中继配置案例&#xff1…

游戏开发52课 渲染路径

4.6 渲染路径&#xff08;Rendering Path&#xff09; 4.6.1 经典顶点光&#xff08;Legacy Vertex Lit&#xff09; 严格来说&#xff0c;它也是前向渲染的一种&#xff0c;但有些引擎&#xff08;如Unity&#xff09;将它单独抽离出来。由于光照计算在顶点&#xff0c;所以…

微服务架构系列(一)之虚拟平台、分布式存储、高可用k8s集群环境搭建

一、物理机虚拟平台搭建 1、由实向需架构转换图&#xff08;每台物理机要求两块硬盘用来做分布式存储和系统盘&#xff0c;我的是10年前的老机器没啥大的要求&#xff09;&#xff1a; 2、系统安装去官网下载 Proxmox VE 7.x ISO Installer &#xff08;按需求选择版本&#x…

sublime text 4的安装/配置中文/更换配色方案

效果 安装 参考文章&#xff1a;Sublime Text v4.0(4143)安装方法 Sublime Text v4.0(4143)下载地址&#xff1a;https://www.sublimetext.com/download_thanks?targetwin-x64 安装软件找到软件安装位置&#xff0c;找到sublime_text.exe将sublime_text.exe 拖入16进制编辑…

[附源码]计算机毕业设计基于协同过滤的资讯推送平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

安卓玩机搞机技巧综合资源-----手机蝰蛇音效 杜比安装步骤 多种方式【九】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

编程小白想转行互联网,想以python为入口,究竟可不可行?

前言 最近有些朋友私信过我这个问题&#xff0c;很多编程小白想从事或转行互联网&#xff0c;想以Python为切入口&#xff0c;究竟可不可行&#xff1f; 以我看到的一些小伙伴的学习经历来说&#xff0c;虽说学会Python不能够马上胜任一些工作&#xff0c;但这可能是你离互联…

一例Trickbot家族js下载器的分析

样本信息 MD5: e36380d824811bc28fbc26ea84c1a868 SHA1: 19d5fc16cfabae3b3c26bbb4f5798da42733a2fa SHA256: 16429e95922c9521f7a40fa8f4c866444a060122448b243444dd2358a96a344c SHA512: 6c6f323893870536822a2aa2aebe783379906081fcf004dd04cb40cc1109c3452d39b548ac8b2a654…

安卓APP源码和设计报告——导航系统

演示答辩发言稿&#xff1a; 注意&#xff1a;1.在mainfest.xml文档中添加访问权限即一系列<uses-permission>元素使用Android中提供的权限。比如百度地图的使用联网的情况下需要网络功能权限。 2.在Stings.xml中添加一些字符串数组&#xff0c;离线数据管理、简体繁体…

python---数据容器

目录 环境安装 python语法 打印语句 注释 变量 变量声明 变量类型 boolean类型 占位符 控制数据精度 输入输出 条件控制 循环语句 while循环 for循环 函数 None类型 数据容器 列表 元组 字符串 序列 集合 字典 环境安装 1、安装python运行环境 Welcome t…

swiftui 中的app和 Scenes有什么,他们是什么关系

app和 Scenes有什么,他们是什么关系 SwiftUI 中的 app 和 Scenes 是两个相关的概念,它们都与应用程序的用户界面有关。 app 是指使用 SwiftUI 框架开发的应用程序,它包含了用户界面的所有内容和逻辑。在 SwiftUI 中,app 的界面通常由多个视图组成,每个视图都可以显示不同…

使用声网 SDK 构建 Piloteer 助盲服务平台的最佳实践

前言 在今年声网主办的「RTE2022 编程挑战赛」中&#xff0c;数支队伍经过一个多月的努力开发&#xff0c;很多优秀的作品最终突出重围&#xff0c;斩获大奖。本文由RTE2022编程挑战赛获奖者之一李新春撰写&#xff0c;他主要围绕获奖作品「Piloteer助盲服务平台」分享了开发的…