书接上回,上一篇中我们聊到了LED点阵屏的工作原理和一些电气参数。本篇以第一篇为基础,对软件层面进行展开,同时也为下一篇接入GUI做铺垫。文章较第一篇有所增长,大概需要5~7分钟可以看完。
【目标】
能够随心所欲的显示我们想要的图像,为此我们分三步来进行。限于阅读体验和展示效果,软件部分将以伪代码、图片的形式进行展示。实际代码会在文后附上gitee的仓库地址。
【行列控制驱动】
上一篇中提到点阵屏的工作原理:使用HC595来控制列数据,译码器控制行显示,利用视觉暂留,形成整幅图案。其中HC595是一个组合时序,译码器是一个组合逻辑。
HC595驱动
从时序图中我们知道:数据输入引脚SI在SCK的上升沿时写入到移位寄存器中,在SCLR的上升沿完成锁存,在使能引脚拉低时完成并口数据输出。
类比到点阵屏的控制上,数据引脚R1、R2在CLK的上升沿写入移位寄存器,在LAT的上升沿完成数据锁存,在EN低电平时完成并口数据的输出。
因点阵屏列数据控制上串联了多个595,所以最后的锁存和输出,我们放到整行的显示控制中。
伪代码如下:
1.拉低CLK
2.准备数据,取出单个byte的其中一个bit
3.将bit输出至R1、R2所连接的GPIO
4.拉高CLK,产生上升沿
1~4循环8次发送出去一个byte
串转并输出
通过四个IO来表示一个十六进制数即0~15,这16个数。
1.找到定义的4个连续的IO口
2.赋值
【整屏显示输出】
基础的行、列驱动搞定后,下边就是对整屏的输出控制。上一篇中讲到32*128需要128/8=16个HC595来做列数据的刷新,通过R1、R2来分别控制上下两个16*128的显示区域。伪代码如下:
1.循环16次HC595的数据发送
2.使用译码器选择当前行
3.产生一个锁存信号
4.使能HC595的并口输出
5.延时一段时间,用于视觉暂留
6.关闭HC595的并口输出,便于下次数据传输
1~6循环16次,完成16 + 16行的数据刷新
填坑:
这里填一下第一篇留下的坑,第一篇中提到1/16扫的亮度比较低,一般用在室内。在这里我们结合上述代码做一下分析:人眼看电视或者动态图像时,一般的帧数不能低于24帧/秒。以我们实验的这个点阵屏为例来讲,单行最大的显示延时时间是1/24/16约等于2.6ms。如果换成1/4扫,单行最大的显示时间是1/24/4约等于10ms。LED处于点亮状态的时间增加了4倍,继而整体亮度也会随之变大。
我们使用一个OLED屏来模拟一下数据的刷新,可以看到,1/4扫单行亮起的时间明显长于1/16扫。
整屏输出测试:
为了测试我们的底层驱动,我们对上述代码做一下修改,主要改动的是for循环部分。让屏幕每间隔8个像素亮、灭交替显示。
实际显示效果:
【图像取模到实际显示】
以上两节,我们已经能够点亮屏幕,下一步就是点睛之笔,如臂使指的控制它。
我们通过取模软件,自由绘制一幅32*128的点阵图像,之后将生成数组导入到程序中,看屏幕是否能按照我们绘制的图像进行显示。
取模软件我们使用PCtoLCD2002,选择图像模式,新建一个宽度是128,高度是32的图像。
PCtoLCD2002图像编辑界面
在选项中配置取模方式:阴码、逐行式、逆向(低位在前)、C51格式。
阴码:标识LED灯珠是共负极,1是亮,0是灭。
逐行式:参看整屏输出的伪代码,我们是一行一行的刷新数据的。
逆向(低位在前):HC595的驱动代码中,我们先发送的是低位。
C51格式:使用C语言的格式进行数据输出。
我们现在拖动鼠标在32*128的画布上画个图案。
之后我们点击生成、保存字模,生成的取模数据如下。我们在程序中创建一个二维u8型数组来存储这些数据。
之后将数组作为参数传入整屏输出控制函数“led_data_update”中,实际显示如下:
【结束】
到此如何驱动LED点阵屏已经基本完成,小伙伴们可以自己尝试画个图形,或者将绘制好的图案数组放到评论区,我们来帮大家呈现到屏幕上。
在之后的第三篇中,我们会尝试将一个适用于OLED屏幕的GUI移植到LED屏幕的显示控制上,通过GUI来控制点阵屏的显示。
see you soon!
注:文章中部分图片来源于网络,如侵权请联系删除。
gitee代码仓:https://gitee.com/tuZiLiaoDianLu/led_drive
<第二篇END>
道阻且长,行则将至。
欢迎大家关注“兔子聊电路”,会不定期的分享一些遇到的电路问题和一些有趣的电路设计,更欢迎大家一起交流电路设计上的心得。同时,也会分享一些有意义的非技术类书籍。
【好物推荐】
1九阳榨汁机家用多功能小型便携式水果电动榨汁杯迷你炸果机果汁机【包邮】
【推荐理由】30天热卖2千+, 赠送运费险退货无忧!
【券后价】 84.9 元
【优惠券】 25 元
5覆ZHI5$IGYRdS0kZsH$:// MF3084,打開/