piano-C51/function.h

131 lines
2.5 KiB
C
Raw Normal View History

2018-04-14 13:20:15 +08:00
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;
}
}
}