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 += 1if num>9999: num=0step += 1
4.3. 效果
5. 后记
我手上有的数码管至此已经全部能点亮驱动了,也算能交个差了。当然了,数码管的驱动方式还有很多,网上也能查到一些专用的驱动芯片,每种芯片都有其独特的电路原理。
等实际遇到这些东西时再研究了,路漫漫其修远,共勉!
MicroPython-On-ESP8266——数码管的使用,2片HC595驱动四位数码管相关推荐
- 74HC595驱动四位数码管
74HC595驱动四位数码管 数码管编码 出处 硬件原理图 出处 驱动程序 出处 1.数码管编码介绍 它每一段是一个发光二极管,排成一个"日"字形.通过控制某几段发光二极管的发光来 ...
- Arduino Uno驱动四位数码管
Arduino Uno驱动四位数码管 我用的是 四位共阳极数码管 型号是5461BS-1数码管 接线方法 UNO引脚 数据码 3 1 4 2 5 3 6 4 7 A 8 B 9 C 10 D 11 E ...
- 四位数码管树莓派c语言,用树莓派和四位数码管模块做一个时钟
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 预备知识 如图,这是一个4位数码管模块,由两片 74HC595 级联控制,引脚如图,从上到下,分别为VCC(3.3V/5 ...
- TM1650芯片驱动四位数码管
文章目录 自言自语 一.芯片图 二.通讯协议 开始信号 终止信号 发送一字节数据 获取TM1650的应答 三.TM1650的各个功能 数码管显示 数码管关闭 数码管显示数字 自言自语 今天上班被丢了块 ...
- 树莓派模块化编程之TM1637驱动四位数码管
一.驱动TM1637的时序图 二.代码实现 #encoding:utf-8 import RPi.GPIO as GPIO import time GPIO.setwarnings(False) GP ...
- 74HC595/四位按键 驱动四位数码管
一.主要元器件和原理 GD32F303RCT6 74HC595 共阳数码管 按键(图片数码管名字有误) 风中凌乱的笔记: A1A2A3A4下拉工作模式.给A1A2A3A4一个低电平.当abcdefg来 ...
- STM32 经过TM1637驱动四位数码管
产品简介 代码 TM1637.H ```c#ifndef __TM1637_H #define __TM1637_H #include "sys.h"#define GPIO_CL ...
- 【K210+micropython】驱动HS420561k-32四位数码管显示数字
[K210+micropython]使用HS420561k-32四位数码管显示数字 文章目录 [K210+micropython]使用HS420561k-32四位数码管显示数字 相关知识准备 一.四位 ...
- MicroPython-On-ESP8266——数码管的使用,四位数码管及动态扫描显示
MicroPython-On-ESP8266--数码管的使用,四位数码管及动态扫描显示 1. 四位数码管介绍 上一节里面介绍了数码管的分类以及初步学习了一位数码管的驱动方式,一位8段数码管就需要有8个 ...
最新文章
- Django 图片上传upload_to路径指定失效的问题记录
- 他研究了5000家AI公司,说人工智能应用该这么做!
- linux路由内核实现分析(四)---路由缓存机制(2)
- TorchNet的学习笔记
- 马斯克:我是Rust粉丝,但我选择C
- Atom 备份神器 —— Sync Settings
- 通过mapreduce把mysql的数据读取到hdfs
- 【Flutter】微信项目实战【08】 聊天界面搭建(上)
- 项目中的设计模式【工厂方法模式】
- 自定义头文件之二------hlib.h(慢慢更新)
- css 选择器的应用
- matlab 产生任意概率密度的联合分布
- arcgis中 shift数据重新定义投影_【更新82篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
- 微软云 Azure 云服务器 Web应用服务云计算解决方案
- 视频如何批量去除水印
- 分享9个加快houdini渲染的技巧,快来学习一下
- PDF格式分析(六十六) Text 文字——简单字体
- Python pip 安装与使用
- 微星GE62 2QC-264XCN刷黑苹果详细教程亲测有效,完美双系统,双屏!
- Android Studio 实现地图定位(移动开发技术作业)
热门文章
- ZynqMP Vitis PS加载PL代码
- location选择收货地址
- 转行了!文科生转程序员的外包工作经历分享
- UndoManager教程
- 最新PS 2020版发布!逆天黑科技一键P图看哭设计师!
- 微信公众号菜单栏设置直接打电话拨号一键拨号
- 4k纸是几厘米乘几厘米_4k纸多大,纸张的大小规格
- 基于Python的OpenCV+TensorFlow+Keras人脸识别实现
- 运维入门之CPU平均负载及问题排查
- word饼图如何画引导线_#excel表格饼状图制作#如何在饼形图中添加引导线(Excel)...