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

📄 speaker.c

📁 ti-dsp-2407的led显示以及电机控制和音频输出源码
💻 C
字号:
#include "2407c.h"                    
#define T46uS		0x0d40
#define nMusicNumber 16 
#define nhalfnum 8 
ioport unsigned char port8001;	
ioport unsigned char port8005;	

unsigned char ledbuf[8],ledx[8];
unsigned char ledkey[8]=
	{0x1E,0x21,0x42,0x84,0x84,0x42,0x21,0x1E} ; //heart


void interrupt gptime1(void);     
void gp_init(void);      
char ConvertScanToChar(unsigned char cScanCode);
void Delay(unsigned int nDelay);
void delaym(unsigned int nDelay);
unsigned int uWork,nCount,nCount1;  
unsigned int showheart;
unsigned int music[nMusicNumber][2]=
{
/*{151,480},{135,480},{121,480},{113,480},{101,480},{91,480},{81,480},{75,480}*/ 
 /*{91,480},  {101,480},{121,480},{101,480}, {151,480},{91,480},{101,480},{91,480}*/
 {151,480},{121,480},{101,480},{101,480},{91,480},{101,480},{121,480},{151,480},
  {101,480},{101,480},{101,480},{121,480},{151,480},{101,480},{151,480},{101,480}
};

ioport unsigned char port8001;	
void musicspk(unsigned char kind);

main()
{   char cKey;
	unsigned char nScanCode,musicflag;
	unsigned int uWork1,nSpeed,i;

	*WDCR=0x6f;
	*WDKEY=0x5555;
	*WDKEY=0xaaaa;    
	*SCSR1=0x81fe;    //40m      
	
	uWork=(*MCRC);
	uWork&=0x0efdf;	/* PWM11/IOPE5,TDIR2/IOPF4 for normal I/O ports */
	(*MCRC)=uWork; 
	
	uWork=(*MCRB);
	uWork&=0x0ffbf;	/* CANTX/IOPC6 for normal I/O port */
	(*MCRB)=uWork;
	 nCount=0;
	gp_init();   
	*IMR=0x3;
	*IFR=0xffff;    
	nCount=0;
	uWork=(*WSGR);
	uWork&=0x0fe3f;
	(*WSGR)=uWork; 
	for ( uWork=0;uWork<8;uWork++ )
	{
		ledbuf[uWork]=0x0ff;    
		ledx[uWork]=1<<(uWork);  
	}
		
	uWork=(*PFDATDIR);
	uWork|=0x1000;
	uWork1&=0xffef;		/* Set direct=0 */
	(*PFDATDIR)=uWork;
	asm(" clrc INTM");         
	Delay(128);
	*T1PR=T46uS; 
	nSpeed=T46uS;
	showheart=0;
	for ( i=0;i<nMusicNumber;i++ )
	{
		music[i][0]*=24;
	}
	while(1)
	{   
			if(showheart==1)   
			{
				for ( i=0;i<8;i++ )
				ledbuf[i]=~ledkey[7-i];    /*把字符码存入数组ledbuf,取反后才能点亮LED   */               
	            /*Delay(128); */
				for ( i=0;i<8;i++ )
				{
				port8005=ledx[i]; 			   
				port8005=ledbuf[i];
				Delay(1);  
				} 
			} 
			else
			{
				
			}
		if ( nCount>=16 )
		{
			nCount=0;
			nCount1=0; 
			cKey=0;
			nScanCode=port8001;
			nScanCode&=0x0ff;  
	 
			if ( nScanCode!=0 )
			{
				cKey=ConvertScanToChar(nScanCode);
				if ( cKey=='0' )
				{                   
				
   					*T1PR=T46uS*9/5; 
					uWork1=(*PFDATDIR);
					uWork1|=0x0010;	/* Set direct=1 */
					(*PFDATDIR)=uWork1;
   					Delay(128);
   					*T1PR=nSpeed; 
                    musicflag=0;  
                    musicspk(musicflag); 
				}
				else if ( cKey=='1' )
				{  
   					*T1PR=T46uS*9/5; 
					uWork1=(*PFDATDIR);
					uWork1&=0xffef;	/* Set direct=0 */
					(*PFDATDIR)=uWork1;
   					Delay(128);
   					*T1PR=nSpeed;
   					musicflag=1;
   					musicspk(musicflag);
   					
			    }
				else if ( cKey=='2' )
				{
   					if ( nSpeed== 0x17D9 )
   						nSpeed=T46uS;
   					else
   						nSpeed=0x17D9;
   					*T1PR=nSpeed;  
   					musicflag=2;
   					musicspk(musicflag);
				}
				else if ( cKey=='3' )
				{
   					if ( nSpeed== 0x0a40 )
   						nSpeed=T46uS;
   					else
   						nSpeed=0x0a40;
   					*T1PR=nSpeed;   
   					musicflag=3; 
   					musicspk(musicflag);
				} 
				if ( cKey=='A' )
				{ 
				showheart=1;
				}
				Delay(128);
				//musicspk(musicflag);
				Delay(128);
				musicflag=8;
			} 
		}
	}
}               
  
void musicspk(unsigned char kind)
{ 
int i,nCount1=0;
switch(kind) 
{
case 0:{for(i=0;i<nMusicNumber;i++)
	    {
		
		nCount1++;
		*T3PR = music[nCount1][0];
		delaym(music[nCount1][1]); 
	    }  
       } 
       break;  
case 1: 
   {  nCount1=16;
for(i=0;i<16;i++)
	{
		
		nCount1--;
		*T3PR = music[nCount1][0];
		delaym(music[nCount1][1]); 
	} 
   }  
   	break;

case 2:
{
 for(i=0;i<nMusicNumber;i++)
	    {
		
		nCount1++;
		*T3PR = music[nCount1][0]; 
		delaym(music[nCount1][1]+240);
	    } 
}   
   	break; 
case 3:
{
for(i=0;i<16;i++)
	    {  		
		nCount1++;
		*T3PR = music[nCount1][0]; 
		delaym(music[nCount1][1]-240);
	    } 
}
	break;

default:   	break;  
 }  	
}  

void interrupt gptime1(void)
{   
 int i;
   uWork=(*PIVR); 
     
   switch(uWork)
   {  
   		case 0x27:
   		{
			(*EVAIFRA)=0x80;
			uWork=(*PEDATDIR);
			uWork|=0x2000;
			uWork^=0x0020;
			(*PEDATDIR)=uWork;
			nCount++;
   		   	break; 
   		
   		}
   		case 0x2F:
   		{
			(*EVBIFRA)=0x80;
			{
				uWork=(*PCDATDIR);
				uWork|=0x4000;
				uWork^=0x40;
				(*PCDATDIR)=uWork;
			}
   		   	break;
   		}
   }
 }                       

void gp_init(void)
{
   *EVAIMRA = 0x80;
   *EVAIFRA = 0xffff;
   *GPTCONA = 0x0100;
   *T1PR    = T46uS*9/5; 
   *T1CNT   = 0;
   *T1CON   = 0x1340;
    *EVBIMRA = 0x80;
   *EVBIFRA = 0xffff;
   *GPTCONB = 0x0100;
   *T3PR    = music[nCount][0]; 
   *T3CNT   = 0;
   *T3CON   = 0x1340;
}

                     
char KeyLUT[16]={ '0','1','2','3', 
  			      '4','5','6','7',
				  '8','9','A','B',
				  'C','D','E','F'
				};
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 Delay(unsigned int nDelay)
{
	int i,j,k;
	
	for ( i=0;i<nDelay;i++ )
		for ( j=0;j<256;j++ )
			k++;
}

void delaym(unsigned int nDelay)
{
	int ii,jj,kk,i;  
	for ( i=0;i<8;i++ )
	ledbuf[i]=~ledkey[7-i];    /*把字符码存入数组ledbuf,取反后才能点亮LED   */               

	for ( ii=0;ii<nDelay;ii++ ) 
	{   
		
		for ( jj=0;jj<230;jj++ )
		{
			kk++;
		} 
	} 
	for ( i=0;i<8;i++ )
			{
			port8005=ledx[i];    
			port8005=ledbuf[i];  
			}
}

⌨️ 快捷键说明

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