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

📄 speaker.c

📁 dsp各模块相结合
💻 C
字号:
#include "2407c.h"                    
#define nMusicNumber 40

#define T46uS		0x0d40

#define LCDDELAY 1

#define LCDCMDTURNON 0x3f
#define LCDCMDTURNOFF 0x3e
#define LCDCMDSTARTLINE 0xc0
#define LCDCMDPAGE 0xb8
#define LCDCMDVERADDRESS 0x40

ioport unsigned char port8001;
ioport unsigned char port8002;
ioport unsigned char port8003;
ioport unsigned char port8004;   
ioport unsigned char port8005;

void interrupt gptime1(void);       //speaker
void gp_init(void);      
void delay(unsigned int nDelay);

void interrupt gptime1(void);     
void gp_init(void);      
char ConvertScanToChar(unsigned char cScanCode);  //key
void Delay(unsigned int nDelay);


void Delay(unsigned int nTime);		// 延时子程序  lcd
void TurnOnLCD();			// 打开显示
void LCDCLS();				// 清除屏幕显示内容
void display16( int page,int line,int number,unsigned char (*pos)[32]); 



unsigned int uWork,nCount;
unsigned int music[nMusicNumber][2]=
{
	{182,480},{151,480},{135,480},{121,480},{135,480},{151,480},{182,480},{0,480},
	{182,480},{151,480},{135,480},{121,480},{135,480},{151,480},{182,480},{0,480},
	{182,240},{151,240},{135,240},{121,240},{135,240},{151,240},{182,240},{0,240},
	{182,240},{151,240},{135,240},{121,240},{135,240},{151,240},{182,240},{0,240},
	{182,1920},{151,1920},{135,1920},{121,1920},{135,1920},{151,1920},{182,1920},{0,1920} 
};
/* 
   C   D   E   F   G   A   B
   1   2   3   4   5   6   7   11
C: 264,297,330,352,396,440,495,528

music[][0]=1/264*1000000/25nS(for 40MHz DSP clock)

6123216
.     .

*/
unsigned char coursedesign[4][32]=          /*lcd*/
{

{
	0x20, 0x21, 0xee, 0x04, 0x00, 0x00, 0x00, 0x7e, 0x4a, 0x4a, 0xfe, 0x4a, 0x4a, 0x7e, 0x00, 0x00, 
	0x00, 0x00, 0x3f, 0x10, 0x08, 0x21, 0x11, 0x09, 0x05, 0x03, 0xff, 0x05, 0x09, 0x31, 0x11, 0x00, 
},
	
{
	0x10, 0x12, 0xd2, 0xfe, 0x91, 0x11, 0x80, 0xbf, 0xa1, 0xa1, 0xa1, 0xa1, 0xbf, 0x80, 0x00, 0x00, 
	0x04, 0x03, 0x00, 0xff, 0x00, 0x41, 0x44, 0x44, 0x44, 0x7f, 0x44, 0x44, 0x44, 0x44, 0x40, 0x00,
},

{
	0x40, 0x41, 0xce, 0x04, 0x00, 0x80, 0x40, 0xbe, 0x82, 0x82, 0x82, 0xbe, 0xc0, 0x40, 0x40, 0x00, 
	0x00, 0x00, 0x7f, 0x20, 0x90, 0x80, 0x40, 0x43, 0x2c, 0x10, 0x10, 0x2c, 0x43, 0xc0, 0x40, 0x00, 
},
 
{
	0x20, 0x21, 0x2e, 0xe4, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0x20, 0x00, 
	0x00, 0x00, 0x00, 0x7f, 0x20, 0x10, 0x08, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
},

};


unsigned char ledbuf[8],ledx[8];         /*key*/
unsigned char ledkey[16][8]=
{
	{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},
	{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00},	//1
	{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00},	//2
	{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},
	{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},
	{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},
	{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},
	{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},
	{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},
	{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00},
	{0x00,0x00,0xF8,0x24,0x22,0x24,0xF8,0x00},
	{0x00,0x00,0xFE,0x92,0x92,0x92,0x6C,0x00},
	{0x00,0x00,0x7C,0x82,0x82,0x82,0x44,0x00},
	{0x00,0x00,0xFE,0x82,0x82,0x82,0x7C,0x00},
	{0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x00},
	{0x00,0x00,0xFE,0x12,0x12,0x12,0x12,0x00}
};

main()
{   
	char cKey=0;
	unsigned char nScanCode;
	unsigned int uWork1,nSpeed;
	/*unsigned char nScanCode; */
	unsigned int uWork,uWork2,uWork3; 
	int i,nKeyCode;
	
	for ( uWork=0;uWork<8;uWork++ )
	{
		ledbuf[uWork]=0x0ff;
		ledx[uWork]=1<<(uWork);
	}

	*WDCR=0x6f;
	*WDKEY=0x5555;
	*WDKEY=0xaaaa;    
	*SCSR1=0x81fe;    //40m      
	*IMR=0x3;
	*IFR=0xffff; 
		
	uWork=(*WSGR);    
	uWork&=0x0fe3f;
	(*WSGR)=uWork; 
	 
	 
	LCDCLS();				// 清除显示内存
	TurnOnLCD();				// 打开显示
	display16(2,0,4,coursedesign);     
	//do{}while(1);
	
	nCount=0;
	//gp_init();   
	  
	for(;;)
	{
		nScanCode=port8001;
		nScanCode&=0x0ff;
		if ( nScanCode!=0 )
		{
			cKey=ConvertScanToChar(nScanCode);
		}
		if ( nScanCode!=0 )
		{
			nKeyCode=( cKey>='0' && cKey<='9' )?(cKey-'0'):(cKey-'A'+10);
			for ( i=0;i<8;i++ )
				ledbuf[i]=~ledkey[nKeyCode][7-i];
		   if(cKey='1')
		    {   
		    	void motor();
				
		     }
		     if(cKey='2')
		     {  
		     	void speaker();
		     	
			}	   
		} 
		  
		for ( i=0;i<8;i++ )
		{
			port8005=ledx[i];
			port8005=ledbuf[i];
		    
		      
		}
	}
 '
 

}               

char KeyLUT[16]={ '0','1','2','3', 
  			      '4','5','6','7',
				  '8','9','A','B',
				  'C','D','E','F'
				};

void interrupt gptime1(void)
{
   uWork=(*PIVR);
   switch(uWork)
   {  
   		case 0x27:
   		{
			(*EVAIFRA)=0x80;
			{
				uWork=(*PCDATDIR);
				uWork|=0x4000;
				uWork^=0x40;
				(*PCDATDIR)=uWork;
				(*PEDATDIR)=uWork;
				
			}
   		   	break;
   		}
   }
}                       

void gp_init(void)
{
   *EVAIMRA = 0x80;
   *EVAIFRA = 0xffff;
   *GPTCONA = 0x0100;
   *T1PR    = T46uS*9/5;; 
   *T1CNT   = 0;
   *T1CON   = 0x1340;
}

void delay(unsigned int nDelay)
{
	int ii,jj,kk;
	for ( ii=0;ii<nDelay;ii++ )
		for ( jj=0;jj<256;jj++ )
			kk++;
}
                   

void Delay(unsigned int nDelay)
{
	int ii,jj,kk=0;
	for ( ii=0;ii<nDelay;ii++ )
	{
		for ( jj=0;jj<64;jj++ )
		{
			kk++;
		}
	}
} 

   

void TurnOnLCD()
{
	port8001=LCDCMDTURNON;
	port8002=0;
	Delay(1024);  
	port8001=LCDCMDSTARTLINE;
	port8002=0;
	Delay(LCDDELAY);
}

void LCDCLS()
{
	int i,j;
	port8001=LCDCMDSTARTLINE;
	port8002=0;
	Delay(LCDDELAY);
	for ( i=0;i<8;i++ )
	{
		port8001=LCDCMDPAGE+i;
		port8002=0;
		Delay(LCDDELAY);
		port8001=LCDCMDVERADDRESS;
		port8002=0;
		Delay(LCDDELAY);
		for ( j=0;j<64;j++ )
		{
			port8003=0;
			port8002=0;
			Delay(LCDDELAY);
		}
		port8001=LCDCMDPAGE+i;
		port8002=0;
		Delay(LCDDELAY);
		port8001=LCDCMDVERADDRESS;
		port8002=0;
		Delay(LCDDELAY);
		for ( j=0;j<64;j++ )
		{
			port8004=0;
			port8002=0;
			Delay(LCDDELAY);
		}
	}
}

