📄 function.c
字号:
#include".\MBTD.h"
#include <intrins.h>
#include".\Init.h"
#include".\EEPROM.h"
unsigned char match_num; //save the IDD number
unsigned int program_addr; //save the program address
unsigned int adress_buf;
unsigned char dtmf_send_buf;
unsigned char dtmf_on_time;
unsigned char dtmf_off_time;
unsigned char code defualt_password[16]={0x12,0x34,0x56,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
//-------------------------------------------------------------
bit remote_rs_flg=0; //remote control run/stop flag;
bit remote_alarm_flg=0; //remote controller alarm flag;
bit remote_calling_flg=0; //the old men need call action flag
bit remote_get_flg=0; //get the remote control flag;
bit calling_run_flg=0; //waiting remote calling action
bit valid_flg; //
bit infrared_moniter_flag; //infrared flag valid
bit alarm_start;
bit remote_calling_flg_buf;
bit infrared_moniter_flag_buf;
void Send_byte(unsigned char massage)
{
SBUF=massage;
while(!TI);
TI=0;
}
void delay_5ms() // 4.961ms
{
unsigned int delay_time=185;
while(--delay_time);
}
void send_dtmf(unsigned char digit) //发送DTMF
{
unsigned char j;
clk_9200=1; //时钟信号高电平
delay_5ms();
//delay3ms();
for(j=0;j<5;j++) //待拔数字的5位编码串行输入HT9200A
{
if(digit&0x01) data_9200=1;
else data_9200=0;
clk_9200=0;
_nop_();
_nop_();
_nop_();
_nop_();
clk_9200=1;
digit=digit>>1; //串行数据右移一位
}
}
//拨号
void dial_dtmf(unsigned char tx_digit,unsigned char tx_on_time,unsigned char tx_off_time)
{
//unsigned char count;
EX0=0;
EX1=0;
delay_5ms();
ce_9200 = 0;
tx_time=tx_on_time;
if(tx_digit==0x00)
tx_digit=0x0a;
send_dtmf(tx_digit);
while(tx_time);
tx_time=tx_off_time;
send_dtmf(0xff); // stop the dtmf
while(tx_time);
ce_9200 = 1;
Send_byte(tx_digit);
EX0=1;
EX1=1;
IE0=0;
IE1=0;
}
//检查REMOTE秘密
unsigned char remote_check_password(unsigned char *input_arr,unsigned int password_add)
{
unsigned char password_buff[16];
unsigned char *arr_Point;
unsigned char i;
unsigned char read_tmp;
arr_Point=input_arr;
r_prom(password_add, &read_tmp, 1);
if(read_tmp==0xff)
{
w_prom(password_add, &defualt_password, 16);
for(i=0;i<8;i++)
{
read_tmp=defualt_password[i];
password_buff[2*i]=read_tmp>>4;
password_buff[2*i+1]=read_tmp&0x0f;
}
}
else
{
for(i=0;i<8;i++)
{
r_prom(password_add+i, &read_tmp, 1);
password_buff[2*i]=read_tmp>>4;
password_buff[2*i+1]=read_tmp&0x0f;
}
}
i=0;
while(password_buff[i]!=0x0f|input_arr[i+2]!=0x0c)
{
if(password_buff[i]!=input_arr[i+2])
return (0);
i++;
}
return (1);
}
//查MATCHING TABLE
unsigned char match_tab_check()
{
unsigned int i_num;
unsigned char i_count;
unsigned char table_buf[16];
unsigned char check_buf[16];
unsigned char wrong_flg;
for(i_num=0x400;i_num<0x480;)
{
match_num=0;
r_prom(i_num,&table_buf, 16); //read eeprom
if(table_buf[0]==0xff) //judge the table
break;
wrong_flg=0;
for(i_count=0;i_count<8;i_count++) //decore
{
check_buf[i_count*2]=table_buf[i_count]>>4;
check_buf[i_count*2+1]=table_buf[i_count]&0x0f;
}
i_count=0;
while(check_buf[i_count]!=0x0f)
{
if(check_buf[i_count]!=drop_buf[i_count])
{
wrong_flg=1;
break;
}
i_count++;
match_num++;
}
if(!wrong_flg)
return (1);
i_num+=0x10;
}
return (0);
}
//正确响应
void ack_ok(void)
{
//Sep 2, 2006
//tone_generator(0x0b,TX_ON,TX_OFF);
//tone_generator(0x0c,TX_ON,TX_OFF);
//tone_generator(0x0b,TX_ON,TX_OFF);
line_hook=0;
split=0;
dial=1;
dial_dtmf(0x0d,TX_ON,TX_OFF);
dial_dtmf(0x0e,TX_ON,TX_OFF);
dial_dtmf(0x0d,TX_ON,TX_OFF);
line_hook=1;
split=0;
}
//错误响应
void ack_err(void)
{
line_hook=0;
split=0;
dial=1;
dial_dtmf(0X14,200,TX_OFF);
line_hook=1;
split=0;
}
unsigned char program_dialer(void) //握手信号
{
if(drop_count==6) //有6个音频按键信息
{
if(drop_buf[0]==0x0c && drop_buf[1]==0x0c //DTMF 握手
&& drop_buf[2]==0 && drop_buf[3]==0
&& drop_buf[4]==0x0b && drop_buf[5]==0x0b)
return(1);
}
return(0);
}
//手动编程
void dialer_program()
{
unsigned char i;
unsigned char r_tmp;
program_flg=0;
if(drop_buf[0]==0x0b)
{
program_addr=drop_buf[1]*0x100+drop_buf[2]*0x10+drop_buf[3];
drop_buf[0]=0xff;
drop_count=0;
ack_ok();
}
else
{
drop_buf[drop_count-1]=0xff;
for(i=0;i<drop_count;i++)
{
if((i%2)==0) //将数据转换为BIN格式
{
r_tmp=(drop_buf[i]&0x0f)<<4; //HI
r_tmp|=0x0f;
}
else
{
r_tmp&=(drop_buf[i]&0x0f)|0xf0; //LOW
drop_buf[i/2]=r_tmp;
}
}
for(i=(drop_count/2);i<16;i++) //无用数据用FF填充
drop_buf[i]=0xff;
//------------------------------------------------------------------
//------------------------------------------------------------------
if(program_addr<0x100)
program_addr=0x0A00+program_addr;
// else if(program_addr>=0x100&&program_addr<0x800)
// program_addr=0x0c00;
else if(program_addr==0x666)
{
program_addr=R_PASSWORD;
}
else if(program_addr==0x100)
{
program_addr=DTMF_TIME_ON;
}
else if(program_addr==0x110||program_addr==0x284)
{
program_addr=DTMF_INTER_DIGIT;
}
w_prom(program_addr,& drop_buf,16); //写入EEPROM
drop_count=0;
program_addr+=0x10;
ack_ok();
}
}
//遥控
void remote_control()
{
switch(remote_key)
{
case KEY_A:
remote_rs_flg=1;
calling_run_flg=1;
// valid_flg=1;
break;
case KEY_B:
remote_calling_flg=1;
adress_buf=0;
sys_20sec_js=0;
sys_20second_flg=1;
break;
case KEY_C:
remote_rs_flg=0;
calling_run_flg=0;
alarm_start=0;
adress_buf=0;
remote_alarm_flg=0;
infrared_moniter_flag=0;
remote_calling_flg=0;
line_hook=1;
split=1;
alarm_enable=0; //alrm flg
alarm_first=0;
alarm_js=0;
// infrared_moniter_flag=0;
break;
case KEY_D:
remote_alarm_flg=1;
// rest_flg=1;
break;
default:
break;
}
}
void dial_num(unsigned int tele_add)
{
unsigned int remote_add;
remote_add=tele_add;
r_prom(DTMF_TIME_ON,&dtmf_on_time,1); //高低分开发送ASCII码
r_prom(DTMF_INTER_DIGIT,&dtmf_off_time,1);
if(dtmf_on_time==0xff)
dtmf_on_time=0x16;
if(dtmf_off_time==0xff)
dtmf_off_time=0x14;
dtmf_send_buf=0;
while(dtmf_send_buf!=0xf)
{
r_prom(remote_add,&dtmf_send_buf,1);
if((dtmf_send_buf>>4)!=0xf)
{
dial_dtmf((dtmf_send_buf>>4),dtmf_on_time,dtmf_off_time);
//-----------------debug
//tx_time=2;
//SBUF=(send_dtmf>>4);
//while(tx_time);
tx_time=4;
while(tx_time);
if((dtmf_send_buf&0xf)!=0xf)
{
dial_dtmf((dtmf_send_buf&0xf),dtmf_on_time,dtmf_off_time);
tx_time=4;
while(tx_time);
++remote_add;
}
else
dtmf_send_buf=0xf;
}
else
dtmf_send_buf=0xf;
}
// dtmf_send_buf=0;
}
void Eme_Alarm_action(unsigned int tele_list)
{
line_hook=1;
split=1;
tx_time=200;
while(tx_time);
r_prom(tele_list+0x10*adress_buf,&dtmf_send_buf,1);
if(dtmf_send_buf==0xff)
{
sys_20second_flg=1;
adress_buf++;
if(adress_buf>=8)
{
infrared_moniter_flag=0;
remote_calling_flg=0;
split=1;
line_hook=1;
dial=1;
}
return;
}
sys_20second_flg=0;
sys_20sec_js=0;
split=0;
// split=1;
line_hook=0;
dial=1;
tx_time=100;
while(tx_time);
dial_num(tele_list+0x10*adress_buf);
adress_buf++;
if(adress_buf>=8)
{
infrared_moniter_flag=0;
remote_calling_flg=0;
split=1;
line_hook=1;
dial=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -