📄 tone.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 + -