评论

收藏

[C++] arduino与74HC595驱动8位数码管(含代码)

编程语言 编程语言 发布于:2021-07-08 18:11 | 阅读数:428 | 评论:0

  
  arduino与74HC595驱动8位数码管(含代码)

  • 一、74HC595介绍
  • 二、74HC595原理


    • 1.原理简介
    • 2.引脚说明及其图示

  • 三、具体代码
  • 总结

  材料介绍:一块arduino,若干杜邦线,一块数码管,一块74HC595芯片,
一、74HC595介绍  这是该芯片图片(图片来源于网络)
DSC0000.jpeg
  74HC595 简单说来就是具有8位移位寄存器和一个存储器,通过该芯片可以实现3控8。简单来说就是通过3个数字引脚控制8个其它引脚。比如说用该芯片和三个arduino数字引脚来控制一个8位共阴数码管。
二、74HC595原理
1.原理简介
  74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

2.引脚说明及其图示
符号引脚描述Q0–Q7第15脚, 第1-7脚8位并行数据输出GND第8脚地Q7’第9脚串行数据输出/MR第10脚主复位(低电平有效)SH_CP第11脚数据输入时钟线ST_CP第12脚输出存储器锁存时钟线/OE第13脚输出有效(低电平有效)DS第14脚串行数据输入VCC第16脚电源  引脚图如图(图片来源于百度百科)
DSC0001.jpeg

  • GND接地,VCC接5V电源
  • Q0-Q7这8根引脚直接跟数码管的8段引脚相连。
  • DS接到arduino任意一个GPIO口上(输出模式)。
  • SHCP是移位寄存器的时钟引脚。74HC595内部有一个8位的移位寄存器用来保存从DS引脚输入的数据。74HC595通过SHCP这个时钟引脚来实现信息获取。只有在SHCP发生一次上升沿的时候,74HC595才会从DS引脚上取得当前的数据(高/低电平)并把取到的这一位数据保存到移位寄存器里。这个引脚也接到arduino任意一个GPIO口上。当我们向芯片发送数据时,要先在DS引脚上准备好要传送的数据,然后制造一次SHCP引脚的上升沿(先拉低电平再拉高电平)。
  • STCP是芯片内部另外一个8位锁存寄存器的时钟引脚。当移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平)。74HC595会在这个上升沿将移位寄存器里的8位数据复制到锁存器中(锁存器里原来的数据将被替换)。注意,到这里为止,这8位数据还只是被保存在锁存器里,并没有输出到数码管上。这个引脚同样连接到arduino任意一个GPIO口上即可。
  • OE是输出使能引脚,在其他芯片里也很常见。作用是控制锁存器里的数据是否最终输出到Q0-Q7输出引脚上。低电平时输出,高电平时不输出(既不是高电平,也不是低电平而是高阻态,不通电)。本例为了方便直接接在GND上使其一直保持低电平输出数据。
  • MR是用来重置内部寄存器的引脚。低电平时重置内部寄存器(MemoryReset?)。本例为了方便直接连接在Vcc上一直保持高电平
  • Q7S引脚,串行输出引脚,我并没有用到,所以不接
  关于工作原理有大神做了动画
DSC0002.gif
三、具体代码  我的数码管是共阴的我在做的时候这些数字是试出来的所有复制代码可能会有不同。
中间用到一个shiftOut函数
shiftOut (uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val)
  名为:位移输出函数
输入value数据后Arduino会自动把数据移动分配到8个并行输出端. 其中dataPin为连接DS的引脚号, clockPin为连接SH_CP的引脚号, bitOrder为设置数据位移顺序, 分别为高位先入MSBFIRST或者低位先入LSBFIRST.
  具体实现代码如下
int latchPin =4;
int clockPin = 3;
int dataPin=2;
int arr[10]={126,72,188,182,210,230,238,50,254,242};
void setup() 
{pinMode(latchPin,OUTPUT);
 pinMode(clockPin,OUTPUT);
 pinMode(dataPin,OUTPUT);
 
}
void loop(){
  for(int n=0;n<10;n++){
   Serial.begin(9600);
   digitalWrite(latchPin,LOW);//准备接收数据
   shiftOut(dataPin,clockPin,LSBFIRST,arr[n]);
  //Serial.println(a);
   digitalWrite(latchPin,HIGH);//恢复高电平,传递数
   delay(1000);
  }
  
//0 126 
//1 72
//2 188
//3 182
//4 210
//5 230
//6 238
//7 50
//8 254
//9 242
}
  已经实践过 具体显示数字从0-9
其中DS接入数字引脚2
STCP接入数字引脚 3
SHCP接入数字引脚4

  
关注下面的标签,发现更多相似文章