15.[STM32]一篇文章教会你使用75HC595芯片驱动四位数码管

  • Post author:
  • Post category:其他


🍌

🍌🍌

作者简介:大家好啊,我叫DW,每天分享一些我新学到的知识,期待和大家一起进步

🍋

🍋🍋

系列专栏:

STM32


🍎

🍎🍎

🍎🍎🍎

🍎小实验目标:利用两片SN74HC595芯片驱动四位数码管🍎

🍊如有写得不好的地方欢迎大家指正🍊

🍊开发板:正点原子STM32F103Mini版🍊

🍊芯片:SN74HC595N🍊

创作时间:🍊🍊🍊2022年5月10日🍊🍊🍊

在上一篇文章中,我们利用74HC138N译码器成功点亮了四位数码管,这个方法用到了很多的GPIO口。那么还有没有其他的方法可以减少IO口的使用呢?答案是有的,


本节我们将使用两片74HC595芯片驱动四位数码管,大家注意了啊,利用该芯片只需要用到三个IO口即可驱动四位数码管。

1. 74HC595简介

74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在


SCK(11)


的上升沿


,串行数据由


SI(14)


输入


到内部的8位位移缓存器,并由


SQH(9)


输出


,而并行输出则是在


RCK(12)


的上升沿


将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端


OE


的控制信号为


低电平使能


时,并行输出端的输出值等于并行输出缓存器所存储的值。

4df969cfe5834389bc7b4c3da2dce29a.png



小提示:



有些引脚名称不一样,但是序号是一样的,大家按键引脚标号连接即可。

5faff457bdea454393f1016e65684323.png

由于我们使用了两片74HC595芯片,故我们需要采取级联的方式。那么,我们想要发送的数据是如何通过该芯片然后点亮数码管呢?其实很简单了,大家请看下面的图解吧。

8ca6d812d2e34212bfde5d8d30b1421f.png

第一块芯片的


9引脚


(串行数据输出引脚)连接第二块芯片的


14引脚


(数据线);

当我们发送


第一个数据


时,数据


先送到


第一块595芯片,之后数据通过第9脚连接第14脚


再传送


给第二块芯片,之后发送的


第二个数据


会送到第一块芯片。因此,发送数据时,


第二块芯片接收的是第一次的数据,第一块芯片接收的是第二次的数据


。我们发送的数据会存储到595,之后通过第二片595的QA~QH引脚把数据发送给四位数码管,并在上面显示对应的数据。

四位数码管和两片595的接线图如下,如果这样接线的话比较麻烦,我建议大家直接购买75HC595驱动四位数码管的模块,这个可以省去接线的麻烦,动手能力强的可以直接买芯片在面包板插接。

f515d71131a442d28eecb711cc87e4b9.png



提示:



第一片芯片:1、2、3、15引脚插接四位数码管的位选1~4,高电平有效,它用来选择哪个数码管点亮



第二片芯片:15、1~7引脚插接四位数码管的a~h引脚,用来点亮数码管对应的位置



两个芯片的SCLK、RCLK需要相互连接



共阳极四位数码管:低电平点亮



其他的按照上图连接即可,如果买的是模块的话,直接连接SCLK(11)、RCLK(12)、SER(14)即可。

2. 595具体使用的步骤


第一步

:将要准备输入的位数据(8bit)从14引脚SER移入74HC595数据输入端上。


第二步

:将位数据逐位移入74HC595,即数据串入,此操作需要时钟驱动,SCK产生一上升沿,将14引脚SER上的数据移入74HC595移位寄存器中,先送高位,后送低位,经过8个上升沿后,8bit全部送入移位寄存器了。


第三步

:将移位寄存器里的数据送入存储寄存器,引脚12(RCK)产生一个上升沿后,该操作就完成了。


第四步

:使能端引脚13(G’)为低电平,则第三步送入存储寄存器的8bit数据(一个字节)就在QH-QA并行输出,此时输出的数据会被所存起来。

注意:数据并行输出后,只要没有数据更新进来,原输出的数据保持不变,就是所谓的锁存。在完成步骤一二三后,只要步骤四还没使能,输出都是保持不变的,当13(G’)一使能,新的数据就输出覆盖旧输出。



提示:



该连线图有些引脚名字和之前的两幅图的引脚名字有些不同,但是引脚标号是一样的,大家按照标号连接即可

上节课的文章:

14.[STM32]数电学了三八译码器一脸懵,一文带你从理论到实践_依点_DW的博客-CSDN博客

在上节课的基础上,我们只需要稍加修改就可以利用595驱动四位数码管了。

//发送一个字节的数据

void SMG_Write_Byte(u8 dat,u8 dat1){

      

       for(u8 i=0;i<8;i++){

             

              ((dat<<i)&0x80) ? DIO_HIGH:DIO_LOW;

             

              SCL_HIGH;

              SCL_LOW;

       }

       for(u8 i=0;i<8;i++){

             

              ((dat1<<i)&0x80) ? DIO_HIGH:DIO_LOW;

             

              SCL_HIGH;

              SCL_LOW;

       }

       RCL_HIGH;

       RCL_LOW;

}


//显示数字
void DW_Smg_Number(u16 dat){
	
 
	u8 code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0-F
	
//动态显示0~F
//	for(u8 i=0;i<16;i++){
//	SMG_Write_Byte(code[i],0x0F); //控制位选,选择第1~4个数码管:0000 1111 --0X0F
//	delay_ms(1000);//延时短刷新会很快
//	}	
//显示0~F任意字符	
	SMG_Write_Byte(code[dat/1000],0x08);//千位 0000 1000
	delay_ms(1);
	SMG_Write_Byte(code[dat%1000/100],0x04);//百位 1111 1011
	delay_ms(1);
	SMG_Write_Byte(code[dat%100/10],0x02);//十位 1111 1101
	delay_ms(1);
	SMG_Write_Byte(code[dat%100%10],0x01);//个位 1111 1110
	delay_ms(1);
}

好了,大家一起来看看效果吧!



直接使用模块,接线简单


8c3b34ed44e54e1eb0eb2c97f0a085f7.jpeg



使用两个74HC595直插芯片,


建议购买面板上时买大号的,同时记得购买面包板专用插线


(不建议用杜邦线,我插接了好几次才成功,很容易接触不良,数据传送不正常)


b6467f15a04c42438a48b3d85412e4b8.jpeg

今天的分享就到这里,谢谢大家的耐心阅读,如果觉得有用的话给个👍👍👍

🌜🌜🌜

本章结束,我们下一章见

🌜🌜🌜


参考资料:

1.STM32固件库手册

2.正点原子STM32不完全手册_库函数版本

3.

参考视频


4.数字电子技术基础

资料已上传,需要自取



版权声明:本文为qq_48796593原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。