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

2024-02-05 08:32

本文主要是介绍STM32学习记录——74HC595四位数码管显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数模管作为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位数码管的显示方法以及其分析了。
如有不足,还希望指出。

这篇关于STM32学习记录——74HC595四位数码管显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680328

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效