MicroPython-On-ESP8266——数码管的使用,从一个8段管开始

1. 数码管分类

1.1. 背景

这段时间一直在忙其他项目,基于esp8266的micropython学习搁置好久了。应网友要求,要写一篇数据管的学习教程,那咱就安排上。

1.2. 什么是数码管

什么是数码管,这个我都没有去查百科什么的,不做官方回答啊,只是告诉大家,他里面就是几个led灯组合在一起,摆成个8字型,这样点亮不同部位的led灯就能组合出需要的数字出来了。

因为是组全了多个led灯,要接线在一起又要独立控制,就有了两种接线方式。

  • 正极接在一起,独立控制负极的电平来实现点灯,叫共阳方式;
  • 负极接在一起,独立控制正极的高低电平,叫共阴方式;

看图更好理解,下图是共阴的连接方式,led全都反过来的话就是共阳。


另外说明一下,从图上看A~G一共7个led二极管组成个8字型,只有这7个时就是7段,而8段数码管是多出了右下角一个小数点位。

1.3. 上道具

东拼西凑地找来了几个不同类型的数码管。因为我也是头次学习,上网查资料找手册,过程中难免会有些岔路,最终效果能出来,但实现上可能不是最优解,所以看官们发现有错误的地方欢迎指正啊,先谢过!


看上图,我拿到手有三种数码管,按从左到右依次是:

  • 一位8段共阳数码管(YH5611BH)
  • 四位8段共阴数码管(HS420361K-32)
  • 封装成模块的四位8段数码管(使用两片74HC595位移寄存器驱动)

准备依次学习,难度逐步升级!

2. 认识8位数码管结构

2.1. 数码管结构


YH5611BH一位8段共阳型数码管,原理图直接找过来了,咱们分析一下:

  • 原理图左边封装尺寸咱就不管它了,重点是右边三个图,右上角标注了带小数点的8字型led的名称,从上面横划开始顺时针旋转依次标注了从A到G的名称,小数点名称是DP;
  • 右中俯视图,从左下角开始逆时针旋转来数引脚,分别是从1到10一共10个引脚;
  • 最下边电路图,3/8引脚(数码管上下两排是正中间引脚)都连接到了led的正极(所以是共阳型),其他引脚也分别标注了与8个段位名称的对应关系
    • 引脚1 <—> E段负极
    • 引脚2 <—> D段负极
    • 引脚3 <—> 正极负极
    • 引脚4 <—> C段负极
    • 引脚5 <—> DP段负极
    • 引脚6 <—> B段负极
    • 引脚7 <—> A段负极
    • 引脚8 <—> 正极
    • 引脚9 <—> F段负极
    • 引脚10 <—> G段负极

其实把引脚按顺序对应到A~G/DP不是更好嘛,直观又清晰。应该是内部走线决定不能直接对应吧。。。

2.2. 驱动原理

为了验证上面的对应关系,我把数码管插面包板上,然后用跳线直接把各个引脚怼到5V电源上试,结果啪啪响了几下,有些段位先是点亮然后就是点响,给烧穿了。。。

妈呀出师未捷身先死,不过好歹算是验证了人家那引脚真的就是那么对应的。

2.2.1. 显示一个数字的方法

如果我要让数码管显示一个数字,那点亮组成该数字的段位led就行嘛。比如我要显示数字”0“,那就是要将A/B/C/D/E/F这几个段位对应的引脚置为低电平,将不需要点亮的G/DP置为高电平,那就能得到想要的效果了。

但是总不能每次想要一个数字,就要编写8行代码,一个个处理引脚吧。8个段位刚好可以对应到计算机一个字节的8位,那咱们就可以用一个字节来存储8段led的整体状态了。
网上大把51单片机教程在处理数码管时都是这样操作P0/P1之类,因为51单片机一个IO口刚好用8位寄存器来存储8个引脚的值。虽然咱们ESP8266不是这样的机制,但这种操作方式咱们也学过来。


