📄 dtmf.c
字号:
/*DTMF.c */
/*;the HPI space in our system
;0x8008 HPIC0 bit 7 6 5 4 3 2 1 0
;0X8009 HPIC1 TL1 TL0 BIL
;0X800a HPID0(AUTO) 1 00 HPIC
;0X800b HPID1(AUTO) 1 01 HPID (ATO)
;0X800c HPIA0 1 10 HPIA
;0X800d HPIA1 1 11 HPID (NO ATO)
;0X800e HPID0(NO AUTO)
;0X800f HPID1(NO AUTO)
;result is 0x1002=AA 0x1003=DD
;A0-->HBIL HBIL
;A1-->HCNTL0 HCNTL0
;A2-->HCNTL1 HCNTL1
;A15-->HCS }C_HCS
;A3-->
;other pins connection
;HAS-->1
;HDS1-->IOSTRB IOSTRB
;HDS2-->1
;HINT-->INT0 INT0
;HREADY-->BREADY BREADY
;HR/W-->R/W R/W
;###########################################################*/
#include "math.h"
#include "stdio.h"
//IO定义
ioport unsigned int port8000;
ioport unsigned int port8001;
ioport unsigned int port8008;
ioport unsigned int port8009;
ioport unsigned int port800a;
ioport unsigned int port800b;
ioport unsigned int port800c;
ioport unsigned int port800d;
ioport unsigned int port800e;
ioport unsigned int port800f;
//函数定义
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 InitC5402(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 WRITEAD50(void);
extern void Int(void);
extern void init_lcm(void);
extern void ddram_clear(void);
interrupt void key_int();
void gdram_clear(void);
void send_byte( unsigned char out_byte);
void write7279(unsigned int cmd,unsigned int dta);
void long_delay(void);
void short_delay(void);
void SetDAdress(unsigned int Daddr);
void SetDCdata(unsigned int Ddata0,unsigned int Ddata1);
void send_voice(void);
void TranDaToHPI(int *DPOINTER1);
void SenToLcd(unsigned int SData0,unsigned int SData1);
//***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
#define pi 3.1415927
#define Length 102
#define Len 8
//变量定义
double x[Length],xc[Length],xr[Length];
double vk[Len][Length],vs1[Len],vs2[Len],v[3],s[Len],z[Len];
double vkn[Len][Length];
double fr0,fr1,fr2,fr3,fc0,fc1,fc2,fc3,fs,fr,fc;
double m1,m0,max1,max2;
int i,j,kong;
int *out = (int*)0x110;
unsigned int byteout;
unsigned int *a=(unsigned int *)0x0015;
unsigned char *data=(unsigned char *)0x121;
unsigned int temp;
unsigned int R0,R1,R2,R3;
unsigned char *DPTR;
int *DPOINTER;
int sedata[102];
unsigned char key_a=0x22,key_b=0x22;
int inkey=0x22;
unsigned int k=0,l=0,m=0,n=0;
unsigned char clear[64][16];
char high = 0,low = 0;
//主函数
void main(void)
{
fs = 8000;
fr0 = 697.0; fc0 = 1209.0;
fr1 = 770.0; fc1 = 1336.0;
fr2 = 852.0; fc2 = 1477.0;
fr3 = 941.0; fc3 = 1633.0;
s[0] = fr0/fs; s[4] = fc0/fs;
s[1] = fr1/fs; s[5] = fc1/fs;
s[2] = fr2/fs; s[6] = fc2/fs;
s[3] = fr3/fs; s[7] = fc3/fs;
for(i=0;i<64;i++)
{
for(j=0;j<16;j++)
{
clear[i][j]=0x0;
}
}
InitC5402(); /* initialize C5402 DSP */
OpenMcBSP();
Int();
*a=0x08;
write_command();
//Clear Ddram
*a=0x01;
write_command();
//Turn on Display
*a=0x0c;
write_command();
SetDAdress(AC0);
*data=0xbc;
write_data();
*data=0xfc;
write_data();
*data=0xd6;
write_data();
*data=0xb5;
write_data();
*data=0xcf;
write_data();
*data=0xd4;
write_data();
*data=0xca;
write_data();
*data=0xbe;
write_data();
*data=0xa3;
write_data();
*data=0xba;
write_data();
SetDAdress(AC1);
//init_lcm();
//ddram_clear();
while (1)
{
switch(key_a) //键值转换
{
case 0 : inkey=13;
break;
case 1 : inkey=12;
break;
case 2 : inkey=11;
break;
case 3 : inkey=10;
break;
case 4 : inkey=15;
break;
case 5 : inkey=9;
break;
case 6 : inkey=6;
break;
case 7 : inkey=3;
break;
case 8 : inkey=0;
break;
case 9 : inkey=8;
break;
case 10: inkey=5;
break;
case 11: inkey=2;
break;
case 12: inkey=14;
break;
case 13: inkey=7;
break;
case 14: inkey=4;
break;
case 15: inkey=1;
break;
}
switch(inkey)
{
case 0 : fr=fr3; fc=fc1;
SenToLcd(0xa3,0xb0);
send_voice();
break;
case 1 : fr=fr0; fc=fc0;
SenToLcd(0xa3,0xb1);
send_voice();
break;
case 2 : fr=fr0; fc=fc1;
SenToLcd(0xa3,0xb2);
send_voice();
break;
case 3 : fr=fr0; fc=fc2;
SenToLcd(0xa3,0xb3);
send_voice();
break;
case 4 : fr=fr1; fc=fc0;
SenToLcd(0xa3,0xb4);
send_voice();
break;
case 5 : fr=fr1; fc=fc1;
SenToLcd(0xa3,0xb5);
send_voice();
break;
case 6 : fr=fr1; fc=fc2;
SenToLcd(0xa3,0xb6);
send_voice();
break;
case 7 : fr=fr2; fc=fc0;
SenToLcd(0xa3,0xb7);
send_voice();
break;
case 8 : fr=fr2; fc=fc1;
SenToLcd(0xa3,0xb8);
send_voice();
break;
case 9 : fr=fr2; fc=fc2;
SenToLcd(0xa3,0xb9);
send_voice();
break;
case 10: fr=fr0; fc=fc3;
SenToLcd(0xa3,0xc1);
send_voice();
break;
case 11: fr=fr1; fc=fc3;
SenToLcd(0xa3,0xc2);
send_voice();
break;
case 12: fr=fr2; fc=fc3;
SenToLcd(0xa3,0xc3);
send_voice();
break;
case 13: fr=fr3; fc=fc3;
SenToLcd(0xa3,0xc4);
send_voice();
break;
case 14: fr=fr3; fc=fc0;
SenToLcd(0xa3,0xaa);
send_voice();
break;
case 15: fr=fr3; fc=fc2;
SenToLcd(0xa3,0xa3);
send_voice();
break;
}
}
}
void TranDaToHPI(int *DPOINTER1)
{
//SET HPIC
port8008=0x10;
port8009=0x10;
port800c=0x00;
port800d=0x00;
port8008=0x00;
port8009=0x00;
//SET ADDRESS
port800c=0x0f;
port800d=0xff;
kong=port800a;
kong=port800b;
//SEND DATA
for(i=0;i<102;i++)
{
low = (char)(*DPOINTER1)&0xff;
high = (char)(*DPOINTER1>>8)&0xff;
port800a = high;
port800b = low;
// port800a=*DPOINTER1/256;
// port800b=*DPOINTER1;
DPOINTER1++;
}
}
void send_voice(void)
{
for (i=0; i<Length; i++)
{
xr[i] = sin(2*pi*fr*i/fs);
xc[i] = sin(2*pi*fc*i/fs);
x[i] = 1*(1.0*xc[i]+1.0*xr[i]);
}
for (j=0; j<32; j++)
{
for (i=0; i<Length; i++)
{
*out = (int)(x[i]*16300.0);
WRITEAD50(); /* Tone output*/
}
}
for(i=0;i<102;i++)
{
sedata[i]=(int)(16300.0*x[i]);
}
DPOINTER=&sedata[0];
TranDaToHPI(DPOINTER);
key_a=0x22;
inkey=0x22;
}
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++)
{}
}
}
void SenToLcd(unsigned int SData0,unsigned int SData1)
{
init_lcm();
*data=SData0;
write_data();
*data=SData1;
write_data();
}
void SetDAdress(unsigned int Daddr)
{
*a=Daddr;
write_command();
}
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");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -