📄 music.c~
字号:
#include "music.h"
/************************************************************
播放音乐使能TIME1之前必须完成以下工作
初始化*pMusic指针,使其指向某一首音乐
初始化maxMusic,使其等于*pMusic指针指向的音乐的数据的个数
初始化音乐播放的次数playCycle
初始化OCR1A,使其对应于第一个音符
初始化第一个音符比较匹配的次数iCompaCycle
初时话iMusicCycle为1
************************************************************/
/************************************************************
Timer1比较匹配中断处理函数
************************************************************/
interrupt [TIM1_COMPA] void Timer1CompaIsr(void)
{
if (--iCompaCycle == 0) //比较匹配次数是否到了
{
if(iMusicCycle < maxMusic) // 判断最后一个音符是否已经被播放
{
OCR1A = dataOfOCR1A[pMusic[++iMusicCycle]]; //装入下一个音符的数据
iCompaCycle = counter[pMusic[iMusicCycle]];
iCompaCycle = iCompaCycle * pMusic[++iMusicCycle];
if(OCR1A == 2500) // IF语句判断OCR1A中是否是装入了空音符的数据,如果是的话就把PD5释放
{
TCCR1A = 0x00;
}
else if (TCCR1A == 0x00) //非空音符时,如果PD5引脚已经释放,则与OCR1连接
{
TCCR1A = 0x40;
}
}
else if(--playCycle != 0) //判断播放次数是否已经为0
{
OCR1A = dataOfOCR1A[pMusic[0]]; //重新装入第一个音符的数据
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
if(OCR1A == 2500) // IF语句判断OCR1A中是否是装入了空音符的数据,如果是的话就把PD5释放
{
TCCR1A = 0x00;
}
else if (TCCR1A == 0x00) //非空音符时,如果PD5引脚已经释放,则与OCR1连接
{
TCCR1A = 0x40;
}
}
else
{
TCCR1B = 0x08; //播放结束,关闭TIME1的时钟
}
}
}
/************************************************************
函数MusicInit用于初始化音乐播放
************************************************************/
void MusicInit(void)
{
DDRD.5 = 1; //设置PD5为输出引脚
PORTD.5 = 0; //
TCCR1A = 0x40; //比较匹配时触发PD5引脚
TCCR1B = 0x08; //CTC模式,先不启动定时器
TIMSK |= 0x10; //开放定时器1的比较匹配功能
}
/************************************************************
函数void PlayMusic(unsigned char musicChoose, unsigned char counterChoose)
中musicChoose为选择播放的音乐,counterChoose为播放次数
************************************************************/
void PlayMusic(unsigned char musicChoose, unsigned char counterChoose)
{
//switch语句把选择的音乐序号对应的音乐数据付给pMusic指针
switch (musicChoose)
{
case 1:
pMusic = music1;
maxMusic = maxMusic1;
break;
case 2:
pMusic = music2;
maxMusic = maxMusic2;
break;
case 3:
pMusic = music3;
maxMusic = maxMusic3;
break;
case 4:
pMusic = music4;
maxMusic = maxMusic4;
break;
case 5:
pMusic = music5;
maxMusic = maxMusic5;
break;
case 6:
pMusic = music6;
maxMusic = maxMusic6;
break;
case 7:
pMusic = music7;
maxMusic = maxMusic7;
break;
case 8:
pMusic = music8;
maxMusic = maxMusic8;
break;
case 9:
pMusic = music9;
maxMusic = maxMusic9;
break;
case 10:
pMusic = music10;
maxMusic = maxMusic10;
break;
};
playCycle = counterChoose; //音乐播放次数赋值
OCR1A = dataOfOCR1A[pMusic[0]]; //第一个音符赋值
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
if(OCR1A == 2500) // IF语句判断OCR1A中是否是装入了空音符的数据,如果是的话就把PD5释放
{
TCCR1A = 0x00;
}
else if (TCCR1A == 0x00) //非空音符时,如果PD5引脚已经释放,则与OCR1连接
{
TCCR1A = 0x40;
}
TCCR1B = 0x0A; //开启定时器工作
}
void PlayMusic1(unsigned char counter1)
{
pMusic = music1;
maxMusic = maxMusic1;
playCycle = counter1;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic2(unsigned char counter2)
{
pMusic = music2;
maxMusic = maxMusic2;
playCycle = counter2;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic3(unsigned char counter3)
{
pMusic = music3;
maxMusic = maxMusic3;
playCycle = counter3;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic4(unsigned char counter4)
{
pMusic = music4;
maxMusic = maxMusic4;
playCycle = counter4;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic5(unsigned char counter5)
{
pMusic = music5;
maxMusic = maxMusic5;
playCycle = counter5;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic6(unsigned char counter6)
{
pMusic = music6;
maxMusic = maxMusic6;
playCycle = counter6;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic7(unsigned char counter7)
{
pMusic = music7;
maxMusic = maxMusic7;
playCycle = counter7;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic8(unsigned char counter8)
{
pMusic = music8;
maxMusic = maxMusic8;
playCycle = counter8;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic9(unsigned char counter9)
{
pMusic = music9;
maxMusic = maxMusic9;
playCycle = counter9;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
void PlayMusic10(unsigned char counter10)
{
pMusic = music10;
maxMusic = maxMusic10;
playCycle = counter10;
OCR1A = dataOfOCR1A[pMusic[0]];
iCompaCycle = counter[pMusic[0]] * pMusic[1];
iMusicCycle = 1;
TCCR1B = 0x0A;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -