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

📄 626622.c

📁 一个电子产品开发时的部分c代码C!绝对能用!
💻 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 + -