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

2023-11-13

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




一、数码管的分类

数码管分为共阴数码管和共阳数码管,共阴和共阳的区别就在于,输出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);
		else
			GPIO_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位数码管的显示方法以及其分析了。
如有不足,还希望指出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32学习记录——74HC595四位数码管显示 的相关文章

  • uniapp软键盘把界面顶起问题解决

    pages json文件加上解决 app plus softinputMode adjustResize pages path pages index index style navigationBarTitleText 中奥一卡通 app
  • GoJS-FlowChart样例代码分析

    var go GraphObject make 别名 方便使用 myDiagram go Diagram myDiagramDiv 通过id指定画布绑定的div LinkDrawn showLinkLabel 监听LinkDrawn事件 其
  • Canvas-drawImage无法绘图,出现空白的解决办法

    目录 文章目录 问题剖析 解决办法 例子代码 测试样例 问题剖析 在操作drawImage 函数时 经常会出现调取正常 但canvas绘制出现空白的情况 这种情况 原因可以归为 浏览器在加载图片时 图片尚未加载完毕 便开始绘图 主要原因为
  • 本地项目上传到gitlab上

    1 gitlab上新建项目 2 本地操作 进入到项目目录 打开git操作命令窗口 鼠标右键选择Git Bash Here 1 将git初始化至该目录下 会生成 git配置文件 执行命令 git init 2 将远程的仓库分支来取到本地 执行

