此款数码管采用74HC595芯片能够将8位串行输入转化为并行输出(三态输出)的芯片,并且能够通过级联的方式进行拓展。芯片是由1个8bit移位寄存器、1个8bit存储寄存器、1个8bit的( 三态) 输出端口。(注:三态输出指的是 高电平(1)、低电平(0)、高阻态(Z)三种状态)当多个设备共用总线时,高阻态可用作来避免总线冲突,如如I2C、SPI总线中,从设备(Slave)在不通信时输出高阻抗。


DS:串行数据输入端口,与FPGA相连接,通过该端口将串行数据移入到移位寄存器当中,如果输入的数据超过8bit,如:输入了14bit数据,那么最前面输入的6bit数据将会通过Q7S输入到级联的另一块74HC595芯片中。
SHCP:移位寄存器时钟输入,上升沿时将串行数据移入到移位寄存器中。
STCP:存储寄存器时钟输入,上升沿时将移位寄存器中的数据移入到存储寄存器中。
OE(上划线):低电平有效,将存储寄存器中的数据通过Q0~Q7输出。
MR(上划线):低电平有效,复位端口。
静态数码管显示
数码管对于初学者来说,可能最大的难题就是硬件的时序。此次以上数码管的相关知识,对模块实例化的意义、各个模块之间的关系有了认识,对testbench的实质有了更清晰的认知,也了解到了工程中时序的重要性。重点在于74HC595的STCP、SHCP以及串行输入数据(包括段选和位选)之间的时序逻辑。对于STCP主要注意锁存时机。SHCP则要把握对串行输入数据的采样时刻,注意建立时间和保持时间,RTL视图如下:

仿真波形


6位8段数码管,需要6bit来位选,8bit来段选,也就是14bit的串行数据,通过74HC595芯片转换后并行输出到数码管。对sys_clk(50MHz)进行了4分频,得到了shcp(应该是74HC595最大工作频率达不到50MHz)。注意事项:shcp需要保证在ds的中间采样(满足建立时间和保持时间),stcp需要保证完成14个shcp后进行锁存输出。
以下我们以树莓派RP2040芯片的单片机为例来进行演示实际效果,首先将数码管与单片机进行连接(如下图)
树莓派3.3V——数码管VCC
树莓派GND——数码管GND
树莓派GP18——数码管SDI
树莓派GP17——数码管SCLK
树莓派GP16——数码管LOAO

代码功能介绍:分别测试一位至四位数字显示和滚动效果。运行代码后每次将GP0引脚接GND一次,就会触发四位数字滚动,然后随机显示一组四位数。(GP1引脚显示三位数,GP2引脚显示二位数,GP3引脚显示一位数)
| 四位数码管Python源代码 下载这个源代码上传至树莓派pico文件内,直接运行查看显示数据(如下图) |
如果你还没有搭建好树莓派Python编程环境可参考这个帖子→:如何搭建Python编程环境

运行代码后,引脚接一次GND可触发一组不同数字(GP0显示四位数,GP1显示三位数,GP2显示二位数,GP3显示一位数)
| 以ESP32-S3为例,务必按下图标识接线,不可接反否则烧毁设备 |

| 74HC595 下载这个源代码直接用Arduino IDE编译上传程序查看反馈数码管显示效果(如下图) |
如果你还没有搭建好树莓派Python编程环境可参考这个帖子→:如何搭建Python编程环境

显示效果:
本次使用ESP32-S3 控制 74HC595 数码管代码的核心逻辑可拆解为以下 3 个主要部分:
1. 硬件通信机制(hc595_shift 与 hc595_latch)
数据串行传输(shiftOut):调用 hc595_shift 时,ESP32-S3 在 SCLK 时钟脉冲的配合下,将 8 位的段码数据按最高位优先(MSBFIRST)一位一位地推入 74HC595 的移位寄存器中。
数据锁存更新(hc595_latch):给 RCLK 引脚一个先拉低、再拉高、再拉低的方波脉冲,将移位寄存器里的数据一次性锁存到输出寄存器,从而更新数码管的引脚输出。
2. 多位显示与级联逻辑(display_same_number)
该模块采用了 4 片 74HC595 级联(或内部译码)架构,无需 ESP32 进行微秒级的动态扫描。
依据 Python 参考代码中的输出顺序,函数连续向芯片推入 4 个相同的段码字节(分别对应:个位、十位、百位、千位)。
四个字节全部推完后,调用一次 hc595_latch(),即可让 4 位数码管同时稳定显示同一个数字。
3. 主程序控制流程(setup 与 loop)
初始化 (setup):将 SDI、SCLK、RCLK 设置为输出模式并拉低。首先向模块推入 4 个 seg_table[10](全暗段码 0xFF)进行清屏并延时 1 秒。
主循环 (loop):利用 for 循环使数字从 0 依次递增到 9。每次循环调用 display_same_number(digit) 更新显示(例如 0000、1111 ...),并借助 delay(1000) 让每个数字稳定保持 1 秒。
联系人:张工
电话:0755-32914578
QQ:2251000002
微信:扫下方二维码添加,请备注来意
提供:人工智能,IOT物联网,工控数显,嵌入式软硬件开发,科创教育,产品定制,生产,方案解决...