数模管作为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位串行输入、并行输出的位移缓存器。(缓存器在控制数码管中具有重要作用)

Q0~Q7:并行输出
Q7’:串行输出
SH_CP:移位寄存器时钟输入
ST_CP:存储寄存器时钟输入
DS:串行输入

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

三、原理图


对于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四位数码管显示相关推荐

  1. 基于STM32的四位数码管显示编程

    1.四位数码管的简单介绍 因为在学校做项目的时候使用到了数码管显示,所以就编写了一个基于SMT32的数码管显示程序.通过看手册知道这个四位数码管采用TM1637 驱动电路.内部有集成MCU数字电路接口 ...

  2. 【K210+micropython】驱动HS420561k-32四位数码管显示数字

    [K210+micropython]使用HS420561k-32四位数码管显示数字 文章目录 [K210+micropython]使用HS420561k-32四位数码管显示数字 相关知识准备 一.四位 ...

  3. 【Arduino】四位数码管显示

    程序名称:数码管静态显示 程序功能:四位数码管显示 程序版本:Ver 1.0 编写日期:2020/07/30 作者信息:天津科技大学创新实验室-JC /************************ ...

  4. 四位数码管显示多位数字计时

    目录 前言 一.共阳极四位数码管 二.显示数字 1.显示单个数字 2.显示多位数字 总结 前言 共阳极四位数码管显示0-9单个数字的话只需要控制对应的引脚电平就行,但如果需要显示多位数字的话,不仅需要 ...

  5. 用8266学习单片机-6-八段数码管显示数字?时间?金钱?闹钟?从一位八段数码管到四位-网络同步时钟

    八段数码管原理 单个数码管本质就是LED的排列组合,你也可以自己用八个LED组合试一试,分为共阴和共阳两种,共阳的3.8引脚就是接正极,共阴接地(电阻别忘了) 比如让g.dp两个led不亮,其余的都亮 ...

  6. 【STM32 .Net MF开发板学习-25】LED数码管显示

    在单片机系统中,LED数码管的应用是很常见的,不过对我们偏软件开发的人来说,要想研究LED还得储备一定的知识才能进行近一步的工作.不过采用.NET Micro Framework系统,我们马上就可以站 ...

  7. stm32与驱动器AS1106驱动数码管显示

    驱动器简述 驱动器就是为驱动某些显示设备,动作设备的器件,用户可通过单片机对驱动器设置驱动方式,时间等等来达到自己配置,而如何配置驱动器来达到我们想要的效果,便是要根据驱动器手册,输入相应的代码,配置 ...

  8. STM32学习记录——光敏传感器的使用

    文章目录 前言 一.学习目的 二.模块介绍 三.代码记录 总结 前言 只做学习记录,记录自己如何从零学会使用一个模块,仅仅只是会用,缺乏专业知识.如果需要了解更多原理,可以从我推荐的技术大佬的文章中获 ...

  9. vivado 数码管学习(二)数码管显示一位数字和显示八位数字

    数码管显示一位 9 module shumaguan( //input clk, //input rst_n,output reg [6:0] a_to_g, //段信号 output reg an= ...

最新文章

  1. unity鼠标控制镜头旋转_unity3D鼠标滚轮来实现镜头拉近拉远及视角旋转
  2. python随机数生成_关于Python中的随机数生成步骤和随机数质量
  3. RuntimeError Assertion cur_target = 0 cur_target n_classes failed
  4. DDoS不同层面的防护-Vecloud
  5. Windows下的cmd小技巧
  6. mongoose --- createUser
  7. Swift 与 JSON 数据
  8. linux鼠标驱动程序,Linux usb子系统(一) _写一个usb鼠标驱动
  9. 传西门子中国运营中近一半业务涉及行贿
  10. c语言编程作业 一哥是何人,PLC编程语言之争:谁才是quot;一哥quot;-简易百科
  11. php加密解密函数,PHP加密解密的函数
  12. 整理总结:深入浅出统计学 —— 卡方分布
  13. android wifi热点setting
  14. Java秋招面经大合集
  15. 最近在琢磨的一个问题和我的尝试
  16. 使用PdfSharp从模板生成Pdf文件
  17. maven项目安装本地包实战演示
  18. eth_clockgen.v
  19. 对话驻云创始人 | 七问技术创业者(合辑)
  20. abb机器人负载配置设定_ABB机器人配置Profinet网络配置流程.pdf

热门文章

  1. 超强反爬虫方案!Requests 什么的通通爬不了
  2. C语言暴力破解偶然在论坛上看到的一个推理题
  3. geoerver mvt的pbf格式切片
  4. 最新SEO外链自动发布外链工具网站源码开源
  5. android b571 版本,HUAWEI Mate 7 EMUI 4.0.1 B571 版本发布说明及问题反馈
  6. java阿里云短信服务SDK使用方法
  7. 真实机器人dobot magician调试经验
  8. U盘安装Linux系统教程步骤
  9. 历年CCF-CSP认证考试题目解法/思想
  10. 模拟Android内存不足 activity回收 值保存 状态恢复