随机推荐

  • Qt信号详解

    QAbstractButton clicked 按下松开后执行 pressed 按下后执行 released 松开后执行 clicked bool checked 需要选中checkable属性 每次点击checked的值都会切换 可以使用
  • Linux 下配置JDK 并运行springboot项目进行访问 Tomcat的安装

    前言 记忆 1 步骤 一 JDK安装 我们开发java程序必须要的环境 1 下载JDK rpm 去oralce 官网下载即可 百度jdk即可 2 安装java环境 检测当前系统是否存在java环境 java version 如果有的话就需要
  • 机器学习入门教学——人工智能、机器学习、深度学习

    1 人工智能 人工智能相当于人类的代理人 我们现在所接触到的人工智能基本上都是弱AI 主要作用是正确解释从外部获得的数据 并对这些数据加以学习和利用 以便灵活的实现特定目标和任务 例如 阿尔法狗 智能汽车 简单来说 人工智能使机器像人类一样
  • 后端转前端,该如何快速学习

    后端转前端还是比较容易的 学习难度降低了 多花点时间实操 基本可以接手项目 首先初学者要知道web前端工程师的目前核心技术 主要有HTML5 CSS JavaScript JQuery Ajax等技术 而且想要成为一名优秀的web前端工程师
  • 4月13面试网络工程师实习岗位的感想

    第一个自我介绍 说一下自我介绍吧 面试官一来就叫我自我介绍 这是必须的 然后我就说了一下我叫谁 我现在读大几 学什么专业 然后说一下平时爱听音乐 打球啊 爬山啊 爱看电影 然后说到爱看电影 面试官就笑了 然后就行了 就开始问问题了 聊聊天了
  • zookeeper、dubbo、kafka简单了解

    1 zookeeper如何实现高可用 1 zookeeper 多台构成集群实现高可用 有三种角色群首 leader 追随者 follower 观察者 observer Leader作为整个ZooKeeper集群的主节点 负责响应所有对Zoo
  • 自动化设计-框架介绍

    3 框架介绍 由于软件测试的工作量很大 40 到60 的总开发时间 而又有很大部分适于自动化 因此 测试的改进会对整个开发工作的质量 成本和周期带来非常显著的效果 通过第二部分对Ruby Watir框架的介绍 下面我们正式进入自动化测试框架
  • XSS跨站脚本攻击

    以下是自己的一些见解与总结 若有不足或者错误的地方请各位指出 目录 1 简介 2 XSS攻击的危害包括 3 XSS攻击分类 4 XSS攻击实例分析 5 XSS漏洞修复 1 简介 跨站脚本 cross site script 为了避免与样式c
  • Python~ModuleNotFoundError: No module named ‘pydotplus‘

    错误代码 import pydotplus 错误原因 没有安装pydotplus库 解决方案 安装对应的库 pip install pydotplus 重新导入模块 import pydotplus
  • 获取内网IP地址

    工作中遇到一个需求 要求根据不同场地的IP地址 显示相应的大屏页面 首先要配置一下Chrome浏览器 1 在Chrome浏览器中输入 chrome flags 2 搜索 enable webrtc hide local ips with m
  • 量化交易,关于止损止盈的一点思考

    如何设置止损止盈指标才能达到 使损失基本稳定 让盈利充分攀升 止损位设置 如果当天可以卖出 止损位就是成本 1 X 如x设为5 就是股价跌5 就止损 一般就是5 略多一点损失 略多一点是因为可能需要降价保证抛出和交易成本 如果考虑交易成本
  • webSocket详解:技术原理+前后端实现

    webSocket详解 技术原理 前后端实现 一 webSocket技术原理 1 内容简介 websocket就是通过服务器向客户端推送消息 客户端也可以主动向服务器发送消息 是真正的双向平等对话 是一种长连接 只需要通过一次请求进行初始化
  • IDEA设置

    目录 目录 双击idea时默认不打开最后一次的项目 设置黑色 白色主图 编辑 通过CTRL 鼠标滚轮设置字体大小 自动导入包 显示行号与方法分隔符 打开类多后 在多行显示 文件编码UTF 8设定 打开文件按顺序展示 推荐的插件 双击idea
  • 如何用多线程执行 unittest 测试用例实现方案

    前言 使用python做过自动化测试的小伙伴 想必都知道unittest和pytest这两个单元测试框架 其中unittest是python的官方库 功能相对于pytest来要逊色不少 但是uniitest使用上手简单 也受到的很多的小伙伴
  • 企业应该选择哪种区块链

    随着探索如何把区块链应用在各种场景 许多人就想到 也许不需要全世界的人共同参与 也不需要挖矿 我们只需要用到区块链的可信任 可追溯特性 通过较少节点达到拜占庭将军容错 于是私有链就诞生了 但私有链仍是中心化的 难以维持去中心化的优势 因此又
  • webdriver版本不匹配,重新下载webdriver后不知道应该放在哪个文件夹

    1 从官网上面按照对应的版本下载了对应浏览器的webdriver版本 我的是chrome windows 113开头的版本 2 下载并解压之后发现有很多个webdriver exe的程序 正确步骤是解压后复制exe文件放在原来的文件夹即可
  • Ubuntu根目录文件作用分析

    Ubuntu Linux的文件结构与Windows的文件结构不同 Windows将硬盘分成 等盘 也就是分成这些分区 而Linux操作系统不是把硬盘分 成这样的分区 它有一个根目录 用 表示 一个目录就相当于一个文件夹 根目录就相当于Lin
  • 360周鸿祎:互联网好产品六字法则——刚需、痛点、高频

    如何找到好的产品 它必须满足三个条件 刚需 痛点 高频 6月6号 奇虎360创始人董事长兼CEO周鸿祎走上颠覆式创新研习社的讲台 以他的产品经历 带来移动互联网产品观 干货满满 全程无尿点 课程实录分为上 下两部分 研习社根据演讲整理 未经
  • vue Antd单独隐藏Modal.confirm(this.$confirm方式)对话框的默认ok或cancel按钮

    有时候我们需要单独隐藏Modal对话框的默认确定或取消按钮 设置 footer null 会把两个按钮都隐藏 Antd有提供两个参数用于单独修改确定 取消按钮 对于确定按钮 设置 ok button props style display
  • STM32学习记录——74HC595四位数码管显示

    数模管作为STM32的一个重要外设 由于其成本低 稳定 被用于许多场景中 本篇文章来介绍下四位数码管的使用方法 数码管显示 一 数码管的分类 二 74HC595芯片 串入并出 三 原理图 四 代码主要操作 五 代码分析 1 void HC5