📄 main.c
字号:
#include <hcs301.h>
/**********************************************************/
void serial() interrupt 4 using 1
{
unsigned char i_temp;
if(RI)
{
RI=0;
i_temp=SBUF;
if(i_temp==0x0d)
{
rxbuf[rp]=0x0d;
rp++;
rx_finish=1;
}
else if(i_temp==0x08)
{//backspace
if(rp!=0)
{
SBUF=0x08;
sendp=&backspace[1];
sdstart=1;
rp--;
}
}
else if(rp<rxlength)
{
rxbuf[rp]=i_temp;
rp++;
SBUF=i_temp;
}
}
else//发送中断
{
TI=0;
if(sdstart)
{
i_temp=*sendp;
if(i_temp!=0)
{
SBUF=i_temp;
sendp++;
//sendgsm=1;
}
else//发送完成
{
sdstart=0;
}
}
}
}
/***************************************
//拷贝字符串p1到p2,注意:必须要结束符
void copy_char(unsigned char *p1,unsigned char *p2)
{
while (*p1!=0)
{
*p2=*p1;
p2++;
p1++;
}
*p2=0;
}
*/
bit compare_key(unsigned char n,unsigned char *p1,unsigned char *p2)//
{
unsigned char i;
for (i=0;i<n;i++)
{
if (*p1!=*p2)
{return(False);}
p1++;
p2++;
}
return(True);
}
bit send_data(unsigned char *p)
{
if(!sdstart)
{
sdstart=1;
SBUF=*p++;
sendp=p;
return(1);
}
return(0);
}
unsigned char get_command(void)
{
unsigned char counter,num,i;
unsigned char code *cp;
counter=0;
loop1:
switch(counter)
{
case 0:
cp=huiche;
num=1;
break;
case 1:
cp=code1;
num=6;
break;
case 2:
cp=code2;
num=5;
break;
case 3:
cp=code3;
num=7;
break;
case 4:
cp=code4;
num=14;
break;
case 5:
cp=code5;
num=4;
break;
case 6:
cp=code6;
num=9;
break;
case 7:
cp=code7;
num=14;
break;
case 8:
cp=code8;
num=13;
break;
case 9:
cp=code9;
num=18;
break;
case 10:
cp=code10;
num=5;
break;
default:
return 0xff;
break;
}
for(i=0;i<num;i++)
{
if(rxbuf[i]!=*cp)
{
counter++;
goto loop1;
}
cp++;
}
return counter;
}
void InitBaud(void)
{
IE=0;//"关中断
TMOD=0x21;//"T0为16位定时器,T1位自装载8位
/*
T2CON=0;//"t2作为定时器用
RCAP2H=(65536-46080)/256;//12/11059200*46080=50ms
RCAP2L=(65536-46080)%256;
TH2=(65536-46080)/256;
TL2=(65536-46080)%256;
ET2=1;//"t2开中断
TR2=1;
*/
SCON=0x50;//"方式1,允许串口接收
PCON|=0x80;//smod=1;
TH1=0XFA;//"缺省9.6k*
TL1=0XFA;
TR1=1;
EA=1;//"开中断*
ES=1;
}
void pop_cs2(void)
{
select_cs2;
LCD_DAT=cs2_data;
select_ram;
}
void pop_cs4(void)
{
select_cs4;
LCD_DAT=cs4_data;
select_ram;
}
void pop_cs5(void)
{
select_cs5;
LCD_DAT=cs5_data;
select_ram;
}
void ini_xport(void)
{
cs2_data=0xff;
cs4_data=0xd3;//1101,0011串口为gsm,gsm电源关闭
cs5_data=0x7f;//
pop_cs2();
pop_cs4();
pop_cs5();
}
/**********************************************/
void ini_system(void)
{
ini_xport();
rsc0=1;
s3=0;
pwm=0;
eepower=1;
pop_cs4();//选通rs232
InitBaud();
}
/************WRITE EEPROM********************************/
void dy25us(void)
{
unsigned char j;
j=0;
while(j!=13)
{j++;}
_nop_();
}
dy100us(unsigned char n)
{
unsigned char i,j;
for(i=0;i<n;i++)
{
j=0;
while(j!=28)
{j++;}
}
}
dy1ms(unsigned char n)
{
unsigned char i,j;
for(i=0;i<n;i++)
{
j=0;
do
{j++;}
while(j<152);
}
}
void write_one_byte(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
pwm=d0;
s3=1;
dy25us();
s3=0;
dy25us();
d_=d_>>1;
}
}
void read_one_byte(void)
{
unsigned char i;
for(i=0;i<7;i++)
{
d7=pwm;
d_=d_>>1;
s3=1;
dy25us();
s3=0;
dy25us();
}
d7=pwm;
s3=1;
dy25us();
s3=0;
dy25us();
}
bit write_eeprom(void)
{
unsigned char i;
//enter program mode
s3=0;
pwm=0;
dy1ms(1);
eepower=0;
keeloq();
cd.kc.config=0;
cd.kc.en_key=0;
cd.kc.seed1=0;
cd.kc.seed0=0;
cd.kc.reserved=0;
cd.kc.sync=0;
//serils limited
cd.buf[8]&=0x0f;
//auto shut off
if(autooff_en)
{
cd.buf[8]|=0x80;
}
else
{
cd.buf[8]&=0x7f;
}
add_discrimination();
//baud rate and low bit
d_=cd.buf[0];
d6=baud1;
d5=baud0;
d4=lowbit_en;
d3=1;//ovr1
d2=1;//ovr0
s3=1;
dy100us(50);
pwm=1;
dy100us(40);
pwm=0;
dy100us(1);
s3=0;
//TPBW
dy100us(40);
//programming
i=12;
while(i!=0)
{
i--;
d_=cd.buf[2*i+1];
write_one_byte();
d_=cd.buf[2*i];
write_one_byte();
pwm=0;
dy1ms(50);
}
//dy1ms(47);
//pwm=1;//verify
i=24;
while(i!=0)
{
i--;
d_=0;
read_one_byte();
if(d_!=cd.buf[i])
{
s3=0;pwm=0;
return False;
}
}
eepower=1;
pwm=0;
return True;
}
bit get_code(unsigned char n,unsigned char m,unsigned char idata *dp)
{
unsigned char i,j;
unsigned char idata *p;
p=&rxbuf[n];
for(i=0;i<m;i++)
{
for(j=0;j<4;j++)
{
if(*p>0x2f&&*p<0x3a)
{
*p-=0x30;
}
else if(*p>0x40&&*p<0x47)
{
*p-=0x37;
}
else
{return False;}
p++;
}
if(*p!=',')
{
i++;
if(i==m)
{break;}
return False;
}
p++;
}
p=&rxbuf[n];
for(i=0;i<m;i++)
{
j=*p<<4;
p++;
*dp++=j|*p;
p++;
j=*p<<4;
p++;
*dp++=j|*p;
p+=2;
}
return True;
}
void add_discrimination(void)
{
cd.buf[1]=cd.buf[11];
cd.buf[0]&=0xfc;
cd.buf[0]=cd.buf[0] | (cd.buf[10]&0x03);
}
/*********************************************/
void main(void)
{
ini_system();
send_data(version);
while(!send_data(limited_ver));
while(1)
{
if(rx_finish)
{
REN=0;
while(!send_data(huiche));
if(cmc!=0)
{
if(compare_key(5,&rxbuf[0],code10))
{cmd=10;}
else
{
cmd=cmc+10;
}
}
else
{cmd=get_command();}
if(cmd!=0xff)
{
switch(cmd)
{
case 0://回车
if(pragrambit)
{
if(write_eeprom())
{//成功
while(!send_data(sucessful_c));
if(inc_en)
{cd.kc.serials++;}
}
else
{
while(!send_data(failed_c));
}
display_serials();
}
else
{while(!send_data(please));}
break;
case 1://INPUT
cmc=1;
send11:
while(!send_data(the_mcode));
//The Manufacturer's Code:
break;
case 2://INFO
display_info();
break;
case 3://serial:0000,1000
if(rp!=17)
{
send_length();
}
else if(!get_code(7,2,&cd.buf[8]))
{
send_format();
}
else
{
while(!send_data(ok_c));
}
display_serials();
break;
case 4://select hcs301
goto ok_here;
case 5://ver
while(!send_data(version));
while(!send_data(limited_ver));
break;
case 6://auto inc
inc_en=1;
goto ok_here;
case 7://stop auto inc
inc_en=0;
goto ok_here;
case 8://auto shutoff
autooff_en=1;
goto ok_here;
case 9://stop auto shutoff
autooff_en=0;
ok_here:
while(!send_data(ok_c));
break;
case 10://exit
pragrambit=0;
cmc=0;
while(!send_data(ok_c));
break;
case 11://2000,2000,2000,2000
if(rp!=20)
{
send_length();
goto send11;
}
else if(!get_code(0,4,mf_code))
{
send_format();
goto send11;
}
else
{
cmc=2;
send12:
while(!send_data(the_serial));
}
break;
case 12://0000,1000
if(rp!=10)
{
send_length();
goto send12;
}
else if(!get_code(0,2,&cd.buf[8]))
{
send_format();
goto send12;
}
else
{
cmc=3;
send13:
while(!send_data(the_baud));
while(!send_data(bauds));
}
break;
case 13://baud rate
if(rp!=2)
{
send_length();
goto send13;
}
else if(rxbuf[1]!=0x0d)
{
send_format();
goto send13;
}
else if(rxbuf[0]=='4')
{
baud0=0;
baud1=0;
goto next14;
}
else if(rxbuf[0]=='2')
{
baud0=1;
baud1=0;
goto next14;
}
else if(rxbuf[0]=='1')
{
baud0=1;
baud1=1;
next14:
cmc=4;
send14:
while(!send_data(low_power));
while(!send_data(select_lp));
}
else
{
send_format();
goto send13;
}
break;
case 14://low power bit
if(rp!=2)
{
send_length();
goto send14;
}
else if(rxbuf[1]!=0x0d)
{
send_format();
goto send14;
}
else if(rxbuf[0]=='1')
{
lowbit_en=1;
goto next15;
}
else if(rxbuf[0]=='2')
{
lowbit_en=0;
next15:
cmc=5;
send15:
while(!send_data(select_as));
while(!send_data(select_lp));
}
else
{
send_format();
goto send14;
}
break;
case 15://Auto Shutdown
if(rp!=2)
{
send_length();
goto send15;
}
else if(rxbuf[1]!=0x0d)
{
send_format();
goto send15;
}
else if(rxbuf[0]=='1')
{
autooff_en=1;
goto next16;
}
else if(rxbuf[0]=='0')
{
autooff_en=0;
next16:
cmc=0;
pragrambit=1;
while(!send_data(prepare_c));
}
else
{
send_format();
goto send15;
}
break;
default:
while(!send_data(error_c));
break;
}
}
else//发送error
{
while(!send_data(error_c));
}
rp=0;
REN=1;
rx_finish=0;
}
}
}
void send_format(void)
{
while(!send_data(format_err));
}
void send_length(void)
{
while(!send_data(length_err));
}
void get_asc(unsigned char n,unsigned char idata *p1,unsigned char idata *p2)
{
unsigned char i,j;
for(i=0;i<n;i++)
{
j=(*p1>>4)+0x30;
if(j>0x39)
{j=j+7;}
*p2++=j;
j=(*p1&0x0f)+0x30;
if(j>0x39)
{j=j+7;}
*p2++=j;
p1++;
if((i%2)!=0)
{*p2++=',';}
}
*p2++=0x0a;
*p2=0;
p2-=2;
*p2=0x0d;
}
void display_serials(void)
{
unsigned char buf[12];
while(!send_data(the_s));
//serils limited
cd.buf[8]&=0x0f;
get_asc(4,&cd.kc.serials,buf);
while(!send_data(buf));
}
void display_info(void)
{
unsigned char buf[22];
//code
while(!send_data(the_mcode));
get_asc(8,&mf_code[0],buf);
while(!send_data(buf));
//serials
while(!send_data(the_s));
//serils limited
cd.buf[8]&=0x0f;
get_asc(4,&cd.kc.serials,buf);
while(!send_data(buf));
//baud
while(!send_data(the_baud));
if((baud0==0)&&(baud1==0))
{
while(!send_data("400us\15\12"));
}
else if((baud0==1)&&(baud1==0))
{
while(!send_data("200us\15\12"));
}
else
{
while(!send_data("100us\15\12"));
}
//low power bit
while(!send_data(low_power));
if(lowbit_en)
{
while(!send_data(enabled));
}
else
{
while(!send_data(disabled));
}
//auto shut down
while(!send_data(select_as));
if(autooff_en)
{
while(!send_data(enabled));
}
else
{
while(!send_data(disabled));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -