📄 music.c
字号:
/*****************************************************
Project : sound
Version : 1.0
Date : 2005-7-18
Author : Liu.Qian
Company : HuanXiang GCT
Comments: Creat
*****************************************************/
#include "config.h"
// music
// 7:5 - time:0-7; 4:3 - scale:0-3 ; 2:0 - note:0-7
// time : 0 - 1/32 , 1 - 1/16 , 2 - 1/8 , ... , 7 - 4
// scale : 0 - low , 1 - middle , 2 - high , 3 - super high
// note : 0 - idle , 1~7 - 1~7
UI8 gui8_Music[MUSICSIZE];
UI8 gui8_MusicPtr;
UI16 gui16_MusicTime;
// 所有音节32分音符对应的trigle数
flash UI16 fui16_MusicTime[32]={
TIME_IDLE,TIME_L_1,TIME_L_2,TIME_L_3,TIME_L_4,TIME_L_5,TIME_L_6,TIME_L_7,
TIME_IDLE,TIME_M_1,TIME_M_2,TIME_M_3,TIME_M_4,TIME_M_5,TIME_M_6,TIME_M_7,
TIME_IDLE,TIME_H_1,TIME_H_2,TIME_H_3,TIME_H_4,TIME_H_5,TIME_H_6,TIME_H_7,
TIME_IDLE,TIME_S_1,TIME_S_2,TIME_S_3,TIME_S_4,TIME_S_5,TIME_S_6,TIME_S_7
};
flash UI16 fui16_MusicOCR[32]={
NOTE_IDLE,NOTE_L_1,NOTE_L_2,NOTE_L_3,NOTE_L_4,NOTE_L_5,NOTE_L_6,NOTE_L_7,
NOTE_IDLE,NOTE_M_1,NOTE_M_2,NOTE_M_3,NOTE_M_4,NOTE_M_5,NOTE_M_6,NOTE_M_7,
NOTE_IDLE,NOTE_H_1,NOTE_H_2,NOTE_H_3,NOTE_H_4,NOTE_H_5,NOTE_H_6,NOTE_H_7,
NOTE_IDLE,NOTE_S_1,NOTE_S_2,NOTE_S_3,NOTE_S_4,NOTE_S_5,NOTE_S_6,NOTE_S_7
};
flash UI8 fui8_OKTone[8][MUSICSIZE]={
{MM4,MM5,MM6,MM7,MH1,MH2,MH3,0},
{MH1,MH2,MH3,MH4,MH5,MH6,MH7,0},
{MH4,MH5,MH6,MH7,MS1,MS2,MS3,0},
{MS1,MS2,MS3,MS4,MS5,MS6,MS7,0},
{MH2,MH1,MH4,MH3,MH6,MH5,MS1,0},
{MH4,MH3,MH6,MH5,MS1,MH7,MS3,0},
{MH6,MH5,MS1,MH7,MS3,MS2,MS5,0},
{MS1,MH7,MS3,MS2,MS5,MS4,MS7,0}
};
flash UI8 fui8_NGTone[8][MUSICSIZE]={
{ML7,ML6,ML5,ML4,ML3,ML2,ML1,0},
{MM3,MM2,MM1,ML7,ML6,ML5,ML4,0},
{MM7,MM6,MM5,MM4,MM3,MM2,MM1,0},
{MH3,MH2,MH1,MM7,MM6,MM5,MM4,0},
{MM7,MH1,MM6,MM7,MM3,MM4,ML7,0},
{MM5,MM6,MM4,MM5,MM1,MM2,ML5,0},
{MM3,MM4,MM2,MM3,ML6,ML7,ML3,0},
{MM1,MM2,ML7,MM1,ML4,ML5,ML1,0}
};
flash UI8 fui8_RTTone[8][MUSICSIZE]={
{ML1,MM1,ML1,MM1,ML1,MM1,ML1,0},
{ML3,MM3,ML3,MM3,ML3,MM3,ML3,0},
{ML5,MM5,ML5,MM5,ML5,MM5,ML5,0},
{ML7,MM7,ML7,MM7,ML7,MM7,ML7,0},
{MM1,MH1,MM1,MH1,MM1,MH1,MM1,0},
{MM3,MH3,MM3,MH3,MM3,MH3,MM3,0},
{MM5,MH5,MM5,MH5,MM5,MH5,MM5,0},
{MM7,MH7,MM7,MH7,MM7,MH7,MM7,0}
};
/*****************************************************************************************
Function: music
Description: 按乐谱发声,使用了TMR1定时器
Calls: 无
Called By: 无
Globel RD: gui8_MusicPtr,gui8_Music[]
Globel WR: gui8_MusicPtr
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-11-7
*****************************************************************************************/
void music(void)
{
UI16 temp;
UI8 uc;
if (gui8_MusicPtr < MUSICSIZE)
{
uc = gui8_Music[gui8_MusicPtr];
if( uc != 0)
{
if (uc&0x07)
{//1-7
TCCR1A=0x40;
}
else
{//休止符
TCCR1A=0x00;
}
temp = fui16_MusicOCR[uc&0x1F];
OCR1AH = temp>>8;
OCR1AL = (UI8)temp;
temp = fui16_MusicTime[uc&0x1F];
uc>>=5;
for(;uc>0;uc--)
{
temp <<= 1;
}
gui16_MusicTime = temp;
TCNT1H=0x00;
TCNT1L=0x00;
TCCR1B=0x09; // 启动TMR1,Clk=Fsc
TIMSK |= 0x10; // 开OCR1A中断
TIFR = 0x10; // Clear Int flag
return;
}
}
// 播放完毕
TCCR1B = 0x00; // Stop TMR1
TIMSK &= 0xEF; // 关OCR1A中断
TIFR = 0x10; // Clear Int flag
gui8_MusicPtr = 0;
}
/*****************************************************************************************
Function: bi
Description: bi
Calls: 无
Called By:
Globel RD: 无
Globel WR: 无
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-8-3
*****************************************************************************************/
void bi(void)
{
gui8_Music[0] = MT_16 | MSH | 1;
gui8_Music[1] = 0;
MUSICSTART();
}
/*****************************************************************************************
Function: du
Description: du
Calls: 无
Called By:
Globel RD: 无
Globel WR: 无
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-8-3
*****************************************************************************************/
void du(void)
{
gui8_Music[0] = MT_16 | MSL | 1;
gui8_Music[1] = 0;
MUSICSTART();
}
/*****************************************************************************************
Function: badkey
Description: 无效按键
Calls: 无
Called By:
Globel RD: 无
Globel WR: 无
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-4-4
*****************************************************************************************/
void badkey(void)
{
gui8_Music[0] = MT_16 | MSL | 4;
gui8_Music[1] = MT_16 | MSL | 1;
gui8_Music[2] = 0;
MUSICSTART();
}
/*****************************************************************************************
Function: goodkey
Description: 有效按键
Calls: 无
Called By:
Globel RD: 无
Globel WR: 无
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-4-4
*****************************************************************************************/
void goodkey(void)
{
gui8_Music[0] = MT_16 | MSH | 1;
gui8_Music[1] = MT_16 | MSH | 4;
gui8_Music[2] = 0;
MUSICSTART();
}
/*****************************************************************************************
Function: musicOK
Description: OK提示音
Calls: 无
Called By: 无
Globel RD: gui8_ok_tone
Globel WR: gui8_Music
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-4-5
*****************************************************************************************/
void musicOK(void)
{
UI8 temp;
for ( temp = 0 ; temp < MUSICSIZE ;temp ++ )
{
gui8_Music[temp] = fui8_OKTone[gui8_ok_tone&0x07][temp];
}
MUSICSTART();
}
/*****************************************************************************************
Function: musicNG
Description: NG提示音
Calls: 无
Called By: 无
Globel RD: gui8_ng_tone
Globel WR: gui8_Music
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-4-5
*****************************************************************************************/
void musicNG(void)
{
UI8 temp;
for ( temp = 0 ; temp < MUSICSIZE ;temp ++ )
{
gui8_Music[temp] = fui8_NGTone[gui8_ng_tone&0x07][temp];
}
MUSICSTART();
}
/*****************************************************************************************
Function: musicRT
Description: RT提示音
Calls: 无
Called By: 无
Globel RD: gui8_rt_tone
Globel WR: gui8_Music
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-4-5
*****************************************************************************************/
void musicRT(void)
{
UI8 temp;
for ( temp = 0 ; temp < MUSICSIZE ;temp ++ )
{
gui8_Music[temp] = fui8_RTTone[gui8_rt_tone&0x07][temp];
}
MUSICSTART();
}
/*****************************************************************************************
Function:
Description: Timer 1 output compare A interrupt service routine
Calls: 无
Called By: 无
Globel RD: 无
Globel WR: 无
Input: 无
Output: 无
Return: 无
Others: 无
Auther: Liu.Qian
Time: 2005-3-30
*****************************************************************************************/
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
if (gui16_MusicTime)
{
gui16_MusicTime--;
}
else
{
gui8_MusicPtr ++;
music();
}
}
//end of file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -