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

📄 led.c

📁 ti-dsp-2407的led显示以及电机控制和音频输出源码
💻 C
字号:
#include "2407c.h"   
#define  nMusicNumber  9
void interrupt gptime1(void);     
void gp_init(void);      
void delay(unsigned int nDelay);

unsigned int uWork,uWork1;
int sKey;/*,nCount;    */
unsigned int music[nMusicNumber][2]=
{
	{151,480},{135,480},{121,480},{113,480},{101,480},{91,480},{81,480},{75,480},{0,480}
};
/* 
   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
.     .

*/                  

ioport unsigned char port8001;	
ioport unsigned char port8005;	

char ConvertScanToChar(unsigned char cScanCode); /*将键盘扫描码转换为字符  */

unsigned char ledbuf[8],ledx[8];
unsigned char ledkey[16][8]=
{
	{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},  //0
	{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},  //3
	{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},  //4
	{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; 

	int i,nKeyCode,sKey;
	
	for ( i=0;i<nMusicNumber;i++ )
	{
		music[i][0]*=24;
	}
	
	for ( uWork=0;uWork<8;uWork++ )
	{
		ledbuf[uWork]=0x0ff;    
		ledx[uWork]=1<<(uWork);  
	}
	*WDCR=0x6f;
	*WDKEY=0x5555;
	*WDKEY=0xaaaa;    /* 关闭看门狗中断 */
	*SCSR1=0x81fe;   /* 打开所有外设,设置时钟频率40MHz */
	
	uWork1=(*MCRB);
	uWork1&=0x0ffbf;	/* CANTX/IOPC6 for normal I/O port */
	(*MCRB)=uWork1;
	/*nCount=0;  */
	gp_init(); 
	
	*IMR=0x3;
	*IFR=0xffff;    

	uWork=(*WSGR);   /*设置等待状态寄存器,以适应较慢的外部数据源     */
	uWork&=0x0fe3f;
	(*WSGR)=uWork;
	
	asm(" clrc INTM");  
	
	for(;;)
	{/*键盘的扫描码由DSP的I/O扩展地址0x8001给出,当有键盘输入时,读此端口得到扫描码,当无键被按下时读此端口的结果为0   */
		nScanCode=port8001; 
		nScanCode&=0x0ff;  
		/*if ( nScanCode!=0 )
		{
			
		}*/
		
		
		if ( nScanCode!=0 )
		{
		    cKey=ConvertScanToChar(nScanCode);
			nKeyCode=( cKey>='0' && cKey<='9' )?(cKey-'0'):(cKey-'A'+10);
			for ( i=0;i<8;i++ )
				{ledbuf[i]=~ledkey[nKeyCode][7-i]; }   /*把字符码存入数组ledbuf,取反后才能点亮LED   */
		       
		   if( cKey>='0' && cKey<='9' ) 
	       {
	        sKey=(int)cKey;
		    sKey-=49; 
			delay(music[sKey][1]);
			*T1PR = music[sKey][0]; 
		   } 
		    else
		   {
		     delay(music[8][1]);
			 *T1PR = music[8][0]; 
		   }
		}
		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'
				};
char ConvertScanToChar(unsigned char cScanCode)
{
	int nWork4;
	unsigned int uWork2,uWork3;
	 
	uWork2=uWork3=cScanCode;
	uWork2>>=4; 		       
	uWork3&=0x0f; 		         
														/*  0x18,0x14,0x12,0x11     对应 0,1,2,3
															0x28,0x24,0x22,0x21          4,5,6,7
															0x48,0x44,0x42,0x41			 8,9,A, B
															0x88,0x84,0x82,0x81          C, D, E, F     */
	switch ( uWork2 )
	{
		case 1: nWork4=0; break;
		case 2: nWork4=4; break;
		case 4: nWork4=8; break;
		case 8: nWork4=12; break;
	}
	switch ( uWork3 )
	{
		case 1: nWork4+=3; break;
		case 2: nWork4+=2; break;
		case 4: nWork4+=1; break;
	}
	return KeyLUT[nWork4];
}


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

void gp_init(void)
{
   *EVAIMRA = 0x80;
   *EVAIFRA = 0xffff;
   *GPTCONA = 0x0100;  /*由周期中断标志来启动 */
   *T1PR    = music[sKey][0]; 
   *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++;
}


 

⌨️ 快捷键说明

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