#include <LiquidCrystal.h>
#define Do 262
#define Re 294
#define Mi 330
#define Fa 349
#define Sol 392
#define La 440
#define Si 494
#define Do_h 523
#define Re_h 587
#define Mi_h 659
#define Fa_h 698
#define Sol_h 784
#define La_h 880
#define Si_h 988
int length;
int scale[]={Sol,Sol,La,Sol,Do_h,Si,
Sol,Sol,La,Sol,Re_h,Do_h,
Sol,Sol,Sol_h,Mi_h,Do_h,Si,La,
Fa_h,Fa_h,Mi_h,Do_h,Re_h,Do_h}; //生日歌曲谱
float durt[]=
{
0.5,0.5,1,1,1,1+1,
0.5,0.5,1,1,1,1+1,
0.5,0.5,1,1,1,1,1,
0.5,0.5,1,1,1,1+1,
}; //音长
int tonepin=13; //用8号引脚
int ledpin[] = {12,11,10,9,8,7};
int ledpin_other[] = {12,7,8,9,10,11};
int all_time = 100;
//通过关联任何需要的LCD接口引脚来初始化库与arduino pin号连接
//一般先定义各自的引脚
int rs = 1, enable = 2, d4 = 3, d5 =4, d6 = 5, d7 = 6;
LiquidCrystal lcd(rs,enable,d4,d5,d6,d7);
// 显示字符
byte heart[8] = { B00000, B01010, B11111,B11111,B01110,B00100,B00000,B00000};
void setup()
{
pinMode(tonepin,OUTPUT);
pinMode(ledpin,OUTPUT);
length=sizeof(scale)/sizeof(scale[0]); //计算长度
//设置LCD的列和行数:
lcd.begin(16, 2);
//输出信息到LCD。
lcd.setCursor(0, 0);
lcd.print("Happy Birth!");
lcd.setCursor(8, 1);
lcd.print("My wife");
lcd.createChar(0,heart);
lcd.setCursor(7, 1);
lcd.write(byte(0));
lcd.setCursor(15, 1);
lcd.write(byte(0));
}
void stage_one(int x)
{
digitalWrite(ledpin[x%6],HIGH);
delay(500*durt[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整
digitalWrite(ledpin[x%6],LOW);
delay(100*durt[x]);
}
void stage_two(int x)
{
digitalWrite(ledpin[x%6],HIGH);
delay(500*durt[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整
// digitalWrite(ledpin[x%7],LOW);
delay(100*durt[x]);
if (x== 11){
for(int k=0;k<6;k++)
{
digitalWrite(ledpin[k],LOW);
}
}
}
void stage_three(int x)
{
if (x== 18){
for(int k=0;k<6;k++)
{
digitalWrite(ledpin_other[k],LOW);
}
delay(500*durt[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整
delay(100*durt[x]);
return 0;
}
digitalWrite(ledpin_other[x%6],HIGH);
delay(500*durt[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整
delay(100*durt[x]);
}
void stage_four(int x)
{
for(int k=0;k<6;k++)
{
digitalWrite(ledpin[k],HIGH);
}
// digitalWrite(ledpin[x%7],HIGH);
delay(500*durt[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整
for(int k=0;k<6;k++)
{
digitalWrite(ledpin[k],LOW);
}
delay(100*durt[x]);
}
void loop()
{
for(int i = 0;i<all_time;i++)
{
for(int x=0;x<length;x++)
{
tone(tonepin,scale[x]);
if(x>=0 && x<6)
{
stage_one(x);
}
if(x>=6 && x<12)
{
stage_two(x);
}
if(x>=12 && x<19)
{
stage_three(x);
}
if(x>=19 && x<25)
{
stage_four(x);
}
noTone(tonepin);
}}
delay(3000);
}