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

📄 key_2.c

📁 采用TMS320LF2407实现乐曲的自动演奏
💻 C
字号:
#include "2407A.h"  

void initial();                             /*初始化子程序 */ 
void timerint();                            /*定时器3初始化子程序 */
void pwminitial();                          /*PWM初始化子程序 */

unsigned char m[71];
unsigned int i=0;		       



void inline disable()
{
	asm(" SETC INTM");	                    /*禁止所有中断*/
}

void inline enable()
{
	asm(" CLRC INTM");	                    /*开放所有中断 */
}


void initial()
{
	asm(" SETC SXM");                       /*抑制符号位扩展 */ 
	asm(" SETC OVM");                       /*根据遇到溢出的情况,累加器被设置为它的最大正值或负值 */
	asm(" SETC CNF");                       /*B0被设置为程序存储空间 */

	*SCSR1=0X8FFE;			                /*clock=0.5*fin;使能ADC、SCI、SPI、CAN、EVA、EVB模块*/	
	*WDCR=0X06f;
	*WDKEY=0X5555;
	*WDKEY=0XAAAA;          		        /*disable watch dog*/ 
	
	*IMR=0X0002;			             	/*允许INT2中断*/
	*IFR=0XFFFF;				            /*清除全部中断标志*/
	WSGR=0X00;				                /*禁止所有等待状态*/
	
	*MCRA=*MCRA|0X0040;			            /*IOPA6端口设置为基本功能,PWM1 */  
	
	m[0]=0x42;
    m[1]=0x61;
    m[2]=0x81;
    m[3]=0x72;
    m[4]=0x61;
    m[5]=0x51;
    m[6]=0x42;
    m[7]=0x62;
    m[8]=0x52;
    m[9]=0x32;
    m[10]=0x42;
    m[11]=0x61;
    m[12]=0x81;
    m[13]=0x72;
    m[14]=0x61;
    m[15]=0x71;
    m[16]=0x84;
    m[17]=0x01;
    m[18]=0xB2;
    m[19]=0xA1;
    m[20]=0xB1;
    m[21]=0x82;
    m[22]=0x71;
    m[23]=0x61;
    m[24]=0x74;
    m[25]=0x01;
    m[26]=0xA2;
    m[27]=0x31;
    m[28]=0x41;
    m[29]=0x52;
    m[30]=0x41;
    m[31]=0x31;
    m[32]=0x44;
    m[33]=0x01;
    m[34]=0x62;
    m[35]=0x61;
    m[36]=0x71;
    m[37]=0xA2;
    m[38]=0xB1;
    m[39]=0xA1;
    m[40]=0x94;
    m[41]=0x01;
    m[42]=0xA1;
    m[43]=0xB1;
    m[44]=0x72;
    m[45]=0x71;
    m[46]=0x81;
    m[47]=0x72;
    m[48]=0x61;
    m[49]=0x41;
    m[50]=0x74;
    m[51]=0x01;
    m[52]=0x81;
    m[53]=0x71;
    m[54]=0x62;
    m[55]=0x01;
    m[56]=0xC2;
    m[57]=0xB1;
    m[58]=0xA1;
    m[59]=0xB4;
    m[60]=0xD2;
    m[61]=0x71;
    m[62]=0x81;
    m[63]=0xA2;
    m[64]=0x31;
    m[65]=0x41;
    m[66]=0x52;
    m[67]=0x41;
    m[68]=0x31;
    m[69]=0x44;
    m[70]=0x02;
}

void timerint()
{
	
	*EVBIMRA=*EVBIMRA|0X0080;	            /*允许定时器3的周期中断*/
	*EVBIFRA=*EVBIFRA|0Xffff;	            /*清除定时器3周期中断标志*/
	*T3CON=0X170C;		                	/*Timer3为连续增计数模式,预分频值为128,使用内部时钟*/
	*T3PER=0X2625;                          /*1/4second*/
	*T3CNT=0X00;			                /*Timer3的计数器清零 */
	
}

void  pwminitial()
{
    *ACTRA=0X0001;                          /*PWM1高有效!!!!*/   
    *DBTCONA=0X00;                          /*不使能死区控制*/
    *COMCONA=0X8200;                        /*使能比较操作*/
    *T1CON=0X1000;                          /*Timer1为连续增计数模式,预分频值为1,使用内部时钟,Timer1比较使能*/
}

void main()
{
	disable();
	initial();
	timerint();
	pwminitial();
	enable();

	*T3CON=*T3CON|0X0040;			        /*启动Timer3*/
	
	while(1)
	{
	asm(" nop"); 
	}
}

void interrupt T3_INT()
{
	unsigned int flag;
    unsigned char note,length,tmp1,tmp2;
        
    flag=*EVBIFRA&0X0080;
	if(flag==0x0080)
	{
		*T3CON=*T3CON&0XFFBF;				/*stop timer3 */
		*T3CNT=0X00;				        /*reset timer3 */
		*EVBIFRA=*EVBIFRA|0X0080;		    /*clearn flag */  
		
		tmp1=tmp2=m[i];
		note=tmp1&0xF0;
		length=tmp2&0x0F;
		
		if(note<0x60)
		{
		    switch(note)
			{
				case 0x10:                                   /*↓MI*/
					*CMPR1=0X1D97;                    
			                *T1PER=0X3B2E;                   /*F=330Hz,T=3.030ms*/
              		        *T1CON=*T1CON|0X0040;            /*启动Timer1 */ 
			                break;
				case 0x20:                                   /*↓FA*/
					        *CMPR1=0X1BFA;                    
			                *T1PER=0X37F5;                   /*F=349Hz,T=2.865ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
				case 0x30:                                   /*↓SO*/
				        	*CMPR1=0X18E9;                    
			                *T1PER=0X31D3;                   /*F=392Hz,T=2.551ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
				case 0x40:                                   /*↓LA*/
					        *CMPR1=0X1630;                    
			                *T1PER=0X2C60;                   /*F=440Hz,T=2.272ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
				case 0x50:                                   /*↓SI*/
					        *CMPR1=0X13C4;                    
			                *T1PER=0X2788;                   /*F=494Hz,T=2.024ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
				default :*T1CON=*T1CON&0XFFBF;		/*STOP Timer1 */ 
			}
		}
		else 
		{
			switch(note)
			{
				case 0x60:                                   /*DO*/
					        *CMPR1=0X12AC;                    
			                *T1PER=0X2558;                   /*F=523Hz,T=1.912ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
				case 0x70:                                   /*RE*/
					        *CMPR1=0X10E5;                    
			                *T1PER=0X21CA;                   /*F=578Hz,T=1.730ms*/
              		                *T1CON=*T1CON|0X0040;            
			                break;
				case 0x80:                                   /*MI*/
					        *CMPR1=0X0ED0;                    
			                *T1PER=0X1DA1;                   /*F=659Hz,T=1.517ms*/
              		        *T1CON=*T1CON|0X0040;           
			                break;
				case 0x90:                                   /*FA*/
					        *CMPR1=0X0DFE;                    
			                *T1PER=0X1BFD;                   /*F=698Hz,T=1.433ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;		
				case 0xA0:                                   /*SO*/
					        *CMPR1=0X0C76;                    
			                *T1PER=0X18EC;                   /*F=784Hz,T=1.276ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
				case 0xB0:                                   /*LA*/
					        *CMPR1=0X0B18;                    
			                *T1PER=0X1630;                   /*F=880Hz,T=1.136ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
				case 0xC0:                                   /*SI*/
					        *CMPR1=0X09E2;                    
			                *T1PER=0X13C4;                   /*F=988Hz,T=1.012ms*/
              		        *T1CON=*T1CON|0X0040;           
			                break;
				case 0xD0:                                   /*↑DO*/
					        *CMPR1=0X0956;                    
			                *T1PER=0X12AC;                   /*F=1046Hz,T=0.956ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
				case 0xE0:                                   /*↑RE*/
					*CMPR1=0X084F;                    
			                *T1PER=0X109F;                   /*F=1175Hz,T=0.851ms*/
              		        *T1CON=*T1CON|0X0040;           
			                break;
				case 0xF0:                                   /*↑MI*/
					*CMPR1=0X0769;                    
			                *T1PER=0X0ED3;                   /*F=1318Hz,T=0.759ms*/
              		        *T1CON=*T1CON|0X0040;            
			                break;
                		default :*T1CON=*T1CON&0XFFBF;		/*STOP Timer1 */ 
			}
		}
	    i=++i;
	    if(i>=71)
	    {
	    	i=0;	
	    }
		switch(length)
		{
			    case 1:
				       *T3PER=0X2625;                        /*1/4second*/
				       *T3CON=*T3CON|0X0040;	             /*启动Timer3*/
				       break;
			    case 2:
				       *T3PER=0X4C4B;                        /*1/2second*/
			               *T3CON=*T3CON|0X0040;	        
				       break;
			    case 4:
				       *T3PER=0X9896;                        /*1second*/ 
				       *T3CON=*T3CON|0X0040;      
				       break;
			    case 8:
				       *T3PER=0X00;                  
				       *T3CON=*T3CON|0X0040;	        
				       break;
			    default:
				       *T3PER=0X2625;                        /*1/4second*/
				       *T3CON=*T3CON|0X0040;	        
		}
	enable();				                                 /*开中断*/
	return;					                                 /*中断返回*/
	}
	else 
	{
		enable();
		return;
	} 		
}
		
void interrupt nothing( ) 
{
 	enable();
 	return;
}

⌨️ 快捷键说明

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