131 lines
2.5 KiB
C
131 lines
2.5 KiB
C
sbit beep=P1^0; //连接扬声器
|
|
sbit up=P1^1; //升调键
|
|
sbit down=P1^2; //降调键
|
|
sbit play=P3^2; //播放键,中断
|
|
sbit led=P1^3; //指示灯
|
|
|
|
unsigned char CurFreHigh=0x00; //当前频率对应的定时器值-高字节
|
|
unsigned char CurFreLow=0x00; //当前频率对应的定时器值-低字节
|
|
unsigned char temp=0x00; //存储当前按键值,无变化则不重装定时器
|
|
unsigned char fre, len; //播放时的音高,音长
|
|
unsigned char PlayIndex; //用于中断切歌
|
|
unsigned char Playing; //当前播放音乐的序号
|
|
unsigned char key=0; //获取按键值
|
|
|
|
|
|
void delay(unsigned char i)
|
|
{
|
|
unsigned char j,k;
|
|
while(i--)
|
|
{
|
|
j=0xFF;
|
|
while(j--)
|
|
{
|
|
k=0x20;
|
|
while(k--) if(PlayIndex!=Playing) return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Play(unsigned char index)
|
|
{
|
|
unsigned int i=0; //播放第一曲
|
|
if(index==2) i+=68; //第二曲
|
|
if(index==3) i+=218; //第三曲
|
|
if(index==4) i+=606; //第四曲
|
|
if(index==5) i+=684; //第五曲
|
|
if(index==6) //进入待机
|
|
{
|
|
led=0;
|
|
delay(1);
|
|
led=1;
|
|
delay(2);
|
|
led=0;
|
|
delay(1);
|
|
led=1;
|
|
delay(2);
|
|
led=0;
|
|
beep=1;
|
|
PCON=0x02;
|
|
}
|
|
while(1)
|
|
{
|
|
if(index!=PlayIndex) break;
|
|
fre=music[i++];
|
|
len=music[i++];
|
|
CurFreHigh=FreqTabHigh[fre];
|
|
CurFreLow=FreqTabLow[fre];
|
|
TH0=CurFreHigh;
|
|
TL0=CurFreLow;
|
|
TR0=1;
|
|
if(len==0x00)
|
|
{
|
|
// PlayIndex=0;
|
|
// Playing=0;
|
|
break;
|
|
}
|
|
delay(len);
|
|
TR0=0;
|
|
}
|
|
TR0=0;
|
|
}
|
|
|
|
void InitInt() //初始化中断
|
|
{
|
|
TMOD=0x01;
|
|
IT0=1;
|
|
IE=0x83;
|
|
}
|
|
void sound(unsigned char i) //判断是否升降调并播放按键对应的音阶
|
|
{
|
|
up=down=1;
|
|
if((up)&&(!down)) i-=12;
|
|
if((!up)&&(down)) i+=12;
|
|
CurFreHigh=FreqTabHigh[i];
|
|
CurFreLow=FreqTabLow[i];
|
|
TH0=CurFreHigh;
|
|
TL0=CurFreLow;
|
|
TR0=1;
|
|
}
|
|
|
|
void Int0() interrupt 0 //播放键按下时
|
|
{
|
|
delay(5);
|
|
led=1;
|
|
PlayIndex=(PlayIndex+1)%7;
|
|
}
|
|
|
|
void Timer0() interrupt 1
|
|
{
|
|
TH0=CurFreHigh;
|
|
TL0=CurFreLow;
|
|
if(CurFreLow) beep=~beep;
|
|
}
|
|
|
|
void keydown() //扫描按键值
|
|
{
|
|
P2=0xC0;
|
|
key=0;
|
|
if(P2!=0xC0)
|
|
{
|
|
P2=0xC0;
|
|
switch(P2)
|
|
{
|
|
case(0x40): key=1; break;
|
|
case(0x80): key=2; break;
|
|
}
|
|
P2=0x3F;
|
|
switch(P2)
|
|
{
|
|
case(0x1F): break;
|
|
case(0x2F): key+=2;break;
|
|
case(0x37): key+=4;break;
|
|
case(0x3B): key+=6;break;
|
|
case(0x3D): key+=8;break;
|
|
case(0x3E): key+=10;break;
|
|
}
|
|
|
|
}
|
|
}
|