嵌入式技术
前面几篇我们学习了如何利用一片或多片级联的74HC595芯片来驱动显示数码管的方法。最开始我们提出的两个问题:
第一个问题已经利用级联的74HC595解决了。(不管驱动几只数码管,只用3个IO即可)
但第二个问题依然存在,树莓派仍然需要不停地访问IO口进行动态扫描。
好,既然动态扫描占用CPU资源太多,那这活儿咱包出去让别人干不就行了?这就是本文主角MAX7219的特长,动态扫描这活儿MAX7219全包了,干的还比咱自己干得还好,一片MAX7219可最多支持显示8位8段数码管,还支持各种设置如亮度设置扫描位数设置等。而我们只用告诉它显示的内容就行了。
视频演示
注:下面这些图都是从MAX7219官方资料里截取出来的,官方资料文末提供下载
可以看出,MAX7219跟74HC595一样也是通过DIN引脚串行输入数据,在CLK引脚的上升沿移入移位寄存器,在LOAD引脚的上升沿将位移寄存器的数据复制到内部的各种寄存器里。不同的是:
我们再看一下官方文档里关于各引脚的功能说明:MAX7219各引脚的功能说明
上面提过的不再赘述,说一下MAX7219特有的引脚。
MAX7219内部的各模块的示意图:MAX7219内部的各模块的示意图
最下面是一个16位的移位寄存器D0-D15,跟74HC595一样,通过DIN引脚串行输入数据,在CLK引脚的上升沿移入移位寄存器。
D8-D11这4位数据用来指定内部寄存器地址。D0-D7是具体要传到寄存器里的数据。
上面的图看上去有点复杂,其实简单地说就是我们每次要串行传输16位数据进去,然后在LOAD的上升沿,根据D8-D11指定的寄存器地址,将D0-D7存放在指定的寄存器里。这样多次传输数据就可以给所有的寄存器设值了。
下面是MAX7219内部的寄存器一览:
显示器测试寄存器
每个寄存器都有自己特殊的功能,后面我们会逐一介绍。
串行传输时的数据格式如下:MAX7219串行数据格式
你可能注意到了这幅图的顺序跟模块示意图里移位寄存器的顺序是相反的。
D15-D0这个反向的顺序是你写代码时串行传输数据时的顺序,先传D15的数据,再传D14,D13…D0,这样传输完成后。实际的数据顺序就变成了D0,D1,D2…D15。为了便于编码,除了模块示意图是按实际顺序记载的,后面所有数据格式的示意图都是倒序记载的。
各寄存器地址如下:MAX7219寄存器地址
关断寄存器的数据格式:MAX7219关断寄存器的数据格式
译码模式寄存器的数据格式:MAX7219译码模式寄存器的数据格式
译码模式下的原码和译码的对应表:MAX7219译码模式下的原码和译码的对应表
非译码模式下的数据和数码管各段的对应表:MAX7219非译码模式下的数据和数码管各段的对应表
亮度寄存器的数据格式:MAX7219亮度寄存器的数据格式
扫描限值寄存器的数据格式:MAX7219扫描限值寄存器的数据格式
显示器测试寄存器的数据格式:MAX7219显示器测试寄存器的数据格式
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
#!/usr/bin/env python# encoding: utf-8import RPi.GPIOimport time# 串行数据输入DIN = 13# 时钟脉冲信号——上升沿有效LOAD = 26# 打入信号————上升沿有效CLK = 19RPi.GPIO.setmode(RPi.GPIO.BCM)RPi.GPIO.setup(DIN, RPi.GPIO.OUT)RPi.GPIO.setup(LOAD, RPi.GPIO.OUT)RPi.GPIO.setup(CLK, RPi.GPIO.OUT)# 传输一个8位数def setByte(byteData):for bit in range(0,8):# 传入的数字从高位到低位依次判断是否为1,若为1则设置高电平,否则设置低电平# 判断的方法是先向左移位,把要判断的位移动到最高位然后跟0x80(1000 0000)相与,# 如果结果仍然是0x80(1000 0000)就表示最高位是1,否则最高位就是0if ((byteData<
全部0条评论
快来发表一下你的评论吧 !