[其他ST产品] 74HC595四位数码管显示

[复制链接]
4196|36
 楼主| lvuu 发表于 2023-9-26 16:07 | 显示全部楼层 |阅读模式
数模管作为STM32的一个重要外设,由于其成本低、稳定,被用于许多场景中。本篇文章来介绍下四位数码管的使用方法。


一、数码管的分类

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

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

45056651291305526b.png

2344965129136c6231.png

挂几张图



 楼主| lvuu 发表于 2023-9-26 16:08 | 显示全部楼层
74HC595芯片(串入并出)
该芯片是一个8位串行输入、并行输出的位移缓存器。(缓存器在控制数码管中具有重要作用)
606646512915300a2d.png
354126512915963b3e.png
Q0~Q7:并行输出
Q7’:串行输出
SH_CP:移位寄存器时钟输入
ST_CP:存储寄存器时钟输入
DS:串行输入
 楼主| lvuu 发表于 2023-9-26 16:08 | 显示全部楼层
使用两片74HC595芯片,第一片74HC595芯片的Q7口,也就是串行输出口可以向下一片的74HC595芯片的串行输入口输入数据。
 楼主| lvuu 发表于 2023-9-26 16:16 | 显示全部楼层
第二片74HC595芯片是用于控制数码管输出显示,而第一片74HC595芯片只使用了QA、QB、QC、QD四个管脚来储存信息。
 楼主| lvuu 发表于 2023-9-26 16:16 | 显示全部楼层
本帖最后由 lvuu 于 2023-9-26 16:18 编辑

本文主要使用PB13 、PB12 、PB15 来控制数码管的显示数据。
以下使用数码管也是以这三个端口进行分析。
 楼主| lvuu 发表于 2023-9-26 16:17 | 显示全部楼层
原理图
895316512939957f25.png

 楼主| lvuu 发表于 2023-9-26 16:18 | 显示全部楼层
对于4位的数码管模块,接线选择为

  1. VCC------------>供电
  2. DIO------------>PB13
  3. RCLK------------>PB12  当八个数据完全传入缓冲区,此时拉高RCLK,八位数据便可以一次性全部输出。
  4. SCLK------------>PB15   控制串入的时钟信号线,当有一个上升沿,便传入一个数据。
  5. GND------------>接地
 楼主| lvuu 发表于 2023-9-26 16:20 | 显示全部楼层
四、代码主要操作
主要是由以下四个函数构成:
  1. void HC595_GPIO_Configuration(void);
  2. void HC595_Send_Data(unsigned char num, unsigned char show_bit);
  3. void HC595_Send_Byte(unsigned char byte);
  4. void display(unsigned int n);

 楼主| lvuu 发表于 2023-9-26 16:20 | 显示全部楼层
五、代码分析
1.void HC595_GPIO_Configuration(void);
该函数主要是使能接在4位数码管的主要GPIO口,如上文提到的一般:
  1. /************************
  2. VCC------------>供电
  3. DIO------------>PB13
  4. RCLK------------>PB12  
  5. SCLK------------>PB15  
  6. GND------------>接地
  7. **************************/

  8. unsigned int num[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0x00};
  9. //创建一个数组,0-9所对应的十六进制数

  10. void HC595_GPIO_Configuration(void)
  11. {
  12.         GPIO_InitTypeDef GPIO_InitStructure;

  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  14.        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  19.        
  20.         GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);
  21.         GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
  22.         GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET);
  23. }
 楼主| lvuu 发表于 2023-9-26 16:20 | 显示全部楼层
作用:使能相应管脚,并将其全部拉低。
 楼主| lvuu 发表于 2023-9-26 16:20 | 显示全部楼层
2.void HC595_Send_Byte(unsigned char byte)
  1. /*********************************
  2. 参数:byte 所传入的数据,
  3.                           是要显示的数字或者是对应显示的位数
  4. **********************************/
  5. /************************
  6. VCC------------>供电
  7. DIO------------>PB13
  8. RCLK------------>PB12  
  9. SCLK------------>PB15  
  10. GND------------>接地
  11. **************************/
  12. //串入
  13. void HC595_Send_Byte(unsigned char byte)
  14. {
  15.         unsigned int i;
  16.        
  17.         for(i = 0; i < 8; i++)
  18.         {
  19.                 if(byte & 0x80)
  20.                         GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_SET);
  21.                 else
  22.                         GPIO_WriteBit(GPIOB, GPIO_Pin_15, Bit_RESET);
  23.                
  24.                 GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
  25.                 Delay_us(10);
  26.                 GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_SET);
  27.                 Delay_us(10);
  28.                
  29.                 byte <<= 1;
  30.         }
  31. }

 楼主| lvuu 发表于 2023-9-26 16:24 | 显示全部楼层
作用:发送字节到74HC595芯片的缓冲器中。
分析:发送的过程很重要,需要搞清所使用的芯片是先低位发送还是先高位。
 楼主| lvuu 发表于 2023-9-26 16:24 | 显示全部楼层
如图: 6298365129554c7aba.png
 楼主| lvuu 发表于 2023-9-26 16:25 | 显示全部楼层
由74HC595的芯片手册可以知道:74HC595芯片的发送顺序是由QA,一直到QH,到目前为止,我们虽然清楚了该芯片的发送顺序,但是仍然不知道QA和QH究竟哪个是高位。
 楼主| lvuu 发表于 2023-9-26 16:25 | 显示全部楼层
而在该数据手册中,还可以发现:
6555265129568de252.png
 楼主| lvuu 发表于 2023-9-26 16:25 | 显示全部楼层
这张图很明显的说明了问题的关键——QA是高位,QH是低位。
 楼主| lvuu 发表于 2023-9-26 16:25 | 显示全部楼层
由此我们知道了这个芯片是先写入最高位,再依次发送到最低位。所以在该段函数中,我们通过该数据与(&)0x80,取出最高位,通过DIO口输入1/0,由于之前所提到的,唯有SCLK到达上升沿的时候,数据才能传入,于是我们在每次循环输入数据的时候,都将SCLK(PB13)拉高10us ,然后再将所要输入的byte左移一位,继续循环。
 楼主| lvuu 发表于 2023-9-26 16:26 | 显示全部楼层
由于两片74HC595芯片的作用,当第一片74HC595芯片的缓冲区八位都存在数据的时候,此时DIO口继续输入数据,则将会将已有数据顶置到下一片74HC595的缓冲区。
因此所要显示数字的数据传入完成后,继续传入其所要求显示的数码管位置,该过程也同理于数字数据的传输过程。
 楼主| lvuu 发表于 2023-9-26 16:26 | 显示全部楼层
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);
}


 楼主| lvuu 发表于 2023-9-26 16:27 | 显示全部楼层
作用:控制4位数码管的显示位置以及显示的数字
分析:该函数使用之前所定义和编写的void HC595_Send_Byte(unsigned char byte)函数继续工作,需要注意的是,当数据和位置全部输入后,需要拉高RCLK(PB12)的电平,使其完成显示。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

651

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部