📄 626622.c
字号:
/* PB1-SCLK;PB2-SIO; PB0-SEL;PB3-RST; */
#include <iom128v.h>
#include <control.h>
#include <macros.h>
extern unsigned char sound_swtich[4];
//---------------------------------------------------------
// NAME: NOP_OP()
// ENTRY: void
// RETURN: void
// FUNCTION:null operation
// MODIFY: 2004.2.3
//--------------------------------------------------------
void NOP_OP(void)
{
return;
}
//---------------------------------------------------------
// NAME: delay_midi()
// ENTRY: void
// RETURN: void
// FUNCTION:delay
// MODIFY: 2004.2.3
//--------------------------------------------------------
void delay_midi(int n)
{
if( n < 1 )
return;
while( n > 0 )
{
NOP_OP ();
WDR();
n--;
}
}
//---------------------------------------------------------
// NAME: delay_ms_midi()
// ENTRY: void
// RETURN: void
// FUNCTION:delay
// MODIFY: 2004.2.3
//--------------------------------------------------------
void delay_ms_midi(int n)
{
if( n < 1 )
return;
while( n > 0 )
{
delayus( 37 );
WDR();
n--;
}
}
//---------------------------------------------------------
// NAME: w_dat()
// ENTRY: dat0
// RETURN: void
// FUNCTION: write the data
// MODIFY: 2004.2.3
//--------------------------------------------------------
void w_dat(unsigned char dat0)
{
unsigned char i;
for( i=0;i<8;i++ )
{
if( dat0&0x80 ) //SIO = 1 at the negative edge of the SCLK
{
PORTB|=0X02;
PORTB|=0x04; //MIDI_DATA_PORT = 0x03; //D0=0 D1=1 : SCLK=0 SIO=1
}
else
{
PORTB|=0X02;
PORTB&=~0x04; //MIDI_DATA_PORT = 0x01; //D0=0 D1=0 : SCLK=0 SIO=0
}
NOP_OP();
NOP_OP();
PORTB&=~0x02; //Generate a falling edge
NOP_OP();
dat0 <<= 1;
}
}
//---------------------------------------------------------
// NAME: w_addr()
// ENTRY: addr0,flg
// RETURN: void
// FUNCTION: write the address
// MODIFY: 2004.2.3
//--------------------------------------------------------
void w_addr(unsigned char addr0,unsigned char flg)
{
addr0<<=1;
//direction BIT:Write operation control BIT 0;Read operation control BIT 1
if(!flg)
addr0 = addr0|0x01;
else
addr0 = addr0&0xfe;
w_dat(addr0);
}
//---------------------------------------------------------
// NAME: w_op()
// ENTRY: addr1,dat1
// RETURN: void
// FUNCTION: write opertion
// MODIFY: 2004.2.3
//--------------------------------------------------------
void w_op( unsigned char addr1 ,unsigned char dat1)
{
DDRB|=0X17;
PORTB&=~0x01; //MIDI_SEL_PORT = 0;
w_addr(addr1,0);
w_dat(dat1);
PORTB|=0x01; //MIDI_SEL_PORT = 1;
}
//---------------------------------------------------------
// NAME: r_op()
// ENTRY: addr1
// RETURN: void
// FUNCTION:read opertion
// MODIFY: 2004.2.3
//--------------------------------------------------------
unsigned char r_op( unsigned char addr1 )
{
unsigned char data,i,temp;
data = 0;
DDRB|=0X17;
PORTB&=~0x01; //MIDI_SEL_PORT = 0;
w_addr(addr1,1); //SCLK = 0;
NOP_OP();
PORTB|=0x02; //MIDI_DATA_PORT = 0x09; //postative edge
DDRB&=~0X04;
for( i=0;i<8;i++ )
{
PORTB|=0x04; //MIDI_DATA_PORT = 0x0A; //negative edge
//generate a positive edge for read data
PORTB&=~0x02; //MIDI_DATA_PORT = 0x0B; //D0=1 D1=1 D3=1: SCLK=0 SIO=1 RST=1
data <<= 1;
temp = PINB; //MIDI_DATA_PORT;
if( temp&0x04 )
data |= 0x01;
PORTB|=0x02;
}
PORTB|=0x01; //MIDI_SEL_PORT = 1;
return (data);
}
/*/---------------------------------------------------------
// NAME: write_fifo()
// ENTRY: melody_data
// RETURN: void
// FUNCTION:write melody data in format A
// MODIFY: 2004.2.3
//--------------------------------------------------------
void write_fifo( unsigned char melody_data[7] )
{
unsigned char i;
for( i=0;i<7;i++ )
{
w_op(melody_data[i]);
}
}*/
//---------------------------------------------------------
// NAME: midi_RST()
// ENTRY: void
// RETURN: void
// FUNCTION:reset the midi chip
// MODIFY: 2004.2.3
//--------------------------------------------------------
void midi_RST( void )
{
DDRB|=0X10;
PORTB&=~0x10; //MIDI_RST_PORT = 0xff;//03;
delay_midi(700);
PORTB|=0x10; //MIDI_RST_PORT = 0xff;//0B;
}
//---------------------------------------------------------
// NAME: midi_init()
// ENTRY: void
// RETURN: void
// FUNCTION:init the midi chip
// MODIFY: 2004.2.3
/*****************************************************/
void midi_init(void)
{
DDRB|=0X03;
PORTB|=0x02; //MIDI_DATA_PORT = 1; //SCLK = 1
PORTB|=0x01; //MIDI_SEL_PORT = 1; //SEL = 1
NOP_OP();
//PLL setup,delay about 10ms then acess the LSI
w_op( 0x1B,0x3d ); //pll
delay_midi(700); //delay 10ms
//Set the totol value
w_op( 0x00,0x01 ); //set the sound to mute
w_op( 0x01,0xff ); //midi volume
w_op( 0x02,0x7f ); //ADPCM volume
w_op( 0x02,0xff ); //ADPCM volume
//Set ADPCM rate
w_op( 0x0c,0x66 ); //Timer setup register1 for SYS_SCLK = 13M
w_op( 0x0d,0x27 ); //Timer setup register2 for SYS_SCLK = 13M
w_op( 0x1C,0x1e ); //ADPCM rate register
//Set FIFO control
w_op( 0x08,0x44 ); //MIDI FIFO control register ,set 1/8
w_op( 0x09,0x44 ); //ADPCM FIFO control register ,set 1/8
//set int enable conditon to 'H'
w_op( 0x03,0x80 );
//reset
w_op( 0x07,0x80 );
NOP_OP();
/*w_op( 0x0e,0x00 ); //no interrupt in play time
w_op( 0x07,0x80 ); //reset
NOP_OP();*/
}
//---------------------------------------------------------
// NAME: write_md_data()
// ENTRY: md
// RETURN: void
// FUNCTION:write midi data
// MODIFY: 2004.2.3
//---------------------------------------------------------
void write_md_data( unsigned char md )
{
w_op( 0x10,0x00 ); //wave select: wavegen.0 is selected
w_op(0x11,0x00); //SD[7:0]
w_op(0x12,md); //MD[6:0]
w_op(0x13,0x03); //Pitch Bend[9:8]
w_op(0x14,0x03); //Pitch Bend[7:0]
w_op(0x15,0x3f); //Lvol[5:0]
w_op(0x16,0x3f); //Rvol[5:0]
w_op(0x17,0x22); //Vib[7:0]
w_op(0x18,0x80); //Note on
w_op( 0x10,0x01 ); //wave select: wavegen.1 is selected
w_op(0x11,0x00); //SD[7:0]
w_op(0x12,md); //MD[6:0]
w_op(0x13,0x03); //Pitch Bend[9:8]
w_op(0x14,0x03); //Pitch Bend[7:0]
w_op(0x15,0x3f); //Lvol[5:0]
w_op(0x16,0x3f); //Rvol[5:0]
w_op(0x17,0x22); //Vib[7:0]
w_op(0x18,0x80); //Note on
w_op( 0x10,0x02 ); //wave select: wavegen.2 is selected
w_op(0x11,0x00); //SD[7:0]
w_op(0x12,md); //MD[6:0]
w_op(0x13,0x03); //Pitch Bend[9:8]
w_op(0x14,0x03); //Pitch Bend[7:0]
w_op(0x15,0x3f); //Lvol[5:0]
w_op(0x16,0x3f); //Rvol[5:0]
w_op(0x17,0x22); //Vib[7:0]
w_op(0x18,0x80); //Note on
w_op( 0x10,0x03 ); //wave select: wavegen.2 is selected
w_op(0x11,0x00); //SD[7:0]
w_op(0x12,md); //MD[6:0]
w_op(0x13,0x03); //Pitch Bend[9:8]
w_op(0x14,0x03); //Pitch Bend[7:0]
w_op(0x15,0x3f); //Lvol[5:0]
w_op(0x16,0x3f); //Rvol[5:0]
w_op(0x17,0x22); //Vib[7:0]
w_op(0x18,0x80); //Note on
w_op( 0x10,0x04 ); //wave select: wavegen.2 is selected
w_op(0x11,0x00); //SD[7:0]
w_op(0x12,md); //MD[6:0]
w_op(0x13,0x03); //Pitch Bend[9:8]
w_op(0x14,0x03); //Pitch Bend[7:0]
w_op(0x15,0x3f); //Lvol[5:0]
w_op(0x16,0x3f); //Rvol[5:0]
w_op(0x17,0x22); //Vib[7:0]
w_op(0x18,0x80); //Note on
}
//---------------------------------------------------------
// NAME: spk_key()
// ENTRY: spkdata
// RETURN: void
// FUNCTION:sound when the key pressed
// MODIFY: 2004.2.3
//---------------------------------------------------------
void spk_key( unsigned char spkdata)
{
if(sound_swtich[0]==0) return;
if(sound_swtich[2]==0) return;
write_md_data(spkdata );
while(!(r_op(0x05)&0x20))
{
w_op(0x0B,0x5F);
delay_midi(600);
}
w_op(0x05,0x20); //clear the nearly full flag
w_op( 0x00,0x00); //cancle totle mute and start to playing music
w_op(0x05,0x01); //start the sequencer
w_op( 0x07,0x80 );
}
//---------------------------------------------------------
// NAME: spk_alarm()
// ENTRY: void
// RETURN: void
// FUNCTION:sound when there is alarm
// MODIFY: 2004.2.3
//---------------------------------------------------------
void spk_alarm(void)
{
unsigned char i;
unsigned char alarm_dat[6]={0x49,0x49,0x47,0x49,0x47,0x49};
if(sound_swtich[0]==0) return;
if(sound_swtich[3]==0) return;
//midi_RST();
//midi_init();
for(i=0;i<1;i++)
{
write_md_data(alarm_dat[i]);
while(!(r_op(0x05)&0x20))
{
w_op(0x0B,0x5F);
delay_midi(600);
}
w_op(0x05,0x20); //clear the nearly full flag
w_op( 0x00,0x00); //cancle totle mute and start to playing music
w_op(0x05,0x01); //start the sequencer
w_op( 0x07,0x80 );
}
}
/*******************************************************/
//sent the sound data to the FIFO
/*******************************************************/
const unsigned char music_data[] = {
0x36,0x37,0x40,0x45,0x47,0x36,0x37,0x40,0x45,0x47,0x31,0x31,0x33,0x32,0x24,0x26,0x25,0x26,
0x20,0x24,0x35,0x32,0x32,0x36,0x26,0x34,0x23,0x16,0x32,0x31,0x23,0x25,0x25,0x26,0x33,0x30,
0x24,0x30,0x20,0x21,0x23,0x23,0x33,0x22,0x35,0x34,0x33,0x34,0x35,0x36,0x36,0x37,0x28,0x28,
0x25,0x27,0x40,0x42,0x45,0x46,0x59,0x28,0x43,0x54,0x55,0x56,0x29,0x58,0x27,0x55,0x56,0x53,
0x51,0x52,0x51,0x55,0x59,0x58,0x46,0x45,0x56,0x43,0x65,0x73,0x65,0x52,0x83,0x54,0x55,0x55,
0x49,0x56,0x66,0x57,0x58,0x82,0x54,0x78,0x78,0x53,0x61,0x45,0x48,0x49,0x47,0x59,0x63,0x54
};
const unsigned char music_data1[]={0x48,0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,0x39};
//---------------------------------------------------------
// NAME: spk_power_on()
// ENTRY: void
// RETURN: void
// FUNCTION:sound when powe on
// MODIFY: 2004.2.3
//---------------------------------------------------------
void spk_power_on(void)
{
unsigned char j;
if(sound_swtich[0]==0) return;
if(sound_swtich[1]==0) return;
for(j=0;j<10;j++)
{
write_md_data( music_data[j] );
while(!(r_op(0x05)&0x20))
{
w_op(0x0B,0x5F);
delay_midi(600);
}
w_op(0x05,0x20); //clear the nearly full flag
w_op( 0x00,0x00); //cancle totle mute and start to playing music
w_op(0x05,0x01); //start the sequencer
delay_midi(600);
w_op( 0x07,0x80 );
}
}
//---------------------------------------------------------
// NAME: spk_power_off()
// ENTRY: void
// RETURN: void
// FUNCTION:sound when powe off
// MODIFY: 2004.2.3
//---------------------------------------------------------
void spk_power_off(void)
{
unsigned char j;
if(sound_swtich[0]==0) return;
if(sound_swtich[1]==0) return;
for(j=0;j<10;j++)
{
write_md_data( music_data1[j] );
while(!(r_op(0x05)&0x20))
{
w_op(0x0B,0x5F);
delay_midi(600);
}
w_op(0x05,0x20); //clear the nearly full flag
w_op( 0x00,0x00); //cancle totle mute and start to playing music
w_op(0x05,0x01); //start the sequencer
delay_midi(600);
w_op( 0x07,0x80 );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -