#include "LedControl.h"//点阵显示库
#include "pitches.h"//音符库
#include "SCoop.h"//双线程库
int DIN = 12;
int CS = 11;
int CLK = 10;
int i;
int j;
int a;
int noteDuration;
int melody[] = {
NOTE_G4,//5
NOTE_G4,//5
NOTE_A4,//6
NOTE_G4,//5
NOTE_C5,//1.
NOTE_B4,//7
NOTE_G4,//5
NOTE_G4,//5
NOTE_A4,//6
NOTE_G4,//5
NOTE_D5,//2.
NOTE_C5,//1.
NOTE_G4,//5
NOTE_G4,//5
NOTE_G5,//5.
NOTE_E5,//3.
NOTE_C5,//1.
NOTE_B4,//7
NOTE_A4,//6
NOTE_F5,//4.
NOTE_F5,//4.
NOTE_E5,//3.
NOTE_C5,//1.
NOTE_D5,//2.
NOTE_C5,//1.
};
//祝你生日快乐的简谱
int noteDurations[] = {
8,8,4,4,4,2,
8,8,4,4,4,2,
8,8,4,4,4,4,2,
8,8,4,4,4,1,
};
//音符时值 8为八分音符 4为四分音符
LedControl lc=LedControl(DIN,CLK,CS,4); //点阵管脚定义
byte s[32]={0x49,0xE4,0x22,0x19,0x25,0xE2,0x4A,0x02,0x02,0x4A,0xE2,0x25,0x19,0x22,0xE4,0x49,
0x20,0x90,0x48,0x28,0xF0,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x28,0x48,0x90,0x20,
};//螃蟹图案
byte r[32]={0x00,0x41,0xE2,0x19,0xE5,0x42,0x0A,0x02,0x02,0x0A,0x42,0xE5,0x19,0xE2,0x41,0x00,
0x92,0x24,0x48,0x28,0xF0,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x28,0x48,0x24,0x92,
}; //螃蟹图案
defineTask(Task1);//设置线程1
void Task1::setup()
{
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(8,OUTPUT);
}
//线程1初始
void Task1::loop()
{
for (int thisNote = 0; thisNote < (sizeof(melody)/sizeof(melody[0])); thisNote++) //循环一首歌的音符
{
a++;
if(a>6){a=0;}
int noteDuration = 1000/noteDurations[thisNote];//每个音符对应的时值
tone(8, melody[thisNote],noteDuration);
switch (a)
{
case 0:
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
break;
case 1:
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
break;
case 2:
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
break;
case 3:
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
break;
case 4:
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
break;
case 5:
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
break;
case 6:
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
break;
}// GRB 彩灯 每个音符变一次颜色
int pauseBetweenNotes = noteDuration * 1.30; //时值的实际时间长度
sleep(pauseBetweenNotes);//延时实际长度
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
noTone(8);
}
sleep(1000);
}
//线程1loop
defineTask(Task2);
void Task2::setup()
{
for(j=0;j<4;j++)
{
lc.shutdown(j,false); //启动时,MAX72XX处于省电模式
lc.setIntensity(j,8); //将亮度设置为最大值
lc.clearDisplay(j); //清除显示
}
}
void Task2::loop()
{
for(i=0;i<8;i++)
{
lc.setRow(0,i,s[i+24]); //四个点阵显示图案
lc.setRow(1,i,s[i+8]);
lc.setRow(2,i,s[i+16]);
lc.setRow(3,i,s[i]);
}
sleep(300);
for(i=0;i<8;i++)
{
lc.setRow(0,i,r[i+24]);
lc.setRow(1,i,r[i+8]);
lc.setRow(2,i,r[i+16]);
lc.setRow(3,i,r[i]);
}
sleep(300);
}
void setup ()
{
mySCoop.start();
}
void loop()
{
yield();
}
双线程SCOOP要使用Sleep()延时,硬件为四块MAX7219点阵模块联机。