我用表格整理出来显示各种字段对应的段位高低电平值,和用十六进制表达出来的数值。
小数点位比较特殊,一般需要单独处理一下。其实从上面表格来看也很容易实现,只需要把十六进制数的最高位置为低电平即可,那就是把原数值”&0x7F“一下就可以了(二进制 0111 1111,与任何数都可以实现最高位清0,其余位保持不变)。比较显示”3“时,用十六进制表示为0xB0,那显示”3.“则是 0xB0 & 0x7F = 0x30

那咱们基本就能确定驱动一个8段数码管的流程了:
STEP 1、准备工作,定义好引脚与段名的对应关系(主要由实际接线决定),
STEP 2、定义好待显示字符与十六进制数值的对照字典,
STEP 3、将十六进制数值转换为引脚电平值,输出GPIO电平状态即可。

3. 驱动8段数码管

3.1. 开发板与数码管接线

接线我是按D0到D7顺序来接,主要是考虑走线走线方便,接好后关键是找出上面STEP1中提到的对照关系。

写起来有点啰嗦,不展示了,直接看下面代码里面注释吧

3.2. 驱动代码

这里比较简单,就直接贴完整代码,不分段讲解了。

''' 8段数码管点亮实验接线图      数码管引脚   ESP8266     数码管段位10  ->  D0(GPIO 16)  -> G10 9 8 7 6       9  ->  D1(GPIO 5)   -> F| | | | |       8  ->  3.3V                     ---A---|-----------|     7  ->  D2(GPIO 4)   -> A       F|     |B| YH5611BH  |     6  ->  D3(GPIO 0)   -> B        |--G--||-----------|     5  ->  D7(GPIO 13)  -> DP      E|     |C| | | | |       4  ->  D6(GPIO 12)  -> C        ---D---  *DP1 2 3 4 5       2  ->  D5(GPIO 14)  -> D1  ->  D4(GPIO 2)   -> E要根据实际接线来调整顺序
'''
from machine import Pin
import utimeleds = []
for p in [4,0,12,14,2,5,16,13]:# 需要根据实际接线,依次放入A/B/C/D/E/F/G/DP这8个段位led灯对应到esp8266的GPIO引脚_pin = Pin(p, Pin.OUT)leds.append(_pin)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 show_num(num, has_point=False):'写入显示字符,转换为十六进制数值并按位点亮'value = mapper.get(num, 0)if not value: returnvalue = (value & 0x7F) if has_point else value  # 共阳方式# value = (~value | 0x80) if has_point else ~value  # 共阴方式for i,led in enumerate(leds):led.value((value >> i) & 0x01)while True:# 从0开始显示0~9加A~F字符for num in '0123456789ABCDEF':show_num(num)utime.sleep_ms(500)# 再显示一轮带小数点的for num in '0123456789ABCDEF':show_num(num, True)utime.sleep_ms(500)

3.3. 实验效果

代码里面依次展示一轮从0到f的显示,和一轮带小数点的0到F的显示。上效果。

后记1:眼尖的应该能从图上看出来,这个效果图跟上面接线图里面的数码管不一样,额。。。 前面提到了,那个一位的数码管被我点爆了。。。 只能先用四位的数码管展示效果出来了。
这个四位的数码管是共阴型的,所以代码show_num函数里面我注释掉的地方是按共阴方式处理的,其实原理就是把现在算出来的每一位都取反。

后记2:一位数码管相对是最简单的,们先掌握了再说,下一步准备进阶4位数码管。

