4.4主程序
main() { uint i; k=8;
init();
for(i=0;i<15;i++) { WriteData(tab[i]);
mydelay(50);
} mydelay(1000);
WriteCMD(0x80+0x40+2);
for(i=0;i<6;i++)
{ WriteData(tab1[i]); mydelay(50);
}
InitialSound();
while(1) { Getch(); if(k==0)
{ uint i;
init();
for(i=0;i<10;i++) {
WriteData(tab2[i]); mydelay(50);
}
mydelay(1000); WriteCMD(0x80+0x40); for(i=0;i<9;i++) { WriteData(tab3[i]);
mydelay(50);
}
Play(Music_Girl,0,3,360); Delay1ms(500);
break;
17
//LCD写数据函数写第一行
//将指针设到第二行空两字符 //发音初始化程序 //扫描键盘,获得键值
//若键值为0
//写第一首歌序号
//转到第二行
//写歌名
//播放第一首歌
}
//若键值为1
{
uint i; init();
for(i=0;i<11;i++) { } { }
Play(Music_Jingle,0,3,360); //播放第二首歌 Delay1ms(500); break;
WriteData(tab5[i]); mydelay(50);
//写歌名
mydelay(1000);
WriteCMD(0x80+0x40); for(i=0;i<11;i++)
//转到第二行
WriteData(tab4[i]); mydelay(50);
//写第二首歌序号
else if (k==1)
} {
else if (k==2) //若键值为2
uint i; init();
for(i=0;i<10;i++) { }
mydelay(1000); //WriteCMD(0x01); WriteCMD(0x80+0x40); for(i=0;i<6;i++) { }
Play(Music_Two,0,3,360); Delay1ms(500); break;
//播放第三首歌
WriteData(tab7[i]); mydelay(50);
//写歌名
//转到第二行
WriteData(tab6[i]); mydelay(50);
//写第三首歌序号
}
18
}
else if (k==3) //若键值为3
{
uint i;
init();
for(i=0;i<10;i++) { WriteData(tab8[i]);
mydelay(50);
} mydelay(1000);
WriteCMD(0x80+0x40);
for(i=0;i<6;i++) { WriteData(tab9[i]);
mydelay(50);
} Play(Music_Four,0,3,360); Delay1ms(500);
break;
}
}
19
//写第四首歌序号
//转到第二行
//写歌名 //播放第三首歌
4.5音乐播放程序流程图
开始创建新的频率表计算歌曲长度读音符根据音符对应求出发音长度否蜂鸣器发声判断音符是否读完或暂停键是否按下是蜂鸣器停止发音结束
图9 音乐播放程序流程图
4.6音乐播放程序
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) {
unsigned int NewFreTab[12]; unsigned char i,j;
//新的频率表
unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD; for(i=0;i<12;i++) {
j = i + Signature; if(j > 11)
20
// 根据调号及升降八度来生成新的频率表
}
{ } else
NewFreTab[i] = FreTab[j]; j = j-12;
NewFreTab[i] = FreTab[j]*2;
if(Octachord == 1)
NewFreTab[i]>>=2; NewFreTab[i]<<=2;
else if(Octachord == 3)
SoundLength = 0;
while(Sound[SoundLength] != 0x00) //计算歌曲长度 { } Point = 0;
Tone = Sound[Point]; Length = Sound[Point+1];
LDiv0 = 12000/Speed; LDiv4 = LDiv0/4; TR0 = 0; TR1 = 1;
while(Point < SoundLength&&K1==1) {
SL=Tone; SH=Tone/100; if(SL!=0) {
if (SM==1) CurrentFre >>= 2; if (SM==3) CurrentFre <<= 2;
//低音 //高音
//计算出音符 //计算出高低音 //计算出是否升半 //查出对应音符的频率
SM=Tone/10;
//歌曲代码未放完且暂停键未被按下
// 算出1分音符的长度(几个10ms)
// 算出4分音符的长度
// 读出第一个音符和它时时值
SoundLength+=2;
LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准
CurrentFre = NewFreTab[SignTab[SL-1]+SH];
21
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于单片机的电子音乐盒的设计 - 图文(5)在线全文阅读。
相关推荐: