🍌
🍌🍌
作者简介:大家好啊,我叫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
的控制信号为
低电平使能
时,并行输出端的输出值等于并行输出缓存器所存储的值。
小提示:
有些引脚名称不一样,但是序号是一样的,大家按键引脚标号连接即可。
由于我们使用了两片74HC595芯片,故我们需要采取级联的方式。那么,我们想要发送的数据是如何通过该芯片然后点亮数码管呢?其实很简单了,大家请看下面的图解吧。
第一块芯片的
9引脚
(串行数据输出引脚)连接第二块芯片的
14引脚
(数据线);
当我们发送
第一个数据
时,数据
先送到
第一块595芯片,之后数据通过第9脚连接第14脚
再传送
给第二块芯片,之后发送的
第二个数据
会送到第一块芯片。因此,发送数据时,
第二块芯片接收的是第一次的数据,第一块芯片接收的是第二次的数据
。我们发送的数据会存储到595,之后通过第二片595的QA~QH引脚把数据发送给四位数码管,并在上面显示对应的数据。
四位数码管和两片595的接线图如下,如果这样接线的话比较麻烦,我建议大家直接购买75HC595驱动四位数码管的模块,这个可以省去接线的麻烦,动手能力强的可以直接买芯片在面包板插接。
提示:
第一片芯片: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);
}
好了,大家一起来看看效果吧!
直接使用模块,接线简单
。
使用两个74HC595直插芯片,
建议购买面板上时买大号的,同时记得购买面包板专用插线
(不建议用杜邦线,我插接了好几次才成功,很容易接触不良,数据传送不正常)
。
今天的分享就到这里,谢谢大家的耐心阅读,如果觉得有用的话给个👍👍👍
🌜🌜🌜
本章结束,我们下一章见
🌜🌜🌜
参考资料:
1.STM32固件库手册
2.正点原子STM32不完全手册_库函数版本
3.
参考视频
4.数字电子技术基础
资料已上传,需要自取