MicroPython-On-ESP8266——数码管的使用,从一个8段管开始相关推荐

  1. MicroPython实现ESP8266 控制电子墨水屏(SPI)

    最近15元淘了一块电子墨水屏,合宙家的产品.看评论是可以用微雪的代码驱动,于是找了微雪的代码,顺便翻了下读取BMP的代码,做了个小DEMO玩玩.手头几个ESP32都用了,只好翻了个旧的8266去写代码 ...

  2. 【数码管/定时器/中断】一个定时器控制数码管显示

    两种方式实现 /*用定时器以间隔500MS在6位数码管上 依次显示0.1.2.3-.C.D.E.F,重复.*/ /*轮流在每一位数码管上显示*/ --------------------------- ...

  3. micropython中文社区 socket通讯_基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)...

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 实验目的 - 学习ESP8266模块(ESP-01) ...

  4. ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)

    由于上次模拟SPI驱动TFT屏幕太慢,所以,本次采用硬件SPI来进行驱动,但是,当我直接把对应SPI接口更换时,发现TFT屏幕驱动并没有因此得到好转,依然是非常的满,然后只能从对应花点铺色,显示字符串 ...

  5. 基于MicroPython的ESP8266连接外设IO(二)

    目录 红外接收模块VS1838B 红外接收模块VS1838B 参考链接 参考链接2 本次使用的红外模块为VS1838B,遥控器采用NEC编码协议,下面为遥控器键码表和NEC协议波形图 下面是测试过程中 ...

  6. 接口技术七段数码管c语言,031 实例7-七段数码管绘制

    [TOC] 一."七段数码管绘制"问题分析 1.1 问题分析 七段数码管 需求:用程序绘制七段数码管,似乎很有趣 该怎么做呢? turtle绘图体系 --> 七段数码管绘制 ...

  7. 数码管静态显示到动态显示——六位8段数码管(共阴极)按顺序间隔1s显示数字1~6

    数码管静态显示到动态显示 2021-01-21,51单片机学习笔记 六位8段数码管(共阴极)按顺序间隔1s显示数字1~6 代码: /********************************** ...

  8. 【STC89C52】数码管静态显示和动态显示

    今天我跟大家分享的是数码管静态显示和动态显示实验的学习笔记,希望对你有所帮助!!!如果有什么错误欢迎评论区留言指正!!! 目录 一.原理图分析 二.静态显示 ​编辑 三.动态显示 一.原理图分析 1) ...

  9. 测试CH340C的功能,制作MicroPython ESP8266,ESP32下载器

    ▌01 CH340C USB-UART芯片 CH340C 是沁恒公司的USB-UART的转换芯片.在 CH340E USB转串口 IC测试电路 测试了CH340E的基本功能.为了制作 ESP8266以 ...

最新文章

  1. lwip协议栈中超时定时器实现原理
  2. Elastic Search入门:架构说明及Docker方式体验
  3. VMware VIC
  4. 初探EntityFramework——空Code First模型
  5. C++ #define参数问题
  6. oracle中update补空格lpad,Oracle lpad 函数
  7. mysql applicationcontext.xml_配置applicationcontext.xml文件
  8. php 树结构遍历,php 递归遍历树
  9. 30、vue 过滤器(filters)
  10. SpringMVC核心
  11. Kepserver如何连接InTouch
  12. 【学习笔记】尚硅谷大数据项目之Flink实时数仓---DWD和DIM
  13. Skyline软件二次开发初级——3如何在WEB页面中的三维地图上创建几何对象
  14. redis通过hscan导入大hash key
  15. 推荐几款实用的内网穿透工具
  16. 北京15家颜值爆表的餐厅!90%的妹纸来这里都不是为了吃饭
  17. 导航栏保持居中并使用swiper作为轮播图进行背景轮播背景
  18. 基于javascripts的语法特性使用设计原则
  19. 程序员求职面试谈工资的技巧 + 防坑指南
  20. 配置IPSAN得multipath服务,实现多路径

热门文章

  1. 凸优化—凸松弛(Convex Relaxation)
  2. java重绘jbutton_用Java着色JButton
  3. 一文搞懂前台,后台,中台,前端,后端,管理端,业务端,技术中台,业务中台,数据中台,物联网中台到底是什么?
  4. awk命令详解(大全)
  5. request to https://registry.npm.taobao.org/jsprim failed, reason: connect ETIMEDOUT 错误解决方案
  6. MSP430 5xx/6xx 定时器A增计数模式编程实例
  7. CornerNet: Detecting Objects as Paired Keypoints论文笔记(详细)
  8. 整体理解抽象、封装、继承、多态
  9. Ubuntu设置终端打开时的默认窗口大小和位置坐标
  10. 用Excel编辑SQL脚本