(6)趣味单片机新玩法-三个引脚控制16路流水灯
2025-03-25 来源:jianshu

老规矩,我们先来看个效果

我们先用单片机按照之前的例子分解,来实现我们想要的结果。
首先,我们让16个LED灯交叉亮起来
代码部分
int STCP_Pin = 4;int SHCP_Pin = 6;int DS_Pin = 5; void setup (){
pinMode(STCP_Pin,OUTPUT);
pinMode(SHCP_Pin,OUTPUT);
pinMode(DS_Pin,OUTPUT); }// 我们先让16个灯交叉亮void loop(){
while(1)
{
digitalWrite(STCP_Pin, LOW);
// 1
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
// 2
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, HIGH);
digitalWrite(SHCP_Pin, HIGH);
// 3
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
// 4
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, HIGH);
digitalWrite(SHCP_Pin, HIGH);
// 5
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
// 6
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, HIGH);
digitalWrite(SHCP_Pin, HIGH);
// 7
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
// 8
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, HIGH);
digitalWrite(SHCP_Pin, HIGH);
// 9
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
// 10
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, HIGH);
digitalWrite(SHCP_Pin, HIGH);
// 11
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
// 12
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, HIGH);
digitalWrite(SHCP_Pin, HIGH);
// 13
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
// 14
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, HIGH);
digitalWrite(SHCP_Pin, HIGH);
// 15
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
// 16
digitalWrite(SHCP_Pin, LOW);
digitalWrite(DS_Pin, HIGH);
digitalWrite(SHCP_Pin, HIGH);
digitalWrite(STCP_Pin, HIGH);
}}运行效果

然后我们再把代码简化一下,使其看起来更简洁,实用
int STCP_Pin = 4;int SHCP_Pin = 6;int DS_Pin = 5; void setup (){
pinMode(STCP_Pin,OUTPUT);
pinMode(SHCP_Pin,OUTPUT);
pinMode(DS_Pin,OUTPUT);
digitalWrite(STCP_Pin, LOW);}void loop(){
unsigned char LED_Data;
while(1)
{
LED_Data = 0xAA;
// 第一个8位
digitalWrite(STCP_Pin, LOW);
for(int i=0; i<8; i++)
{
if(LED_Data&0x80){ digitalWrite(DS_Pin, HIGH);}
else { digitalWrite(DS_Pin, LOW); }
digitalWrite(SHCP_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
LED_Data <<=1;
}
// 第二个8位
LED_Data = 0xAA;
for(int i=0; i<8; i++)
{
if(LED_Data&0x80){ digitalWrite(DS_Pin, HIGH);}
else { digitalWrite(DS_Pin, LOW); }
digitalWrite(SHCP_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
LED_Data <<=1;
}
digitalWrite(STCP_Pin, HIGH);
delay(1000);
}}我们稍微改变下,让LED灯按照我们的意思工作,封装一下函数,然后让中间四个灯亮起来
int STCP_Pin = 4;int SHCP_Pin = 6;int DS_Pin = 5; void HC595_Write(unsigned char data1, unsigned char data2);void setup (){
pinMode(STCP_Pin,OUTPUT);
pinMode(SHCP_Pin,OUTPUT);
pinMode(DS_Pin,OUTPUT); }void loop(){
unsigned char LED_Data1 = 0x03;
unsigned char LED_Data2 = 0xC0;
while(1)
{
HC595_Write(LED_Data1, LED_Data2);
delay(1000);
}}void HC595_Write(unsigned char data1, unsigned char data2){
// 第一个8位
digitalWrite(STCP_Pin, LOW);
for(int i=0; i<8; i++)
{
if(data1&0x80){ digitalWrite(DS_Pin, HIGH);}
else { digitalWrite(DS_Pin, LOW); }
digitalWrite(SHCP_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
data1 <<=1;
}
// 第二个8位
for(int i=0; i<8; i++)
{
if(data2&0x80){ digitalWrite(DS_Pin, HIGH);}
else { digitalWrite(DS_Pin, LOW); }
digitalWrite(SHCP_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
data2 <<=1;
}
digitalWrite(STCP_Pin, HIGH); }中间四个LED灯亮的效果

然后我们连贯起来搞个流水的灯玩玩
int STCP_Pin = 4;int SHCP_Pin = 6;int DS_Pin = 5; unsigned char LED_Data1[8] = { 0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80};unsigned char LED_Data2[8] = { 0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80};void HC595_Write(unsigned char data1, unsigned char data2);void setup (){
pinMode(STCP_Pin,OUTPUT);
pinMode(SHCP_Pin,OUTPUT);
pinMode(DS_Pin,OUTPUT); }void loop(){
while(1)
{
for(int i=0; i<8; i++)
{
HC595_Write(0x00, LED_Data1[i]);
delay(1000);
}
for(int i=0; i<8; i++)
{
HC595_Write( LED_Data2[i], 0x00);
delay(1000);
}
}}void HC595_Write(unsigned char data1, unsigned char data2){
// 第一个8位
digitalWrite(STCP_Pin, LOW);
for(int i=0; i<8; i++)
{
if(data1&0x80){ digitalWrite(DS_Pin, HIGH);}
else { digitalWrite(DS_Pin, LOW); }
digitalWrite(SHCP_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
data1 <<=1;
}
// 第二个8位
for(int i=0; i<8; i++)
{
if(data2&0x80){ digitalWrite(DS_Pin, HIGH);}
else { digitalWrite(DS_Pin, LOW); }
digitalWrite(SHCP_Pin, LOW);
digitalWrite(SHCP_Pin, HIGH);
data2 <<=1;
}
digitalWrite(STCP_Pin, HIGH); }最终的流水灯实验效果


当然arduino本身自带了移位函数,同样可以达到效果
int STCP_Pin = 4;int SHCP_Pin = 6;int DS_Pin = 5; unsigned char LED_Data1[8] = { 0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80};unsigned char LED_Data2[8] = { 0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80};void setup (){
pinMode(STCP_Pin,OUTPUT);
pinMode(SHCP_Pin,OUTPUT);
pinMode(DS_Pin,OUTPUT); }void loop(){
for(int a=0; a<8; a++)
{
digitalWrite(STCP_Pin,LOW);
shiftOut(DS_Pin,SHCP_Pin,MSBFIRST,LED_Data1[a]);
shiftOut(DS_Pin,SHCP_Pin,MSBFIRST,0x00);
digitalWrite(STCP_Pin,HIGH);
delay(500);
}
for(int a=0; a<8; a++)
{
digitalWrite(STCP_Pin,LOW);
shiftOut(DS_Pin,SHCP_Pin,MSBFIRST,0x00);
shiftOut(DS_Pin,SHCP_Pin,MSBFIRST,LED_Data2[a]);
digitalWrite(STCP_Pin,HIGH);
delay(500);
}}
流水的延时500ms的效果


总结:
我们绝大部分时候都在造轮子,殊不知更优秀的轮子已经造好了!!
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 意法半导体中国本地造STM32微控制器启动规模量产
- 蓝牙信道探测技术原理与开发套件实践




