📄 phone.c
字号:
//Copyright(C), 2007-2007, Whcsdc Tech. Co., Ltd.
//File name:fydefine.h
//Author:"杨军"
//Version:"2007版"
//Date: "2007年8月1日"
//Description:"定义了整个程序"
#include "fymain.h"
//"重量"
UBDWORD gu_Val1,gu_Val2;//"全局变量
//"DTMF发送"
sbit DATA = P2^4;
sbit CLK = P2^3;
sbit DTMF_CS = P2^5;
//"DTMF接收"
sbit DTMF_CHK = P3^5;
sbit OE = P3^3;
//"响铃"
sbit RING = P2^6;
sbit CP = P3^4;
//"是否在线(忙音)"
sbit DX_CHK = P2^7;
//"摘挂机"
sbit SW = P3^7;
//"无线接收信号"
sbit VI = P3^2;
//"CPU控制"
sbit CPU_PASS = P3^6;
sbit BEEP = P0^4;
uchar idata Check0 ;
uchar idata Counter0 ;
uchar idata Check1 ;
uchar idata Counter1 ;
uchar idata Counter3 ;
//uchar data wireless _at_ 0x14 ;
uchar data wireless;
//"bit"
uchar volatile bdata flag = 0;
sbit WIRELESS_FG = flag^0;
uchar code Table_DTMF[] =
{0x0a,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0d,0x0e,0x0f,0x00,0x0b,0x0c,0x1f};
// 0 1 2 3 4 5 6 7 8 9 A B C D * #
uchar code dial[] = "13720357726@";
uchar code Table_Key[] = {Key1,Key2,Key3,KeyF0,Key4,Key5,Key6,KeyF1,Key7,Key8,Key9,KeyF2,\
Key10,Key0,Key11,KeyF3};
void SysInit(void);
void SoftInit(void);
void delay(uint iCnt);
uchar check_DXC(void);
uchar check_RING(void);
uchar check_DV(void);
void checkRING_Init();
void checkDV_Init();
void checkDXC_Init();
void senddata_ht9200(uchar in);
void send_ht9200(uchar in);
uchar DTMF_read(void);
void dial_up(uchar *dial);
//"按键函数"
uchar Read_KeyBoard(void);
bit KeyBoard_If_Hit(void);
void Beep(void);
Main()
{
SysInit();
SoftInit();
// dial_up(dial);
while (1)
{
}
}
void SysInit(void)
{
}
void Beep(void)
{
uchar i;
BEEP = 1;
for (i = 0; i < 254; i++);
BEEP = 0;
}
void SoftInit(void)
{
down();
//"开中断"
IE = 0;
IT0 = 1;
ET0 = 1;
EA = 1;
Beep();
CPU_PASS = 0;
// P0= 0;
}
void dial_up(uchar *dial)
{
uchar len,i;
len = strlen(dial);
plunk();
for (i=0; i<len; i++)
{
send_ht9200((dial[i]-48));
}
}
void delay(uint iCnt)
{
while(iCnt--);
}
void senddata_ht9200(uchar in)
{
uchar i;
for (i=0;i<5;i++)
{
if (((in>>i)&0x01) == 1)
{
DATA = 1;
}
else
{
DATA = 0;
}
CLK = 0;
CLK = 1;
}
}
/******************************************
发送子程序
in 为要发送的数 0-15
******************************************/
void send_ht9200(uchar in)
{
uchar i;
DTMF_CS = 0;
CLK = 1;
delay(6000); //delay about 6 ms
EA = 0;
senddata_ht9200(Table_DTMF[in]) ;
EA = 1 ;
for (i=0 ;i< 15;i++)
delay(6000); //delay about 100 ms
DTMF_CS = 1 ;
}
/*****************************************
DTMF 读程序
返回 DTMF值
*****************************************/
uchar DTMF_read(void)
{
uchar temp ;
uchar i ;
EA = 0 ;
P0 = 0xff ;
OE = 1 ;
ACC = ACC ;
temp = P0&0x0f ;
OE = 0 ;
EA = 1 ;
for (i=0;i<16;i++)
{
if (temp == Table_DTMF[i])
return i ;
}
return(0xff) ;
}
/******************************************
初始化检测程序
******************************************/
void checkRING_Init()
{
Check0 = 2 ;
Counter0 = 20 ;
}
void checkDV_Init()
{
Check1 = 2;
Counter1 = 20;
}
void checkDXC_Init()
{
/* Check3 = 2 ;*/
Counter3 = 20 ;
}
/***************************************
检测有无振铃RING 程序
返回 TRUE :有
FALSE:无
***************************************/
uchar check_RING(void) //
{
uchar flag ;
flag = RING ; //check RING
if ((flag == 0)&&(Counter0 < 30))
Counter0 ++ ;
if ((flag == 1)&&(Counter0 > 0))
Counter0 -- ;
if (Counter0 == 30)
{
Counter0 = 20 ;
if (flag != Check0)
{
Check0 = flag ;
return TRUE ;
}
else return FALSE;
}
else if (Counter0 == 0)
{
Counter0 = 20 ;
Check0 = 1;
return FALSE;
}
else
return FALSE ;
}
/***************************************
检测有无DTMF信号 DV 程序
返回 TRUE :有
FALSE:无
信号先低后高
***************************************/
uchar check_DV(void) //
{
uchar flag ;
flag = DTMF_CHK; //check DV
if ((flag == 1)&&(Counter1<30))
Counter1 ++ ;
if ((flag == 0)&&(Counter1 >0))
Counter1 -- ;
if (Counter1 == 30)
{
Counter1 = 20 ;
if (flag != Check1)
{
Check1 = flag ;
return TRUE ;
}
else return FALSE ;
}else if (Counter1 == 0)
{
Counter1 = 20 ;
Check1 = 0 ;
return FALSE ;
}
else return FALSE ;
}
/***************************************
检测有无掉线信号 DXC 程序
返回 TRUE :有
FALSE:无
***************************************/
uchar check_DXC(void) //
{
uchar flag ;
flag = DX_CHK ; //check DXC
if ((flag == 1)&&(Counter3<30))
Counter3 ++ ;
if ((flag == 0)&&(Counter3 >0))
Counter3 -- ;
if (Counter3 == 30)
{
Counter3 = 20 ;
if (flag)
{
return FALSE ;
}
}
else if (Counter3 == 0)
{
Counter3 = 20 ;
if (!flag)
{
return TRUE;
}
}
else
return FALSE ;
/*
if (Counter3 == 30)
{
Counter3 = 20 ;
if(flag != Check3)
{
Check3 = flag ;
return TRUE ;//
}
else return FALSE ;
}
else if(Counter3 == 0)
{
Counter3 = 20 ;
Check3 = 0 ;
return FALSE ;
}
else return FALSE ;
*/
}
/***************************************
函数名:Read_KeyBoard
功能:返回按键值
参数:无
返回值:键值
备注:无键按下返回0Xff,有键时按下键从左至右,由上至下返回0,1,2.....15
***************************************/
uchar Read_KeyBoard(void)
{
uchar row,col,mask;
uchar key_value;
row = 0;
col = 0;
mask = 0x0e;
if (!KeyBoard_If_Hit())
{
return(NoneKey);
}
/* get row */
delay(1250); //"delay 10ms,去抖"
KEYWRITE(mask);
while(((KEYIO&KEYROWMASK)==KEYROWMASK)&&(row<4))
{
++row;
mask <<= 1;
mask |= 1;
KEYWRITE(mask);
}
/* get col */
KEYREAD(key_value);
mask=0x08;
while(((key_value|mask)!=0x0f)&&(col<4))
{
++col;
mask>>=1;
}
key_value = 0;
KEYWRITE(key_value);
while(1)
{
if((KEYIO&KEYROWMASK)!=KEYROWMASK)//"有按键"
continue;
delay(1250);//8
if((KEYIO&KEYROWMASK)!=KEYROWMASK)//"有按键"
continue;
break;
}
key_value=row*4+col;
return(key_value);
}
/***************************************
函数名:KeyBoard_If_Hit
功能:检测是否有按键
参数:无
返回值:是否有按键
备注:判断是否有键按下,有时返回1,无时返回0
*****************************************/
bit KeyBoard_If_Hit(void)
{
uchar a = 0;
KEYWRITE(a);
delay(1);
KEYREAD(a);
if (a == 0x0f)
{
return(0);
}
delay(625); /* delay 10ms */ //20
if (a == 0x0f)
{
return(0);
}
return(1);
}
void rev_wireless(void) interrupt 0 using 1
{
if (!WIRELESS_FG)
{
WIRELESS_FG = 1;
wireless = P0 & 0X0F;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -