STM32学习记录——74HC595四位数码管显示

article/2025/11/9 14:46:33

数模管作为STM32的一个重要外设,由于其成本低、稳定,被用于许多场景中。本篇文章来介绍下四位数码管的使用方法。


数码管显示

  • 一、数码管的分类
  • 二、74HC595芯片(串入并出)
  • 三、原理图
  • 四、代码主要操作
  • 五、代码分析
    • 1.void HC595_GPIO_Configuration(void);
    • 2.void HC595_Send_Byte(unsigned char byte)
    • 3.void HC595_Send_Data(unsigned char num, unsigned char show_bit);
    • 4.void display(unsigned int n)
  • 总结



一、数码管的分类

数码管分为共阴数码管和共阳数码管,共阴和共阳的区别就在于,输出1还是输出0的时候,能点亮数码管的一小段。

在这篇文章中,所使用的是由两片74HC595芯片控制的4位数码管
在这里插入图片描述

在这里插入图片描述
挂几张图

二、74HC595芯片(串入并出)

该芯片是一个8位串行输入、并行输出的位移缓存器。(缓存器在控制数码管中具有重要作用)
芯片引脚图
16个管脚分别对应的作用Q0~Q7:并行输出
Q7’:串行输出
SH_CP:移位寄存器时钟输入
ST_CP:存储寄存器时钟输入
DS:串行输入

使用两片74HC595芯片,第一片74HC595芯片的Q7口,也就是串行输出口可以向下一片的74HC595芯片的串行输入口输入数据。
第二片74HC595芯片是用于控制数码管输出显示,而第一片74HC595芯片只使用了QA、QB、QC、QD四个管脚来储存信息。

两片74HC595芯片之间的联系

三、原理图

原理图
对于4位的数码管模块,接线选择为

VCC------------>供电
DIO------------>PB13
RCLK------------>PB12  当八个数据完全传入缓冲区,此时拉高RCLK,八位数据便可以一次性全部输出。
SCLK------------>PB15   控制串入的时钟信号线,当有一个上升沿,便传入一个数据。
GND------------>接地

本文主要使用PB13 、PB12 、PB15 来控制数码管的显示数据。
以下使用数码管也是以这三个端口进行分析。

四、代码主要操作

主要是由以下四个函数构成:

void HC595_GPIO_Configuration(void);
void HC595_Send_Data(unsigned char num, unsigned char show_bit);
void HC595_Send_Byte(unsigned char byte)void display(unsigned int n);

五、代码分析

1.void HC595_GPIO_Configuration(void);

该函数主要是使能接在4位数码管的主要GPIO口,如上文提到的一般:

/************************
VCC------------>供电
DIO------------>PB13
RCLK------------>PB12  
SCLK------------>PB15  
GND------------>接地
**************************/unsigned int num[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0x00};
//创建一个数组,0-9所对应的十六进制数void HC595_GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET);
}

作用:使能相应管脚,并将其全部拉低。

2.void HC595_Send_Byte(unsigned char byte)

/*********************************
参数:byte 所传入的数据,是要显示的数字或者是对应显示的位数
**********************************/
/************************
VCC------------>供电
DIO------------>PB13
RCLK------------>PB12  
SCLK------------>PB15  
GND------------>接地
**************************/
//串入
void HC595_Send_Byte(unsigned char byte)
{unsigned int i;for(i = 0; i < 8; i++){if(byte & 0x80)GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET);elseGPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET);GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);Delay_us(10);GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_SET);Delay_us(10);byte <<= 1;}
}

作用:发送字节到74HC595芯片的缓冲器中。
分析:发送的过程很重要,需要搞清所使用的芯片是先低位发送还是先高位。
如图:
时序图
由74HC595的芯片手册可以知道:74HC595芯片的发送顺序是由QA,一直到QH,到目前为止,我们虽然清楚了该芯片的发送顺序,但是仍然不知道QA和QH究竟哪个是高位。
而在该数据手册中,还可以发现:

这张图很明显的说明了问题的关键——QA是高位,QH是低位。
由此我们知道了这个芯片是先写入最高位,再依次发送到最低位。所以在该段函数中,我们通过该数据与(&)0x80,取出最高位,通过DIO口输入1/0,由于之前所提到的,唯有SCLK到达上升沿的时候,数据才能传入,于是我们在每次循环输入数据的时候,都将SCLK(PB13)拉高10us ,然后再将所要输入的byte左移一位,继续循环。
由于两片74HC595芯片的作用,当第一片74HC595芯片的缓冲区八位都存在数据的时候,此时DIO口继续输入数据,则将会将已有数据顶置到下一片74HC595的缓冲区。
因此所要显示数字的数据传入完成后,继续传入其所要求显示的数码管位置,该过程也同理于数字数据的传输过程。

3.void HC595_Send_Data(unsigned char num, unsigned char show_bit);

/*********************************
参数:num 所要显示的数字,show_bit 所显示的位数
**********************************/
/************************
VCC------------>供电
DIO------------>PB13
RCLK------------>PB12  
SCLK------------>PB15  
GND------------>接地
**************************/
//并出
void HC595_Send_Data(unsigned char num, unsigned char show_bit)
{HC595_Send_Byte(num);HC595_Send_Byte(1 << show_bit);  GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);Delay_us(10);GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);Delay_us(10);
}

作用:控制4位数码管的显示位置以及显示的数字
分析:该函数使用之前所定义和编写的void HC595_Send_Byte(unsigned char byte)函数继续工作,需要注意的是,当数据和位置全部输入后,需要拉高RCLK(PB12)的电平,使其完成显示。

4.void display(unsigned int n)

最为关键的显示函数


void display(unsigned int n)
{static unsigned int thousand_bit, hundred_bit, ten_bit, single_bit;thousand_bit = n / 1000;hundred_bit = (n % 1000) / 100;ten_bit = n % 1000 % 100 / 10;single_bit = n % 10;HC595_Send_Data(num[thousand_bit], 3);HC595_Send_Data(num[hundred_bit], 2);HC595_Send_Data(num[ten_bit], 1);HC595_Send_Data(num[single_bit], 0);
}

由于void HC595_Send_Data(unsigned char num, unsigned char show_bit)此函数的显示问题,一次只能显示一个位置的数字,因此需要搭配主函数中的while(1){ }继续循环显示,利用人眼捕获的时间差,从而动态显示全部的数字。

总结

以上便是4位数码管的显示方法以及其分析了。
如有不足,还希望指出。


http://chatgpt.dhexx.cn/article/FnBYtpuT.shtml

相关文章

【74HC595】STM32 74HC595驱动程序

以下为.h文件&#xff1a; #ifndef __74HC595_H__ #define __74HC595_H__ #include "stm32f10x.h" #define SHCP_GPIO_PORT GPIOA #define SHCP_GPIO_CLK RCC_APB2Periph_GPIOA #define SHCP_GPIO_PIN GPIO_Pin_1 #defin…

RK3588+FPGA+Cameralink高速相机解决方案

1. 视频接入&#xff0c;其中可见使用LVDS&#xff0c;红外使用cameralink 2. H264低倍率压缩编码本地存储 3. H264压缩使用同步422接口或者网口UDP协议输出实时码流 4. 使用串口进行通讯&#xff0c;进行类似于可见、红外或者激光器或者地面控制软件等之间的通讯 5. 使用网…

【芯片使用】74HCHC595

实验平台&#xff1a;普中A2开发板&#xff0c;STC89C51RC芯片&#xff0c;11.0592M晶振。 文章目录 前言一、代码1.main.c2.HC595.c2.HC595.h 总结 前言 74HC595是一个8位串行输入、并行输出的位移缓存器&#xff1a;并行输出为三态输出。在SCK 的上升沿&#xff0c;串行数据…

HC595驱动数码管

74HC595是一个8位串行输入、并行输出的位移缓存器 引脚定义 Q0~Q7&#xff1a;并行输出 Q7’&#xff1a;串行输出 SH_CP&#xff1a;移位寄存器时钟输入 ST_CP&#xff1a;存储寄存器时钟输入 DS&#xff1a;串行输入 原理图 举例 共阴极数码管控制 #define uchar unsign…

保护手机号码不被应用窃取的有力措施

在使用手机过程中&#xff0c;经常遇到很多应用软件私自获取我们的手机号码并传播出去&#xff0c;导致我们手机经常接到很多莫名其妙的电话。 我们今天分享一种能够彻底屏蔽手机号码被非法获取的有效非法&#xff0c;也就是使用琢石模拟器对手机号码进行模拟&#xff0c;让应用…

安卓app服务器地址文件夹,查看安卓app的服务器地址

查看安卓app的服务器地址 内容精选 换一换 robox脚本里的docker run命令中的镜像名称要改成本地自己注册的名称。(名称为:镜像注册中的名称,也可以通过docker images查看)设置环境变量,将容器指定到GPU卡上运行。export DISPLAY=:0robox脚本中设置的DISPLAY号要与此处设置的…

虚拟手机的服务器地址和端口是什么,如何查看服务器地址和端口号

如何查看服务器地址和端口号 内容精选 换一换 本节操作介绍如何在移动设备上连接Linux实例。以iTerminal-SSH Telnet为例介绍如何在iOS设备上连接 Linux 实例,详细操作请参考IOS设备上登录Linux云服务器。以JuiceSSH为例介绍如何在Android设备上连接 Linux 实例,详细操作请参…

互联网早报:腾讯推出“微小号”,用虚拟手机号拨打电话收发短信

行业热点 1、腾讯推出“微小号”&#xff0c;用虚拟手机号拨打电话收发短信&#xff1b; 2、得物App:误操作发出数万 520 无门槛券,不是营销,订单算数&#xff1b; 3、滴滴网约车宣布进入南非市场&#xff0c;4 月将进入厄瓜多尔&#xff1b; 4、一季度抖音日活数据&#x…

数字虚拟人metahuman,苹果手机做动作捕捉

最近看到抖音上有人在卖数字虚拟人的教程&#xff0c;799元好贵&#xff0c;于是自己玩了玩&#xff0c;下面吧教程分享给大家 1.下载EPIC game模拟器&#xff0c;中文网址如下 https://www.unrealengine.com/zh-CN/metahuman-creator 点击启动应用既可以下载&#xff0c;下载…

JavaScript手机号码格式(正则表达式验证)支持最新电信199移动198联通166

最近公司项目需要对手机号进行校验&#xff0c;于是使用了“ /^1[34578]\d{9}$/ ”这个正则进行校验&#xff0c;后来测试提出当输入199开头的手机号时校验不通过&#xff0c;于是发现原来各大运营商新增加了一些新的手机号段。 以下为截止2018年1月各大运营商已知手机号码号段…

Android类似钉钉类的APP 实现禁止用户虚拟定位

参考&#xff1a;https://blog.csdn.net/mawei7510/article/details/80250416 在应用开发中&#xff0c;如果有签到打卡之类的功能&#xff0c;我们肯定需要在项目中禁止用户开启虚拟定位&#xff0c;导致在***米之外的距离模拟定位然后进行了打卡操作&#xff01; &#xff…

uni-app 实现用户点击后自动拨打指定电话号码

uni 内部提供了一个makePhoneCall函数 那我们就直接看代码 <template><view click "phone">13510657575</view> </template><script>export default {data() {return {}},onLoad() {},methods: {phone() {uni.makePhoneCall({phoneN…

移动端uni-app拨打电话

需求&#xff1a;点击电话图标&#xff0c;手机打开拨号界面并已复制电话号码 官方API&#xff1a;uni.makePhoneCall(OBJECT) | uni-app官网 很简单的一个点击事件就可以完成了&#xff1a; <view class"base-icon phone" click"goPhone(item)">…

虚拟中间号的具体用法

虚拟中间号要说怎么用&#xff0c;不如说用在哪儿。广义上来说&#xff0c;所有需要用到手机号的场景&#xff0c;虚拟码号同样也是适用的。 虚拟中间号的核心应用场景第一是“换”&#xff0c;即使用虚拟码号替换真实的手机号码&#xff0c;用这种方法实现对于真实号码的隐藏…

Delphi D10.X安卓APP开发中获取硬件信息及手机号

Demo与代码已上传到CSDN下载。 这里简单说一下代码内容&#xff0c;完整代码请自行下载&#xff0c;不清楚的欢迎留言交流。 前言 演示Demo使用了我自己开发的一个控件&#xff0c;TLayoutPro 《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》请查看并下载…

饿了么虚拟号码可以发短信吗_饿了麽APP逆向及爬虫实现详参

一、前言 今天主要以饿了麽为例,讲解一下APP逆向的大致流程,以及遇到问题的处理办法。 二、概述 APP逆向的目的是为了了解APP本身的运行逻辑,进行修改或进行还原。涉及到的技术和工具,见下图。 对于抓包我就不详细讲了,不清楚的看一下我之前的文章。 HTTPS抓包与手机抓包,…

手机app访问服务器数据库数据库文件夹,手机app怎么访问服务器数据库

手机app怎么访问服务器数据库 内容精选 换一换 华为云提供两种连接方式通过SQL Server客户端连接实例:非SSL连接和SSL连接。其中,SSL连接实现了数据加密功能,具有更高的安全性。准备弹性云服务器通过内网连接华为云关系型数据库实例,您需要购买一台弹性云服务器。创建并连接…

mysql-修改数据存储位置

前提&#xff1a;win10 &#xff0c;c盘不够用&#xff0c;将mysql存储位置改为d盘。 参考文章指路在这里&#xff1a;Windows10下配置自定义的MySQL8的数据存储路径_反反复复的昵称的博客-CSDN博客_mysql8 windows 配置文件路径 1、停止mysql的服务 2、找到文件存储的路径…

如何抓包微信小程序修改数据

如果通过手机接入电脑作为代理抓包&#xff0c;其实相对要复杂得多&#xff0c;但是有的游戏转发出来&#xff0c;在电脑端打开&#xff0c;就不能正常进行。 所以我们要解决的第一个问题是&#xff0c;在微信电脑端打开小程序&#xff0c;方法很简单。 进入游戏中&#xff0c;…

达梦数据库更改数据文件路径

在日常运维的时候偶尔会遇到由于前期磁盘规划等原因&#xff0c;或者资源限制等原因&#xff0c;在数据不断增长的情况下。要移动数据文件目录的情况。具体操作如下。 原来目录是&#xff1a;/dmdata 新目录是&#xff1a;/newdata 1.记录原环境信息。 2.停止数据库相关服务…