51单片机之简单的音乐播放器
扫描二维码
随时随地手机看文章
/*************************************************************
音乐播放器:
按键0-9对应最多10首乐曲,当一首乐曲播放完毕后,
响应按键的动作去播放相应的音乐,另外,右、下这两个按键
对应着下一首,左上这两个按键对应着上一首。
作者:宁静致远
*************************************************************/
#include
#include
#defineRldTmr(fr)65536-(11059200/12)/((fr)<<1)
#defineFuDian(n)((n)<<1)/3//附点n分音符的换算
typedefunsignedcharuchar;
typedefunsignedintuint;
typedefunsignedlongulong;
typedefstructmusic{
char*pNote;
char*pDur;
}Music;
sbitBUZZ=P1^6;
sbitKEY_OUT_3=P2^0;
sbitKEY_OUT_2=P2^1;
sbitKEY_OUT_1=P2^2;
sbitKEY_OUT_0=P2^3;
sbitKEY_IN_0=P2^4;
sbitKEY_IN_1=P2^5;
sbitKEY_IN_2=P2^6;
sbitKEY_IN_3=P2^7;
uintcodenoteFreq[]={//中音1-7和高音1-7对应的频率列表低音
523,587,659,698,784,880,988,
1047,1175,1319,1397,1568,1760,1976,
//261,293,329,349,392,440,494
};
uintcodetmrRld[]={//中音1-7和高音1-7对应的定时器重载值
RldTmr(523),RldTmr(587),RldTmr(659),RldTmr(698),RldTmr(784),RldTmr(880),RldTmr(988),
RldTmr(1047),RldTmr(1175),RldTmr(1319),RldTmr(1397),RldTmr(1568),RldTmr(1760),RldTmr(1976),
//RldTmr(261),RldTmr(293),RldTmr(329),RldTmr(349),RldTmr(392),RldTmr(440),RldTmr(494)
};
ucharcodekeyCodeMap[4][4]={//矩阵按键编号到标准键盘键码的映射表
{0x31,0x32,0x33,0x26},//数字键1、数字键2、数字键3、向上键
{0x34,0x35,0x36,0x25},//数字键4、数字键5、数字键6、向左键
{0x37,0x38,0x39,0x28},//数字键7、数字键8、数字键9、向下键
{0x30,0x1B,0x0D,0x27}//数字键0、ESC键、回车键、向右键
};
ucharkeyState[4][4]={//全部矩阵按键的当前状态
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
bitenable=1,tmrFlg=0;
ucharT0RH=0XFF,T0RL=0X00;
ucharT1RH,T1RL;
ucharmusicIdx=0;
ucharmusicSpeed=72;
ucharnowMusic=0;
//bitenKey=1;
ucharcodetwoTigerNote[]={//音名
1,2,3,1,
1,2,3,1,
3,4,5,
3,4,5,
5,6,5,4,3,1,
5,6,5,4,3,1,
1,5,1,
1,5,1,
'