⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.c

📁 音乐程序
💻 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 + -