编译环境:win10,arduino1.8.10
硬件支持:光立方组件,移位锁存器(20扩展)74HC595,arduino组件(主板)
打开arduino,点击工具栏选择开发板型号,本博文使用UNO R3,选择Arduino/Genuino Uno
开发基础(标准库基本函数):(只列出部分需要用到的)
1.数字I/O 14个接口
void PinMode(unsigned char pin,unsigned char mode)
pin:要配置的引脚 mode:设置模式-INPUT/OUTPUT
void digitalWrite(unsigned char pin,unsigned char value)
pin:要配置的引脚 value:HIGH/LOW
int digitalRead(unsigned char pin)
pin:获取电压值的引脚 返回值:获取引脚电压情况HIGH/LOW
2.时间函数
void delay(unsigned long ms)
一个延时函数 ms表示延时时长,单位ms
3.串口函数
void begin(unsigned long baud)
设置串口通信波特率
int available(void)
判断串口是否收到数据
4.模拟I/O 6个接口
void analogReference(type)
配置模拟引脚的参考电压
type:DEFAULT 默认值,参考电压为5V
INTERNAL 低电压模式
EXTERNAL 扩展模式
void analogWrite(unsigned char pin ,int value)
读取引脚的模拟量电压值
void analogRead(unsigned char pin)
通过PWM方式在引脚上输出一个模拟量
pin: A0~A5 value: 0~255
5.高级I/O
下面放光立方源码:(和STM32流水灯原理一样,用数组表示亮灯序列。4 * 4 * 4的光立方模块,效果还行)
#include <arduino.h>
const unsigned char imageTab[] PROGMEM =
{
B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0000, B0000, B1000, B0000, B0000, B0000, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0000, B0000, B0100, B0000, B0000, B0000, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, B0000, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0000, B0000, 10 ,
B0000, B0000, B0010, B0000, B0000, B1000, B0010, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 10 ,
B0000, B0000, B0110, B0000, B0000, B0100, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 10 ,
B0000, B0100, B0100, B0000, B0000, B0100, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 10 ,
B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0000, B0000, B0010, 10 ,
B0000, B0000, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0010, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0110, B0000, B0010, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0110, B0010, B0010, 10 ,
B0000, B0000, B1000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0010, B0000, B0010, B0010, B0010, 10 ,
B0000, B0000, B1000, B0000, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0010, B0000, B0000, B0010, B0010, 10 ,
B0000, B0000, B1000, B0010, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0010, 10 ,
B0000, B0000, B1000, B0110, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0000, 10 ,
B0000, B0000, B1000, B1110, B0000, B0000, B0000, B0010, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 10 ,
B0000, B1000, B1000, B1110, B0000, B0000, B0100, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 10 ,
B0000, B1000, B1000, B1100, B0000, B1000, B0100, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 10 ,
B0000, B1000, B1000, B1000, B0000, B1100, B0100, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, 10 ,
B0000, B1000, B1000, B0000, B0000, B1100, B0100, B0100, B0000, B0000, B0000, B0000, B0001, B0000, B0000, B0000, 10 ,
B0000, B1000, B0000, B0000, B0000, B1100, B0100, B0100, B0000, B0000, B0000, B0100, B0001, B0000, B0000, B0000, 10 ,
B0000, B0000, B0000, B0000, B0000, B1100, B0100, B0100, B0000, B0000, B0000, B0100, B0001, B0000, B0000, B0100, 10 ,
B0000, B0000, B0000, B0000, B0000, B0100, B0100, B0100, B0000, B0000, B0000, B0100, B0001, B0000, B0000, B0110, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0100, B0100, B0000, B0000, B0000, B0100, B0001, B0000, B0000, B0111, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0100, B0001, B0000, B0001, B0111, 10 ,
B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0100, B0001, B0001, B0001, B0111, 10 ,
B0000, B0000, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0000, B0000, B0000, B0011, B0001, B0001, B0011, 10 ,
B0000, B0000, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0000, B0000, B0000, B0111, B0001, B0001, B0001, 10 ,
B0000, B0000, B0000, B0000, B0000, B0100, B0000, B0000, B0100, B0000, B0000, B0000, B0111, B0001, B0001, B0000, 10 ,
B0000, B0000, B0000, B0000, B0100, B0100, B0000, B0000, B0100, B0000, B0000, B0000, B0111, B0001, B0000, B0000, 10 ,
B0000, B0000, B0000, B1000, B0100, B0100, B0100, B0000, B0100, B0000, B0000, B0000, B0111, B0000, B0000, B0000, 10 ,
B0000, B0000, B0000, B1000, B0100, B0100, B0100, B0100, B0100, B0000, B0000, B0000, B0110, B0000, B0000, B0000, 10 ,
B0000, B0000, B0000, B1100, B0100, B0100, B0100, B0100, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, 10 ,
B0000, B0000, B0000, B1100, B0100, B0100, B0100, B1100, B0000, B0000, B0000, B0000, B0000, B0001, B0000, B0000, 10 ,
B0000, B0000, B0000, B1100, B0000, B0100, B0100, B1100, B0000, B0000, B0000, B1000, B0000, B0001, B0000, B0000, 10 ,
B0000, B0000, B0000, B1100, B0000, B0000, B0100, B1100, B0000, B0000, B0000, B1000, B0000, B0001, B0000, B1000, 10 ,
B0000, B0000, B0000, B1100, B0000, B0000, B0000, B1100, B0000, B0000, B0000, B1000, B0000, B0001, B1000, B1000, 10 ,
B0000, B0000, B0000, B1100, B0000, B0000, B0000, B1000, B0000, B0000, B0000, B1000, B0000, B1001, B1000, B1000, 10 ,
B0000, B0000, B0000, B1000, B0000, B0000, B0000, B1000, B0000, B0000, B0000, B1000, B0000, B1101, B1000, B1000, 10 ,
B0000, B0000, B0001, B0000, B0000, B0000, B0000, B1000, B0000, B0000, B0000, B1000, B0000, B1111, B1000, B1000, 10 ,
B0000, B0000, B0001, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B1000, B0000, B1111, B1001, B1000, 10 ,
B0000, B0000, B0001, B0000, B0000, B0000, B0000, B0000, B0000, B0000, B0001, B0000, B0000, B1111, B1001, B1000, 10 ,
B0100, B0000, B0001, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B0000, B0000, B1111, B1001, B0000, 10 ,
B0100, B0000, B0011, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B0000, B0000, B1111, B0001, B0000, 10 ,
B0100, B0000, B0111, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B1111, B0000, 10 ,
B0100, B0100, B0111, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0111, B0000, 10 ,
B0100, B0100, B0111, B0000, B0100, B0000, B0001, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B1001, B0000, 10 ,
B0100, B0100, B0111, B0000, B0100, B0000, B0001, B0000, B0100, B0000, B0001, B0000, B0000, B0000, B1000, B0000, 10 ,
B0100, B0100, B0111, B0000, B0100, B0000, B0001, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B1000, B0000, 10 ,
B0100, B0100, B0111, B0000, B0100, B0000, B0001, B0000, B0100, B0000, B0000, B0000, B1100, B0000, B1000, B0000, 10 ,
B0100, B0100, B0110, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B1100, B1000, B1000, B0000, 10 ,
B0100, B0100, B0100, B0001, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B1100, B1000, B1000, B1000, 10 ,
B0100, B0100, B0000, B0001, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B1100, B1000, B1000, B1100, 10 ,
B0100, B0000, B0000, B0001, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B1100, B1000, B1000, B1110, 10 ,
B0000, B0000, B0000, B0001, B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B1100, B1000, B1000, B1111, 10 ,
B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0000, B0100, B0000, B0000, B0001, B1100, B1000, B1000, B1111, 10 ,
B0000, B0000, B0100, B0001, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B1100, B1000, B1000, B1111, 10 ,
B0000, B0000, B0100, B0011, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B1000, B1000, B1000, B1111, 10 ,
B0000, B0000, B0100, B0111, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B0000, B1000, B1000, B1111, 10 ,
B0000, B0100, B0100, B0111, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B0001, B0000, B1000, B1111, 10 ,
B0100, B0100, B0100, B0111, B0000, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B0001, B0000, B0000, B1111, 10 ,
B0100, B0100, B0100, B0111, B0100, B0000, B0000, B0001, B0000, B0000, B0000, B0001, B0001, B0000, B0000, B0111, 10 ,
B0100, B0100, B0100, B0111, B0100, B0000, B0000, B0001, B0100, B0000, B0000, B0001, B0001, B0000, B0000, B0011, 10 ,
B0100, B0100, B0100, B0111, B0100, B0000, B0000, B0001, B0100, B0000, B0000, B0001, B0101, B0000, B0000, B0001, 10 ,
B0100, B0100, B0100, B0111, B0100, B0000, B0000, B0001, B0100, B0000, B0000, B0001, B0111, B0000, B0000, B0000, 10 ,
B0100, B0100, B0100, B0111, B0100, B0000, B0000, B0001, B0100, B0000, B0010, B0000, B0111, B0001, B0000, B0000, 10 ,
B0100, B0100, B0100, B0111, B0100, B0000, B0000, B0000, B0100, B0000, B0010, B0000, B0111, B0001, B0001, B0000, 10 ,
B0100, B0100, B0100, B0110, B0100, B0000, B0000, B0000, B0100, B0000, B0011, B0000, B0111, B0001, B0001, B0000, 10 ,
B0100, B0100, B0100, B0100, B0100, B0000, B0000, B0000, B0100, B0000, B0111, B0000, B0111, B0001, B0001, B0001, 10 ,
B0100, B0100, B0100, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0111, B0100, B0111, B0001, B0001, B0001, 10 ,
B0100, B0100, B0000, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0111, B0100, B0111, B0001, B0001, B0101, 10 ,
B0100, B0000, B0000, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0111, B0100, B0111, B0001, B0001, B0111, 10 ,
B0000, B0100, B0000, B0000, B0100, B0000, B0000, B0000, B0100, B0000, B0111, B0101, B0111, B0001, B0001, B0111, 10 ,
B0000, B0100, B0000, B0000, B0000, B0000, B0000, B0001, B0100, B0000, B0111, B0101, B0111, B0001, B0001, B0111, 10 ,
B0000, B0100, B0000, B0001, B0000, B0000, B0000, B0001, B0000, B0000, B0111, B0101, B0111, B0001, B0001, B0111, 10 ,
B0000, B0100, B0000, B0011, B0000, B0000, B0000, B0001, B0000, B0000, B0111, B0101, B0011, B0001, B0001, B0111, 10 ,
B0000, B0100, B0000, B0111, B0000, B0000, B0000, B0001, B0000, B0000, B0111, B0101, B0001, B0001, B0001, B0111, 10 ,
B0000, B0100, B0100, B0111, B0000, B0000, B0000, B0001, B0000, B0000, B0111, B0101, B0000, B0001, B0001, B0111, 10 ,
B0100, B0100, B0100, B0111, B0000, B0000, B0000, B0001, B0000, B0000, B0111, B0101, B0001, B0000, B0001, B0111, 10 ,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
;
unsigned int HC595_Temp = 0;
unsigned int HC595_SCLK=8; //SH_CP of 74HC595
unsigned int HC595_LCLK=9; //ST_CP of 74HC595
unsigned int HC595_Data=3; //DS of 74HC595
unsigned int HC595_EN = 2;
unsigned int LED_Pin16= 4;
unsigned int LED_Pin17= 5;
unsigned int LED_Pin18= 6;
unsigned int LED_Pin19= 7;
unsigned int LEDPin[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
unsigned int PlanePin[4] = {4, 5, 6, 7};
//该部分代码可以不用关心,它已经帮我们实现了功能
void LightCube_Init() //光立方引脚初始化
{
pinMode( HC595_LCLK, OUTPUT );
pinMode( HC595_SCLK, OUTPUT );
pinMode( HC595_Data, OUTPUT );
pinMode( HC595_EN, OUTPUT );
pinMode( LED_Pin16, OUTPUT );
pinMode( LED_Pin17, OUTPUT );
pinMode( LED_Pin18, OUTPUT );
pinMode( LED_Pin19, OUTPUT );
digitalWrite(LED_Pin16,LOW);
digitalWrite(LED_Pin17,LOW);
digitalWrite(LED_Pin18,LOW);
digitalWrite(LED_Pin19,LOW);
}
void HC595_WriteData(void) //74HC595写数据
{
// digitalWrite(HC595_LCLK, LOW);
// digitalWrite(HC595_EN, HIGH);
shiftOut(HC595_Data, HC595_SCLK, LSBFIRST, HC595_Temp);
shiftOut(HC595_Data, HC595_SCLK, LSBFIRST, (HC595_Temp >> 8));
digitalWrite(HC595_LCLK, LOW);
digitalWrite(HC595_LCLK, HIGH);
digitalWrite(HC595_EN, LOW);
}
void LightCube_SelfCheckMode(void) //自检模式
{
unsigned char i = 0;
unsigned char j = 0;
//自检模式
for(i = 0; i < 4; i++)
{
digitalWrite( PlanePin[i], HIGH);
}
for(i = 0; i < 4; i++)
{
digitalWrite( PlanePin[i], LOW);
for(j = 0; j < 16; j++)
{
HC595_Temp = (1 << j);
HC595_WriteData();
delay(200);
}
digitalWrite( PlanePin[i], HIGH);
}
for(i = 0; i < 4; i++)
{
digitalWrite( PlanePin[i], LOW);
}
for(j = 0; j < 16; j++)
{
HC595_Temp = (1 << j);
HC595_WriteData();
delay(200);
}
for(i = 0; i < 2; i++)
{
HC595_Temp = 0xFFFF;
HC595_WriteData();
delay(500);
HC595_Temp = 0x0000;
HC595_WriteData();
delay(500);
}
}
//value LED位置 charge LED状态
void LEDStatus_GetData( int value,int charge)
{
if(value >= 16) return;
if(charge != LOW && charge != HIGH) return;
if(charge == LOW)
{
switch (value)
{
case 0: HC595_Temp &=~_BV(15); break;
case 1: HC595_Temp &=~_BV(14); break;
case 2: HC595_Temp &=~_BV(13); break;
case 3: HC595_Temp &=~_BV(12); break;
case 4: HC595_Temp &=~_BV(11); break;
case 5: HC595_Temp &=~_BV(10); break;
case 6: HC595_Temp &=~_BV(9); break;
case 7: HC595_Temp &=~_BV(8); break;
case 8: HC595_Temp &=~_BV(7); break;
case 9: HC595_Temp &=~_BV(6); break;
case 10: HC595_Temp &=~_BV(5); break;
case 11: HC595_Temp &=~_BV(4); break;
case 12: HC595_Temp &=~_BV(3); break;
case 13: HC595_Temp &=~_BV(2); break;
case 14: HC595_Temp &=~_BV(1); break;
case 15: HC595_Temp &=~_BV(0); break;
default:
break;
}
}
else
{
switch (value)
{
case 0: HC595_Temp |=_BV(15); break;
case 1: HC595_Temp |=_BV(14); break;
case 2: HC595_Temp |=_BV(13); break;
case 3: HC595_Temp |=_BV(12); break;
case 4: HC595_Temp |=_BV(11); break;
case 5: HC595_Temp |=_BV(10); break;
case 6: HC595_Temp |=_BV(9); break;
case 7: HC595_Temp |=_BV(8); break;
case 8: HC595_Temp |=_BV(7); break;
case 9: HC595_Temp |=_BV(6); break;
case 10: HC595_Temp |=_BV(5); break;
case 11: HC595_Temp |=_BV(4); break;
case 12: HC595_Temp |=_BV(3); break;
case 13: HC595_Temp |=_BV(2); break;
case 14: HC595_Temp |=_BV(1); break;
case 15: HC595_Temp |=_BV(0); break;
default:
break;
}
}
}
#define ICStation_delay_MAX 10000 // 特效时间设置
#define CUBESIZE 4
#define PLANESIZE CUBESIZE*CUBESIZE
#define PLANETIME 2222
#define TIMECONST 20
unsigned int ICStation_delay =ICStation_delay_MAX;
unsigned int PatternIdx =0;
unsigned int PatternMax = sizeof(imageTab);
void LightCube_FreeMode(void) //自由模式
{
int i = 0, j = 0;
byte PatternBuf[16];
int PatternIdx;
byte DisplayTime;
unsigned long EndTime;
int plane;
int patbufidx;
unsigned char ShiftTemp = 0;
PatternIdx = 0;
do
{
memcpy_P( PatternBuf, imageTab+PatternIdx, 16 ); //拷贝第一帧数据
PatternIdx += PLANESIZE; //索引偏移16
DisplayTime = pgm_read_byte_near( imageTab + PatternIdx++ ); //读取延时时间
EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST;
while ( millis() < EndTime ) //对一帧数据进行处理
{
patbufidx = 0;
for (plane=0; plane < 4; plane++)
{
for (i = 0; i < 4; i++) //四层共阴极全部给1
{
digitalWrite( PlanePin[i], HIGH );
}
for(j = 0; j < 16; j++)
{
LEDStatus_GetData(LEDPin[j], LOW);
}
HC595_WriteData();
for(j = 0; j < 4; j++)
{
for(i = 0; i < 4; i++)
{
if((PatternBuf[patbufidx] >> i) & B0001)
{
LEDStatus_GetData(LEDPin[4 * (j % 4) + i], HIGH);
}
}
patbufidx++;
}
HC595_WriteData();
digitalWrite( PlanePin[plane], LOW );
delayMicroseconds( PLANETIME );
}
}
} while (DisplayTime > 0);
}
int AnalogVal = 0;
int AnalogMapVal = 0;
int ShiftVal = 0;
void setup() {
// put your setup code here, to run once:
pinMode(0, OUTPUT);
digitalWrite(0, HIGH);
Serial.begin(9600);
analogReference(DEFAULT); //选择默认5V作为参考电压
LightCube_Init();
}
void loop() {
LightCube_FreeMode();
}