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

📄 htd30v02.c

📁 利用单片机实现的USB1.1通信。通过液晶屏的显示驱动代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	fm_send(0xa0);
	fm_send(step*(read_len/256));
//	fm_send((step==0)?40:0);
    fm_send(0);
	_nop_();
	_nop_();
	_nop_();
    _nop_();
//	for(i=((step==0)?40:0);i<read_len;i++)	//如果当前读取的数据是24C64的前2048字节,要把密码区隐藏(内容是随机的)
    for(i=0;i<read_len;i++)
		{
		fm_start();
		fm_send(0xa1);
		DBUF[i]=fm_take();
		}
	fm_stop();
	}

//write fm_ram,按照load_add指向的缓冲位置的数据作为数据源,由SECTOR确定的扇区地址映射的FM地址写入write_len长度的数据
//void	fm_write_dbuf(uchar *load_add,uint write_len,uchar sector)
//	{
//	fm_start();
//	fm_send(0xa0);
//	fm_send((sector-36)*2);
//	fm_send(0);
//	while(write_len--)
//		{
//		fm_send(*load_add++);
//		}
//	fm_stop();
//	}
//write fm_ram
void	fm_write_long(uchar *load_add,uint write_len)
	{
	fm_start();
	fm_send(0xa0);
	fm_send(add_start.add_byte[0]);
	fm_send(add_start.add_byte[1]);
	while(write_len--)
		{
		fm_send(*load_add++);
		}
	fm_stop();
	}
//write fm_ram
void	fm_write(uchar *load_add,uchar write_len)
	{
	fm_start();
	fm_send(0xa0);
	fm_send(add_start.add_byte[0]);
	fm_send(add_start.add_byte[1]);
	while(write_len--)
		{
		fm_send(*load_add++);
		}
	fm_stop();
	}
void	fm_write_fill(uchar write_len,uchar write_contain)
	{
	fm_start();
	fm_send(0xa0);
	fm_send(add_start.add_byte[0]);
	fm_send(add_start.add_byte[1]);
	while(write_len--)
		{
		fm_send(write_contain);
		}
	fm_stop();
	}

void time_start(void)
	{
	FM3164_SDA=1;
	_nop_();
	_nop_();
	_nop_();
	FM3164_SCL=1;
	_nop_();
	_nop_();
	_nop_();
	FM3164_SDA=0;
	_nop_();
	_nop_();
	_nop_();
	FM3164_SCL=0;
	}

void time_stop(void)
	{
	FM3164_SDA=0;
	_nop_();
	_nop_();
	_nop_();
	FM3164_SCL=1;
	_nop_();
	_nop_();
	_nop_();
	FM3164_SDA=1;
	_nop_();
	_nop_();
	_nop_();
	FM3164_SCL=0;
	_nop_();
	_nop_();
	_nop_();
	FM3164_SDA=0;
	}
//void	ack_same(void)
//	{
// 	FM3164_SCL=1;
//	_nop_();
//	_nop_();
//	_nop_();
// 	FM3164_SCL=0;
// 	}
void time_send(uchar eedata)
	{
	uchar	i;
	i=8;
    	while(i--)
	    	{
	    	FM3164_SCL=0;
		_nop_();
		_nop_();
		_nop_();
	    	if(eedata&0x80)
	    		FM3164_SDA=1;
	    	else
	    		FM3164_SDA=0;
	    	FM3164_SCL=1;
	    	eedata<<=1;
	    	}
	FM3164_SCL=0;
	}
uchar time_take(void)
	{
	uchar	i=8;
	uchar	worth=0;
	FM3164_SDA=1;
	_nop_();
	_nop_();
	_nop_();
	while(i--)
	    	{
	    	FM3164_SCL=0;
		_nop_();
		_nop_();
		_nop_();
	    	FM3164_SCL=1;
		_nop_();
		_nop_();
		_nop_();
	    	worth<<=1;
	    	if(FM3164_SDA)
			worth++;
	    	}
	FM3164_SCL=0;
	_nop_();
	_nop_();
	_nop_();
	return(worth);
	}

void wait_ack(void)
	{
	uchar wait_time;
	wait_time=255;
	FM3164_SCL=1;
	while(FM3164_SDA)
		{
		wait_time--;
		if(wait_time==0)
			break;
		}
	FM3164_SCL=0;
	}
void write_realtime(uchar	time_number)
	{
	uchar 	j;
	time_start();
	time_send(0xa2);
	wait_ack();
	time_send(add_start.add_byte[1]);	/*read from the address*/
	wait_ack();
	for(j=0;j<time_number;j++)
		{
	   	time_send(eep_buf[j]);
	   	wait_ack();
	   	}
	time_stop();
	}
void	read_realtime(uchar *old_time1)				/*old_time give the head of real_time*/
	{
	uchar	i;
	time_start();
	time_send(0xa2);
	wait_ack();
	time_send(2);	/*read from the address*/
	wait_ack();
	time_start();
	time_send(0xa3);
	wait_ack();
	for(i=2;i<9;i++)
		{
		eep_buf[i]=time_take();
		if(i!=8)
			{
		 	FM3164_SDA=0;
			_nop_();
			_nop_();
			_nop_();
		 	FM3164_SCL=1;
			_nop_();
			_nop_();
			_nop_();
		 	FM3164_SCL=0;
			}
		}
 	FM3164_SDA=1;
	_nop_();
	_nop_();
	_nop_();
 	FM3164_SCL=1;
	_nop_();
	_nop_();
	_nop_();
 	FM3164_SCL=0;

	time_stop();

	*old_time1=eep_buf[8];			/*year*/
	*(old_time1+1)=eep_buf[7]&0x1f;	/*month*/
	*(old_time1+2)=eep_buf[5]&0x3f;	/*day*/
	*(old_time1+3)=eep_buf[4]&0x3f;	/*hour*/
	*(old_time1+4)=eep_buf[3]&0x7f;	/*minute*/
	*(old_time1+5)=eep_buf[2]&0x7f;	/*second*/
	if(old_time[4]!=(eep_buf[3]&0x7f))
		{
		old_minute_pulse=minute_pulse;
		minute_pulse=0;
		minute_inc=1;
		}
	copy_ram_same(old_time1,old_time,6);
	}

bit	compare_arr(uchar *source,uchar *target,uchar number)
	{
	uchar	i;
	for(i=0;i<number;i++)
		{
		if(*(source+i)!=*(target+i))
			return(0);
		}
	return(1);
	}

//judge the card plug_in or not,card_find=0 means plug_in so set card_exist
void	judge_card(void)
	{
	uchar   i,temp;
        if(have_int!=1)
	old_card_type=s_card_type;


//	read_in_high();
	SEL_OTHERS=0;
	SEL_IN_LOW=1;
	SEL_IN_HIGH=0;
	P0=0xff;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	in_buffer2=P0;
	SEL_IN_HIGH=1;
	SEL_OTHERS=1;

                //verify card number


                if((in_buffer2&0x80)==0)
                {

                SEL_OTHERS=1;            //c 使卡在插入后上电
                mirror_377=0x7f;
                sel_hc377=mirror_377;
		        card_exist=1;
                poll_card_exist=1;
                delay_1ms();

            temp=0;
            add_start.add_word=0;
            card_read(eep_buf,32);
			for(i=1;i<32;i++)
				temp^=eep_buf[i];
			for(i=(eep_buf[0]%22+1);i<(eep_buf[0]%22)+9;i++)
				temp^=eep_buf[i];


                card_right=0;
                poll_card_right=0;
                if(temp==0)
			//如果校验和为0代表本卡确系合法操作软件发出的
				{
                add_start.add_word=0;
                card_read(eep_buf,1);
			//合法的卡
				card_right=1;
				poll_card_right=1;
				add_start.add_word=eep_buf[0]%22+9;
				card_read(&tempb,1);
			//判断插入卡的类型
				card_type=0;		//是 个人卡

			//是管理卡
//				if(tempb%2)
//				card_type=1;
				}


		if(old_card_exist==0&&old_second_pulse==0)		//显然是卡插入的动作
			{
                        add_start.add_word=_DRIVER_CODE;
                        card_read(eep_buf,4);
                         if(compare_arr(eep_buf,now_driver,3)||((eep_buf[0]==0xff)&&(eep_buf[1]==0xff)&&(eep_buf[2]==0xff)))		//已经是当前登录的卡号,无须处理
			                 { }
			               else									//是新的驾驶员卡,先注销原来的驾驶员,再登录新驾驶员
			               {
			                //注销老的驾驶员
                            if(now_log_on==1)
			                log_off();
                            if(card_right==1)
			                log_on();
			                }
//                           }
			             card_in=1;
                         card_out=0;
                        old_card_exist=card_exist;		//先认为卡是不正确的
                        add_start.add_word=_DRIVER_PERIOD;
                        card_read(temp_arr,3);
                        add_start.add_word=DRIVER1_VALID+24*now_driver_num;
			            fm_write(temp_arr,3);


			}
               }
 else
              {
              SEL_OTHERS=1;               //c 使卡在拔掉后断电
              mirror_377=0xff;
              sel_hc377=mirror_377;
              SEL_OTHERS=0;

          poll_card_exist=0;	//卡不存在
		  card_exist=0;
		  if(old_card_exist)
			{
			card_out=1;
            card_in=0;		//卡拔除动作
            poll_card_pass=1;	//密码恢复为未通过
            old_card_exist=card_exist;
			}
                }


}
//uchar	make_send_sum1(uchar	com_lenth)
//	{
//	uchar	i,checksum;
//	checksum=0;
//	for(i=0;i<com_lenth;i++)
//		checksum^=com1_send_buf[i];
//	return(checksum);
//	}
//////void	set_timer(uchar	time_lenth)
//////	{
//////	TH1=0x70;
//////	TL1=0;
//////	time20ms=time_lenth;
//////	dingshi=0;
////////	TR1=1;
//////	}

