中断的进入时间配置为:long int tick_=(long int)(60*1000000)/tempo_speed/48;
//解释: 60*1000000是一分钟对应的微秒数;
tempo_speed:拍子速度;
48:将1个拍子的时间分为48份。
user_voice_app();函数放在上述中断中即可。
//各音符对应时值,小数指的是时间差
uint8_t rhythm[rhythm_num][6]=
{
{0,0,0,0,0,0},//0 ♩
{0,24,0,0,0,0},//0 0.5 两连音
{0,16,32,0,0,0},//0 0.33 0.66 三连音
{0,12,24,36,0,0},//0 0.25 0.5 0.75 四连音
{0,24,36,0,0,0},//0 0.5 0.75
{0,12,24,0,0,0},//0 0.25 0.5
{0,36,0,0,0,0},//0 0.75
{0,12,0,0,0,0},//0 0.25
{24,0,0,0,0,0},//0.5
};
uint8_t TickCnt=0; //一个节奏内的时间标志位
uint8_t voiceCnt=0;//声音位置,一个节奏型的某一响
void user_voice_app(void)
{
if(dis_flag==1)
{
switch(TickCnt)
{
case 0:
if(rhythm[rhythm_flag][voiceCnt]==TickCnt)
{
//用户函数 播放重音
voiceCnt++;
}
break;
case 12:
if(rhythm[rhythm_flag][voiceCnt]==TickCnt)
{
//用户函数 播放轻音
voiceCnt++;
}
break;
case 16:
if(rhythm[rhythm_flag][voiceCnt]==TickCnt)
{
//用户函数 播放轻音
voiceCnt++;
}
break;
case 24:
if(rhythm[rhythm_flag][voiceCnt]==TickCnt)
{
//用户函数 播放轻音
voiceCnt++;
}
break;
case 32:
if(rhythm[rhythm_flag][voiceCnt]==TickCnt)
{
//用户函数 播放轻音
voiceCnt++;
}
break;
case 36:
if(rhythm[rhythm_flag][voiceCnt]==TickCnt)
{
//用户函数 播放轻音
voiceCnt++;
}
break;
}
TickCnt++;
if(TickCnt>=47)
{
voiceCnt=0;
// rhythm_flag=0;
TickCnt=0;
}
}
}