Arduino UNO + 74HC595流水灯+按键控制+Proteus仿真

Arduino UNO + 74HC595流水灯+按键控制+Proteus仿真


  • Proteus仿真
    在这里插入图片描述

  • 相关篇《Arduino UNO学习74HC595使用,循序渐进过程

  • 当然这只是一种流水灯的效果,如果需要其他的流水灯效果,只要稍微修改一下需要发送的数值即可实现,因为74HC是串转并的。

  • 本案例按键控制的方法是,按一下启动流水灯,再按一下,就停止流水灯。按键采用中断控制方法,方便简洁,响应速度快。

  • 如果74HC595的OE引脚接Arduino UNO的6号引脚,那么就是上电启动后自动开始流水灯效果
    在这里插入图片描述

  • 如果74HC595的MR引脚接Arduino UNO的6号引脚,那么就是上电启动后不会自动开启流水灯,需要按一次按键来触发流水灯效果。
    在这里插入图片描述

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#define ST 8 //ST CP of 74HC595移位寄存器时钟引脚
#define HS 12 //SH CP of 74HC595存储寄存器时钟输入引脚
#define DS 11 //DS of 74HC595串行数据输入引脚
#define interruptPin 2 //定义中引脚2或者3号引脚都可以
#define led 6 //接HC595的MR或者OE引脚,低电平时,清空移位寄存器中已有的bit数据
volatile byte State = LOW;//初始状态

void setup ()
{
pinMode(led, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), use, FALLING);//开中断,下降沿触发
pinMode(ST, OUTPUT); //锁存引脚设置
pinMode(HS, OUTPUT); //时钟引脚设置
pinMode(DS, OUTPUT); //数据引脚设置
}

void loop()
{
digitalWrite(led, State);
HC595();
}
void use() {
State = !State;
}

void HC595() {
digitalWrite(ST, LOW); //将ST\_CP口上面加低电平让芯片准备好接收数据
shiftOut(DS, HS, MSBFIRST, 0x07); // 把0x07二进制0000 0111的值送给595
//用MSBFIRST参数与LSBFIRST可以改变点亮的顺序
digitalWrite(ST, HIGH); //将ST\_CP这个针脚恢复到高电平
delay(300);
digitalWrite(ST, LOW); //将ST\_CP口上面加低电平让芯片准备好接收数据
shiftOut(DS, HS, MSBFIRST, 0x0e); // 把0x0e二进制0000 1110的值送给595
//用MSBFIRST参数与LSBFIRST可以改变点亮的顺序
digitalWrite(ST, HIGH); //将ST\_CP这个针脚恢复到高电平
delay(300);
digitalWrite(ST, LOW); //将ST\_CP口上面加低电平让芯片准备好接收数据
shiftOut(DS, HS, MSBFIRST, 0x1c); // 把0x1c二进制0001 1100的值送给595
//用MSBFIRST参数与LSBFIRST可以改变点亮的顺序
digitalWrite(ST, HIGH); //将ST\_CP这个针脚恢复到高电平
delay(300);
digitalWrite(ST, LOW); //将ST\_CP口上面加低电平让芯片准备好接收数据
shiftOut(DS, HS, MSBFIRST, 0x38); // 把0x38二进制0011 1000的值送给595
//用MSBFIRST参数与LSBFIRST可以改变点亮的顺序
digitalWrite(ST, HIGH); //将ST\_CP这个针脚恢复到高电平
delay(300);
digitalWrite(ST, LOW); //将ST\_CP口上面加低电平让芯片准备好接收数据
shiftOut(DS, HS, MSBFIRST, 0x70); // 把0x70二进制0111 0000的值送给595
//用MSBFIRST参数与LSBFIRST可以改变点亮的顺序
digitalWrite(ST, HIGH); //将ST\_CP这个针脚恢复到高电平
delay(300);
digitalWrite(ST, LOW); //将ST\_CP口上面加低电平让芯片准备好接收数据
shiftOut(DS, HS, MSBFIRST, 0xe0); // 把0xe0二进制1110 0000的值送给595
//用MSBFIRST参数与LSBFIRST可以改变点亮的顺序
digitalWrite(ST, HIGH); //将ST\_CP这个针脚恢复到高电平
delay(300);
}


程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1s3NdY43IvxvA4Oa4li9m6w 
提取码:bfi2