void display16( int page,int line,int number,unsigned char (*pos)[32])
{
	int i,n,p,m;
   
	for(n=0;n<number;n++)   //8个字的依次显示
		 {
		 p=0;	
		  for(m=0;m<2;m++)//每个字需要显示2个页                         
			{
			port8001=LCDCMDPAGE+m+page;		// 设置操作页=m+1
			port8002=0;
			Delay(LCDDELAY);
			
			
			port8001=LCDCMDVERADDRESS+n*16+line;	// 起始列=n*16+8
			port8002=0;
			Delay(LCDDELAY);
			for ( i=0;i<16;i++,p++ )
			{
				if((n*16+line+i)<64)
				{	
				port8003=pos[n][p];	// 屏幕左侧第1至32行第i列赋值						
				port8002=0;			// (赋值后当前操作列自动加1,所以不需设置)
				port8002=0;
				Delay(LCDDELAY);
				}
		        else
				{
				  port8001=LCDCMDVERADDRESS+n*16+line+i-64;
				  port8002=0;
				  port8004=pos[n][p];	// 屏幕左侧第1至32行第i列赋值						
				  port8002=0;			// (赋值后当前操作列自动加1,所以不需设置)
				  port8002=0;
				  Delay(LCDDELAY);
				}
		     }
		 }    
		     
		}     

} 

char ConvertScanToChar(unsigned char cScanCode)
{
	int nWork;
	unsigned int uWork1,uWork2;
	 
	uWork1=uWork2=cScanCode;
	uWork1>>=4;
	uWork2&=0x0f;
	switch ( uWork1 )
	{
		case 1: nWork=0; break;
		case 2: nWork=4; break;
		case 4: nWork=8; break;
		case 8: nWork=12; break;
	}
	switch ( uWork2 )
	{
		case 1: nWork+=3; break;
		case 2: nWork+=2; break;
		case 4: nWork+=1; break;
	}
	return KeyLUT[nWork];
}
  	
  	
void motor()
{  	
	char cKey;
	unsigned char nScanCode;
  	unsigned int uWork,uWork1,nSpeed;
  	void interrupt gptime1(void);     
	void gp_init(void);      
	char ConvertScanToChar(unsigned char cScanCode);
	void Delay(unsigned int nDelay);
  	uWork=(*MCRC);
	uWork&=0x0efdf;	/* PWM11/IOPE5,TDIR2/IOPF4 for normal I/O ports */
	(*MCRC)=uWork;
  	nCount=0;
  	uWork=(*PFDATDIR);
	uWork|=0x1000;
	uWork1&=0xffef;		/* Set direct=0 */
	(*PFDATDIR)=uWork;
	asm(" clrc INTM");         
	Delay(128);
	*T1PR=T46uS; 
	nSpeed=T46uS;
	for(;;)
	{
		if ( nCount>=16 )
		{
			nCount=0;
			nScanCode=port8001;
			nScanCode&=0x0ff;
			if ( nScanCode!=0 )
			{
				cKey=ConvertScanToChar(nScanCode);
				if ( cKey=='A' )
				{
   					*T1PR=T46uS*9/5; 
					uWork1=(*PFDATDIR);
					uWork1|=0x0010;	/* Set direct=1 */
					(*PFDATDIR)=uWork1;
   					Delay(128);
   					*T1PR=nSpeed; 
				}
				else if ( cKey=='B' )
				{
   					*T1PR=T46uS*9/5; 
					uWork1=(*PFDATDIR);
					uWork1&=0xffef;	/* Set direct=0 */
					(*PFDATDIR)=uWork1;
   					Delay(128);
   					*T1PR=nSpeed; 
				}
				else if ( cKey=='C' )
				{
   					if ( nSpeed== 0x17D9 )
   						nSpeed=T46uS;
   					else
   						nSpeed=0x17D9;
   					*T1PR=nSpeed; 
				}
				else if ( cKey=='D' )
				{
   					if ( nSpeed== 0x0a40 )
   						nSpeed=T46uS;
   					else
   						nSpeed=0x0a40;
   					*T1PR=nSpeed; 
				}
			}
		}
	}   
	
}   


void speaker()
{     
	int i;
	void interrupt gptime1(void);     
	void gp_init(void);      
	void delay(unsigned int nDelay);
	
	for ( i=0;i<nMusicNumber;i++ )
	{
		music[i][0]*=24;
	}
	uWork=(*MCRB);
	uWork&=0x0ffbf;	/* CANTX/IOPC6 for normal I/O port */
	
	(*MCRB)=uWork;
	
	asm(" clrc INTM");         
	
	for(;;)
	{
		delay(music[nCount][1]);
		nCount++;
		nCount%=nMusicNumber;
		*T1PR = music[nCount][0]; 
	}
	
	nCount=0;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -