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

  🍌
🍌🍌
作者简介:大家好啊,我叫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.数字电子技术基础 

资料已上传,需要自取

  • 9
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依点_DW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值