MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管

MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管

1. 背景

前面在使用四位数码管时,需要用来12个GPIO接口,结果咱micropython能驱动的esp8266开发板只有9个口能用,导致只能驱动两位数码管。还好动态扫描的机制是用到了。

这回来学习第三个数码管,由两片72HC595位移寄存器芯片驱动的四位数码管。

在这里插入图片描述

2. 位移寄存器芯片74HC595

先了解一下这个74HC595芯片(收下简称595)是个什么东西又是如何工作的。

2.1. 595原理图

在这里插入图片描述

符号 引脚 描述
Q0–Q7 第15脚,第1-7脚 8位并行数据输出 (DS引脚送进来的位数据可以依次推入到这8个位,实现了“串入并出”的效果。8个输出刚好可以用来控制数码管的8个段码,或者控制位码(理论上能控制八位的数码管))
GND 第8脚
Q7’ 第9脚 串行数据输出
(移位寄存器只有8个,再继续向里面送数据时,最开始的位会出这个引脚溢出。溢出的位可以送到下一个595芯片,这样就能实现无限串联了。)
/MR 第10脚 主复位(低电平清零数据,通常都是接到VCC用防止数据被清掉)
SH_CP 第11脚 数据输入时钟线
ST_CP 第12脚 输出存储器锁存时钟线
/OE 第13脚 输出有效(低电平有效,通过控制这个引脚可以产生数码管闪烁的效果(一开一关就是闪嘛))
DS 第14脚 串行数据输入(接收数据位的引脚,如果是串联的话就是按上一片595芯片的Q7’引脚)
VCC 第16脚 电源

2.2. 595使用流程

上面引脚说明里面,已经把除了 SH_CP 和 ST_CP 之外其他引脚的注意事项写进去了,最核心的两个单独说明一下:

首先595芯片是有两个寄存器的:

  • 移位寄存器:负责将DS引脚当前的数据状态推入到Q0数据位,同时Q0->Q1->Q2–>Q3–>…–>Q7会依次都向后推一位,可以想象成左轮手枪,你塞一颗子弹就要轮一下轮子再塞下一颗子弹,每轮一下那所有子弹的位置就都顺移了一下。
  • 存储寄存器:把当前输出到位移寄存器中的数据锁定到Qx引脚上并保持不变。就像你把左轮的子弹塞满或不再填充后,把轮子推到枪体上了,那位置就固定下来了。

问题来了,DS引脚用来塞子弹,那啥时候转一轮子(产生位移)、又啥时候把左轮推进去(锁存)呢?这就需要用到595芯片的另外两引脚了。

  • SH_CP(11脚):该引脚上升沿时数据寄存器的数据进行移位。
  • ST_CP(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。

也就是说咱们平常把这两个引脚的电平置低,需要移位时就把SH_CP拉高一下,需要锁存时就把ST_CP引脚拉高一下,只要很段的时间就可以了。短到微秒级别,咱们在micropython里面都没有微秒级别的延时函数,直接不延时就行了。

3. 两片595驱动数码管的原理

咱们从手上这个数码管模块的原理图来分析
在这里插入图片描述
1)首先它这里对引脚名称的定义跟上面不一样,没关系,仔细对比一下就看明白了:

  • SER引脚就是DS引脚,用来装子弹的,在封装的模块上引出弯头针对,丝印名是DIO
  • SCLK引脚用来控制位移
  • RCLK引脚用来控制锁存到Qx数据口
  • QA-QH共8个数据输出口(跟上面Q0-Q7一样的)

2)上半部分数码管的引脚图就不用理会了,段码A到DP,四个数码管从左到右分别为DIG0到DIG3。下半部分两片595,通过蓝色圈起来的部分能看出,左边第一块芯片只用出4个位来控制DIGx,能实现用高电平点亮指定的管位;右边第二块芯片,用满8个位输出刚好对应到数码管的段码上。

3)右边的595芯片的数据输入是由左边芯片溢出得到的(SER引脚接入到了左边的QH’输出)。那咱们要想驱动数码管点亮,就要先将显示数字的段码输出到DIO引脚,再把数字显示在哪个管位上的位码输出到DIO引脚,然后一锁存这样就齐活儿了。

4)还要强调一下,根据当前的驱动方式,要想在数码管不同的位上显示不同的数字,还是需要用到动态扫描的原理的,也就是利用人眼视觉暂留的机制快速变换不同的位码。只不过咱们不需要手动来控制DIGx开关,直接向595输入不断变化的位码就行了。

4. 实验:点亮数码管并显示自增长的数字

4.1. 接线图

在这里插入图片描述
在这里插入图片描述

4.2. 实验代码

from machine import Pin
# import utime

# 准备数据引脚
pin_sclk = Pin(4, Pin.OUT); pin_sclk.off()  # 上升跳变时锁存
pin_rlck = Pin(0, Pin.OUT); pin_rlck.off()  # 上升跳变时数据位移
pin_dio = Pin(2, Pin.OUT); pin_dio.off()    # 待移入数据位

mapper = {  # 共阳方式段码对照
    '0': 0xC0, '1': 0xF9, '2': 0xA4, '3': 0xB0,
    '4': 0x99, '5': 0x92, '6': 0x82, '7': 0xF8,
    '8': 0x80, '9': 0x90, 'A': 0x88, 'B': 0x83,
    'C': 0xA7, 'D': 0xA1, 'E': 0x86, 'F': 0x8E,
}

def jump_up(pin):
    pin.on()  # 产生跳变
    # utime.sleep_ms(1)
    pin.off()  # 保持一段时间后关闭

def send_data(num, is_position=False, has_point=False):
    '向位称寄存器送数据'
    if is_position:  # 位码处理( 1~4位)
        value = {1:0x01, 2:0x02, 3:0x04, 4:0x08}.get(num, 0)
    else:  # 段码处理
        value = mapper.get(str(num), 0)
        value = value & 0x7F if has_point else value  # 共阳方式
        # value = (~value | 0x80) if has_point else ~value  # 共阴方式
    for i in range(8):
        pin_dio.value(1 if (value << i) & 0x80 else 0)  # 从最高位开始送数据
        jump_up(pin_sclk)  # 每送完一位后就让位移寄存器跳变一下

num = 0
step = 1
while True:
    # 显示千位
    send_data(int(num/1000))
    send_data(4, is_position=True)
    jump_up(pin_rlck)
    # 显示百位
    send_data(int(num / 100 % 10))
    send_data(3, is_position=True)
    jump_up(pin_rlck)
    # 显示十位
    send_data(int(num / 10 % 10))
    send_data(2, is_position=True)
    jump_up(pin_rlck)
    # 显示个位
    send_data(int(num % 10))
    send_data(1, is_position=True)
    jump_up(pin_rlck)

    if step%100==0:
        num += 1
        if num>9999: num=0
    step += 1

4.3. 效果

在这里插入图片描述

5. 后记

我手上有的数码管至此已经全部能点亮驱动了,也算能交个差了。当然了,数码管的驱动方式还有很多,网上也能查到一些专用的驱动芯片,每种芯片都有其独特的电路原理。
等实际遇到这些东西时再研究了,路漫漫其修远,共勉!

版权声明:本文为CSDN博主「fatway」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fatway/article/details/121276336

生成海报
点赞 0

fatway

我还没有学会写个人说明!

暂无评论

相关推荐

AD原理图设计与Clion源码工具学习

一、AD绘制电路原理图 1.准备工作 下载Altium Designer,具体安装步骤以及百度网盘分享参考:Altium Designer2018下载安装及基本使用 STM32F103C8T6元件库&#xff1a

单片机物联网升级方案

单片机物联网远程升级方案,直接上干货 一般消费级产品,为了性价比,选用的mcu,一般资源很有限,以stm32103c6t6为例 ram 20k rom64k,主

i.MX6Q满负载高温测试

1.测试目的 测试i.MX6Q核心板处理器在高温满负载情况下工作情况与处理器温度,辅助指导产品设计与结构设计的散热方案。 2.测试准备 武汉万象奥科电子有限公司主板HD6Q-IoT(支持双千兆网、多串口、4G、W