⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是本人自己编写的关于跳码芯片hcs301的烧写程序
💻 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 + -