?? 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 + -