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

📄 tone.c

📁 DSP5000实验箱上完整的实验程序,很有参考价值
💻 C
字号:
#include "stdio.h"
#include "math.h"
//IO定义
ioport unsigned int port8000;
ioport unsigned int port8001;
extern void WRITEAD50(void);
short int delayed_input(short int latest_input, int delay_time);
void bargraph(short int input);
#define LED 0x00
#define pi 3.1415926 
#define Length 512
int i, k, delay_time;
short int switch_value;
short int output1, output2;
unsigned short int MAXIMUM_INPUT = 32768;   
volatile char polling =1 ;
short int in[Length], out[Length];
short int delay_array[8000];

//函数定义
extern void InitMcBSP0(void);
extern void ms_delay(int);
extern void send_0(void);
extern void send_1(void);
extern void send_2(void);
extern void send_end(void);
extern void INT3_ISR(void);
extern void InitC5410(void);
extern void write_command(void);
extern void write_data(void);
extern void OpenMcBSP(void);
extern void CloseMcBSP(void);
extern void READAD50(void);
extern void Int(void);
extern void init_lcm(void);
extern void ddram_clear(void);
interrupt void key_int();
void  gdram_clear(void);
void  set_gdram_addr(unsigned int addr);
void  gdram_draw(void);
void  gdram_disp(void);
void  gdram_write_word(unsigned int fir_word,unsigned int sec_word); 
void  setup_expand_mode(void);
//void  display_led(void);
void  gdram_intial(unsigned char *DPTR0);
void send_byte( unsigned char out_byte);
void write7279(unsigned int cmd,unsigned int dta);
void long_delay(void);
void short_delay(void);
//***HD7279定义指令***
#define CMD_RESET 0xa4
#define CMD_TEST  0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
#define INPUT   0x111
#define AC0  0x80
#define AC1  0x90
#define AC2  0x88
#define AC3  0x98


//变量定义
unsigned int byteout;
unsigned int  gdram_cur_x;
unsigned int  gdram_cur_y;
unsigned int bmp_width;
unsigned int bmp_height;
unsigned int *a=(unsigned int *)0x0015;
unsigned char *data=(unsigned char *)0x114;
unsigned int temp;
unsigned int R0,R1,R2,R3;
unsigned char *DPTR;
unsigned char key_a=0,key_b=0x22;
unsigned int j=0,l=0,m=0,n=0;
unsigned char clear[64][16];
int input,output;
int *px = (int*)0x110;
int *py = (int*)0x112;		
//主函数
void main(void)
{
   for(i=0;i<8000;i++)
   {
    delay_array[i]=0;
   }
  
    InitC5410();//
    OpenMcBSP();
    Int();
    while (1)
     {
      		READAD50();
			input = *px;
			in[k]  = input;
      	    switch_value=key_a;
      	    delay_time = get_delay_time(switch_value);
		
		if ( 0 == switch_value)
			{ 
            output = input; /* Straight through mono */
           }
		else 
           {
            output1 = 0.6 * input;
            output2 = 0.4 * delayed_input(input, delay_time); /* Delayed version */
            output = (output1+output2) & 0xfffe; /* Straight through mono */
            
           }
	   	out[k]=output;
	   	k++;
 		k = k%Length;
 		l++;
        if(l==200)		
        {	
         l=0;
         bargraph(output);         /* Display output on bargraph */
		}
     	*py = output;			
		WRITEAD50();
		if (k == 0) 
		{
			k = 0;                /* Set Breakpoint Here */
		}		
        	
      
	}
}    
void gdram_intial(unsigned char *DPTR0)
{
 gdram_cur_x=0;
 gdram_cur_y=0;
 temp=gdram_cur_x;
  setup_expand_mode();
  for(j=0;j<32;j++)
  {
  for(i=0;i<8;i++)
  {
  R0=*DPTR0;
  DPTR0++;
  R1=*DPTR0;
  DPTR0++;
  gdram_write_word(R0,R1);
  gdram_cur_x++;
  }
   gdram_cur_x=temp;
   gdram_cur_y++;
  }
 gdram_cur_x=8;
 gdram_cur_y=0;
 temp=gdram_cur_x;
  for(j=0;j<32;j++)
  {
  for(i=0;i<8;i++)
  {
  R0=*DPTR0;
  DPTR0++;
  R1=*DPTR0;
  DPTR0++;
  gdram_write_word(R0,R1);
  gdram_cur_x++;
  }
   gdram_cur_x=temp;
   gdram_cur_y++;
  }
 *a=0x36;
 write_command();
}
//设定垂直或水平地址
void  set_gdram_addr(unsigned int addr)
{
 *a=addr|0x80;
 write_command();
}
//向液晶发送数据
void gdram_write_word(unsigned int fir_word,int unsigned sec_word)
{
 set_gdram_addr(gdram_cur_y);
 set_gdram_addr(gdram_cur_x);
 *data=fir_word;
 write_data();
 *data=sec_word;
 write_data();
}
//设定扩展模式
void setup_expand_mode(void)
{
*a=0x34;
write_command();
}
 void send_byte( unsigned char out_byte) //发送8位的控制指令
{
	unsigned char i;
	send_0();
	for(i=0;i<8;i++)
	{
		if(out_byte&0x80)
		{
			send_1();

		}
		else
		{
			send_2();
		}
		out_byte=out_byte*2;
	}
}

void write7279(unsigned int cmd,unsigned int dta)//向7279写控制指令及数据
{
	unsigned char i;
	unsigned int cmddata;
	dta=(dta&0x00ff);
	cmddata=((cmd<<8)|dta);
	send_0();
for (i=0;i<16;i++)
{
	if(cmddata&0x8000)
	{
		send_1();
	}
	else 
	{
		send_2();
	}
	cmddata=cmddata*2;
}
	send_end();
}
void long_delay(void)    //长延时
{
	unsigned char i,j;
	for (i=0;i<0xff;i++)
	{
		for(j=0;j<0xeff;j++)
		{}
	}

}
void short_delay(void)  //短延时
{
    unsigned char i,j;
	for(i=0;i<0x10;i++)
	{  for(j=0;j<0x5ff;j++)
	{}
	}
}
interrupt void key_int() //按键中断服务子程序
{   
        asm(" SSBX INTM");
        asm(" STM #0xFFFF, IFR ");
        INT3_ISR();
        key_b=*(unsigned char *)0x16;
        if(key_b==0xff)
        {
        ;
        }
        else
        {
        key_a=key_b;
        write7279(DECODE1,key_a);
        }
        asm(" STM #0x104, IMR ");
        asm(" RSBX INTM");
}
int get_delay_time(int user_switch)
{
  int return_value;

 switch(user_switch)           
  {
   case 0: return_value =  0;	  /*    0 ms delay       1 1 1 x */
           break;
   case 1: return_value =  1000;  /* 62.5 ms delay      1 1 0 x */
           break;
   case 2: return_value =  2000;  /* 125 ms delay       1 0 1 x */ 
           break;
   case 3: return_value =  4000;  /* 250 ms delay       1 0 0 x */ 
           break;
   default:
           break;
  }
  
 return(return_value); 
}

//================================================================     
short int delayed_input(short int latest_input, int delay_time)
{
 short int return_value;
 static int index = 0; /* Static to retain value between calls */
 
 return_value = *(short int *)(delay_array + 2*index); /* Take oldest sample */ 
 
 *(short int *)(delay_array + 2*index) = latest_input; /* Overwrite with latest input */
 
 if ( index < (delay_time - 1) )
   {
    index++;     /* Not at end of buffer. Point to next element */
   }
 else
   {
    index = 0;   /* Go back to beginning of buffer */
   }   

 return(return_value);
}
void bargraph(short int input)
{

 if ( -32768 == input)
  {
   input = 32767; /* Special case. There is no +32768. */
  } 
 else if ( input < 0 )
  {  
   input = -input; /* Make negative input a positive number */
  }
  
 if ( input > MAXIMUM_INPUT/2)      /* - 6 dB */
  {  
      port8001= 0x00;


  }
 else if (input > MAXIMUM_INPUT/4)  /* - 12 dB */
  {
   port8001=0x02;

  } 
 else if (input > MAXIMUM_INPUT/8)  /* - 12 dB */
  {
  port8001=0x04;

  } 
 else if( input > MAXIMUM_INPUT/16)  /* -18 dB */
  {
  port8001=0x08;

  } 
 else  if(input > MAXIMUM_INPUT/32)
  {
  port8001=0x10;

  }
 else  if(input > MAXIMUM_INPUT/64)
  {
  port8001=0x20;
  }
 else  if(input > MAXIMUM_INPUT/128)
 {
  port8001=0x40;
 }
 else  if(input > MAXIMUM_INPUT/256)
 {
  port8001=0x80;
 }
}

⌨️ 快捷键说明

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