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

📄 key_1.c

📁 采用TMS320LF2407实现电子琴演奏功能
💻 C
字号:
#include "2407A.h"  

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

unsigned int CMPR=0X4A9C;	        		        /*设置PWM周期变量 */
unsigned int TPER=0X9538;	
unsigned int key;		                /*设置Timer1周期变量 */

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=0X87FE;			        /*clock=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 */
	*MCRC=*MCRC&0XFF00;                    /*IOPE端口设置为一般的I/O功能 */

	*PEDATDIR=*PEDATDIR&0X00FF;		/*IOPE端口设置为输入方式*/ 
	*PEDATDIR=*PEDATDIR&0XFF00;		/*IOPE端口设置为输入方式*/
}

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

void  pwminitial()
{
    *ACTRA=0X0001;                          /*PWM1高有效*/   
    *DBTCONA=0X00;                        /*不使能死区控制*/
    *CMPR1=CMPR;                            /*设置CMPR1,以确定输出占空比*/                                            
    *T1PER=TPER;                           /*设置Timer1周期寄存器,以确定PWM周期*/
    *COMCONA=0X8200;                        /*使能比较操作*/
    *T1CON=0X1000;                          /*Timer1为连续增计数模式,预分频值为1,使用内部时钟,Timer1比较使能*/
}

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

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

void interrupt T3_INT()
{
	unsigned int flag;
       
        flag=*EVBIFRA&0X0080;
	if(flag==0x0080)
	{
		*T3CNT=0X00;				/*reset timer3 */
		*EVBIFRA=*EVBIFRA|0X0080;		/*clearn flag */  
		
		key=*PEDATDIR&0X00FF;
		
		switch(key)   				/*键盘顺序改变 */   
		{	
	    	case 247:                             /*do  00000001*/
			  *CMPR1=0X4A9C;                   
			  *T1PER=0X9538;                  /*F=261.5Hz,T=3.82ms   0.0128*/
                       	  *T1CON=*T1CON|0X0040;         /*启动Timer1 */ 
			  break;
		case 251:	                            /*re  00000010*/
			  *CMPR1=0X429A;                   
			  *T1PER=0X8534;                  /*F=293.4Hz,T=3.41ms */
               		  *T1CON=*T1CON|0X0040;    
			  break;
		case 253:	                            /*mi  00000100*/
			  *CMPR1=0X3B60;                   
			  *T1PER=0X76C0;                  /*F=328.9Hz,T=3.04ms */
              	          *T1CON=*T1CON|0X0040;     
			  break;
		case 254:                             /*fa  00001000*/
			  *CMPR1=0X37DC;                   
			  *T1PER=0X6FB8;                  /*F=349.2Hz,T=2.86ms*/
              	          *T1CON=*T1CON|0X0040;     
			  break;
		case 127:                            	/*so  00010000*/
			  *CMPR1=0X319C;                   
			  *T1PER=0X6338;                  /*F=393Hz,T=2.54ms*/
              	          *T1CON=*T1CON|0X0040;     
			  break;
		case 191:                            	/*la  00100000*/
			  *CMPR1=0X2C56;                   
			  *T1PER=0X58AC;                  /*F=440Hz,T=2.27ms*/
              	          *T1CON=*T1CON|0X0040;    
			  break;
		case 223:                            	/*si  01000000*/
			  *CMPR1=0X37A6;                   
			  *T1PER=0X4F4C;                  /*F=492.1Hz,T=2.03ms */
              	          *T1CON=*T1CON|0X0040;     
			  break;
		case 239:                           	/*!do 10000000*/
			  *CMPR1=0X251C;                   
			  *T1PER=0X4A38;                  /*F=525.2Hz,T=1.9ms*/
              	          *T1CON=*T1CON|0X0040;     
			  break;
		default :*T1CON=*T1CON&0XFFBF;		/*STOP Timer1 */ 
		}	
		enable();				/*open interrupt*/
		return;					/*interrupt back */	
	}
	else 
	{
		enable();
		return;
	} 
}

void interrupt nothing( ) 
{
 	enable();
 	return;
}

⌨️ 快捷键说明

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