void	send_tone(uchar tone_number)		//发送命令到显示部分播放指定编号语音信息,还要判断语音开关是否打开
	{
	if(parameter.para_arr.mute_8_sw&tone_number)
		{
	//如果允许发出声音位打开就向显示部分发出发声命令
		EEPCON=0;		//要求使用外部IIC总线,需要延时等待显示部分放弃总线
		delay_1ms();
		add_start.add_word=S_MUTE_NOW;
		show_read(&tempa,1);
		tempa|=tone_number;
		show_write(&tempa,1);
//		tone_flash=1;
                delay_2ms();
		EEPCON=1;
		}
	}
//向显示部分发送需要显示的内容
//void	send_show(uchar show_number)
//	{
//	show_number=1;
//	}

void	load_parameter(void)	//载入设定参数
	{
	add_start.add_word=VCC+1;
//	vcc.vcc_word=1000;
//	fm_write(vcc.vcc_byte,2);
	fm_read(vcc.vcc_byte,2);
	add_start.add_word=CYCLE_PULSE;
//	tempa=8;                         //      _>
//	fm_write(&tempa,2);               //       _>
	fm_read(&tempa,1);
	km_pulse.km_word=vcc.vcc_word*tempa;
	add_start.add_word=VEHI_PARA;
	fm_read(parameter.para_vehi,16);
//检查参数的内容是否有不合规范的数据,如果有需要校正
	if(parameter.para_arr.rest_sec==0)
		parameter.para_arr.rest_sec=20;			//默认的休息时间为20分钟
	if(parameter.para_arr.run_sec==0)
		parameter.para_arr.run_sec=240;			//默认的运行时间为45*4=180分钟
	}
void	save_realtime(uint time_address)
	{
	read_realtime(now_time);
	add_start.add_word=time_address;
	fm_write(now_time,6);
	}
void	write_flash_byte(uchar	write_byte)
	{
	data	union
		{
		uchar	temp[2];
		uint		temp_arr;
		}temp1;
	mirror_377&=0xe0;
	mirror_377+=flash_high_add;
	SEL_OTHERS=1;
	sel_hc377=mirror_377;
	SEL_OTHERS=0;
	temp1.temp[1]=flash_low_add;
	temp1.temp[0]=flash_mid_add;
//	set_extram;
	XBYTE[temp1.temp_arr]=write_byte;
//	clr_extram;
	SEL_OTHERS=1;
	}
uchar	read_flash_byte(void)
	{
	uchar	temp;
	data	union
		{
		uchar	temp[2];
		uint		temp_arr;
		}temp1;
	mirror_377&=0xe0;
	mirror_377+=flash_high_add;
	SEL_OTHERS=1;
	sel_hc377=mirror_377;
	SEL_OTHERS=0;
	temp1.temp[1]=flash_low_add;
	temp1.temp[0]=flash_mid_add;
//	set_extram;
	temp=XBYTE[temp1.temp_arr];
//	clr_extram;
	SEL_OTHERS=1;
	return(temp);
	}
void	delay_100us(void)
	{
	uchar	i;
	for(i=0;i<20;i++)
		nop5();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -