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

📄 lcddrive.c

📁 以PIC4580为平台开发的集成液晶屏显示功能
💻 C
📖 第 1 页 / 共 3 页
字号:
    hex_bit.wan_bit=0;
    }
    while( hexdata_transfer-10000>=0)
    {
      hexdata_wan++;
      hex_bit.wan_bit=hexdata_wan;
      hexdata_transfer= hexdata_transfer-10000;
    }
   //===============千位的计算================
   if(hexdata_transfer<=999)
    {
    hex_bit.thousand_bit=0;
    }
    while( hexdata_transfer-1000>=0)
    {
      hexdata_thousand++;
      hex_bit.thousand_bit=hexdata_thousand;
      hexdata_transfer= hexdata_transfer-1000;
    }
   //===============百位的换算===============
    if(hexdata_transfer<=99)
    {
    hex_bit.hundred_bit=0;
    }
    while( hexdata_transfer-100>=0)
    {
      hexdata_hundred++;
      hex_bit.hundred_bit=hexdata_hundred;
      hexdata_transfer= hexdata_transfer-100;
    }
   //===============十位的换算===============
   if(hexdata_transfer<=9)
   {
     hex_bit.ten_bit=0;
   } 
    while( hexdata_transfer-10>=0)
    {
      hexdata_ten++;
      hex_bit.ten_bit=hexdata_ten;
      hexdata_transfer= hexdata_transfer-10;
    }
    //================个位计算================
      hex_bit.ge_bit= hexdata_transfer;
      
      hexdata_million=0;
      hexdata_shiwan=0;
      hexdata_wan=0;
      hexdata_thousand=0;
      hexdata_hundred=0;
      hexdata_ten=0;
      hexdata_ge=0;
  // return hexdata;
}
//================================AD转化===============================
//*************************************************
//AD采样函数
//*************************************************
void ad_sample(void)
{
	ADCON0 = 0x01;                  //使能AD
	ADCON1 = 0x0e;			        //选择AN0通道,端口配置
	ADCON2 = 0x9a;                 
	ADCON0bits.GO = 1;             
	while(PIR1bits.ADIF == 0){};    //AD中断
	PIR1bits.ADIF = 0;
	adresult.adre[1] = ADRESH; 
	adresult.adre[0] = ADRESL; 
    adresult.AD=adresult.adre[1]*256+adresult.adre[0];
    ecu_data.fadongjitemp=adresult.AD/9;//*2/33
}

//==============================CAN数据接收=============================
//**************************************************
//  函数说明:设置CAN的波特率为100K,在Fosc=16M时,Tbit=10us,设BRP=07h
//            则TQ=[2*(1+BRP)]/Fosc=2*(1+7)/16=1us。
//            NOMINAL BIT RATE=10TQ,SJW=1,Sync_Seg=1TQ,
//            传播时间Prog _Seg=3TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ
//**************************************************

void init_can(void)
{
	TRISB = (TRISB|0X08) & 0XFB;                 
	CANCON = 0X80;			        	    //请求进入CAN配置模式REQOP=100
	while(CANSTAT & 0X80 == 0){;}		  	//等待进入CAN配置模式OPMODE=100
	ECANCON = 0x00;							//模式0

	BRGCON1  = 0X07;				       		//设置SJW和BRP,SJW=1TQ,BRP=0fH
	BRGCON2  = 0X92;				         	//设置Phase_Seg1=3TQ和Prog _Seg=3TQ
	BRGCON3  = 0X42;	                		//设置Phase_Seg2=3TQ
//这里设置为接收所有报文,所以以下滤波器设置无影响    
  	RXB0CON  = 0X60;							//仅仅接收扩展标识符的有效信息,
	//RXB1CON  = 0X42;		             		

/*	RXF0SIDH = 0X0c;						//初始化接收滤波器0
	RXF0SIDL = 0Xff;
	RXF0EIDH = 0Xd2;			//			
	RXF0EIDL = 0X03;

	RXF1SIDH = 0X18;						//初始化接收滤波器1
	RXF1SIDL = 0Xff;
	RXF1EIDH = 0X30;			//						
	RXF1EIDL = 0X03;

	RXF2SIDH = 0X18;						//初始化接收滤波器2
	RXF2SIDL = 0Xff;
	RXF2EIDH = 0X32;			//						
	RXF2EIDL = 0X03;
*/	
	RXF0SIDH = 0X67;						//初始化接收滤波器0
	RXF0SIDL = 0Xeb;
	RXF0EIDH = 0Xd2;			//			
	RXF0EIDL = 0X03;

	RXF1SIDH = 0Xc7;						//初始化接收滤波器1
	RXF1SIDL = 0Xeb;
	RXF1EIDH = 0X30;								
	RXF1EIDL = 0X03;

	RXF2SIDH = 0Xc7;						//初始化接收滤波器2
	RXF2SIDL = 0Xeb;
	RXF2EIDH = 0X32;			//						
	RXF2EIDL = 0X03;
	
	RXB0D0=0X00;		//初始化接收缓冲器0的数据区数据
	RXB0D1=0X00;
	RXB0D2=0X00;
	RXB0D3=0X00;
	RXB0D4=0X00;
	RXB0D5=0X00;
	RXB0D6=0X00;
	RXB0D7=0X00;

	RXM0SIDH = 0X00;						//初始化接收屏蔽
	RXM0SIDL = 0X00;
	RXM0EIDH = 0X00;
	RXM0EIDL = 0X00;

	TXB0CON  = 0X03;						//发送优先级为最高优先级,TXPRI=11
	TXB0SIDH = 0X00;						//28--21
	TXB0SIDL = 0X00;						//bits7--5(20--18) 3(exide) 1--0(17--16)
	TXB0EIDH = 0X00;						//15--8	
	TXB0EIDL = 0X00;						//7--0	
	TXB0DLC  = 0X08;						//设置数据长度为8个字节

	TXB0D0   = 0X00;		
	TXB0D1   = 0X00;
	TXB0D2   = 0X00;
	TXB0D3   = 0X00;
	TXB0D4   = 0X00;
	TXB0D5   = 0X00;
	TXB0D6   = 0X00;
	TXB0D7   = 0X00;
	
	CIOCON   = 0X00;							//初始化CAN模块的I/O控制寄存器
   	PIR3     = 0X00;			             	//CAN发送接收中断标志清零
	PIE3     = 0X00;			                //使能接收缓冲器0的接收中断
	IPR3     = 0X03;			                //接收缓冲器0的接收中断为高优先级

	CANCON   = 0X00;							//使CAN进入正常工作模式
	while(CANSTAT&0XE0!=0){;}
}

//*************************************************
//CAN接收函数,对接收到的CAN数据按应用层协议进行分类
//*************************************************
void RECV_DATA(void)
{

	rcv_data[0] = RXB0D0;
    rcv_data[1] = RXB0D1;
    rcv_data[2] = RXB0D2;
    rcv_data[3] = RXB0D3;
    rcv_data[4] = RXB0D4;
    rcv_data[5] = RXB0D5;
    rcv_data[6] = RXB0D6;
    rcv_data[7] = RXB0D7;

	switch(RXB0EIDH)
	{
	case 0xd2:
	//主控状态报文
            ecu_state.zhujidianqistate=rcv_data[0]&0x03;
     		ecu_state.fengjididangstate=(rcv_data[0]&0x0c)>>2;
			ecu_state.fengjigaodangstate=(rcv_data[0]&0x30)>>4;
			ecu_state.zhenkongstate=(rcv_data[0]&0xc0)>>6;
			ecu_state.kongtiaostate=rcv_data[1]&0x03;
			ecu_state.shuibengstate=(rcv_data[1]&0x30)>>4;    
			ecu_state.lengningstate=(rcv_data[1]&0xc0)>>6;
			break;
	case 0x30:
	//主控普通报文1
	        ecu_data.Speed = rcv_data[0];
			Odo=rcv_data[4];
			Odo=(Odo<<8)|rcv_data[3];
			Odo=(Odo<<8)|rcv_data[2];
			break;
    case 0x32:
	//主控普通报文3
          	ecu_data.shuiwen=rcv_data[2];
			ecu_data.zhenkongyali=rcv_data[4];
			break;
	default :
			break;
	}
}
//***************************************************************
//CAN数据发送:空调请求
//***************************************************************
void SendAir1(void)
{
 TXB0SIDH = 0X67;      //28--21
 TXB0SIDL = 0Xff;      //bits7--5(20--18) 3(exide) 1--0(17--16)
 TXB0EIDH = 0Xd4;      //15--8 
 TXB0EIDL = 0X05;      //7--0 
 TXB0DLC  = 0x01;             //发送数据的长度 6 字节 
 
 TXB0D0 = 0X00; 
 TXB0D1 = 0X00;   
 TXB0D2 = 0X00;
 TXB0D3 = 0X00;   
 TXB0D4 = 0X00;   
 TXB0D5 = 0X00;   
 TXB0D6 = 0X00;
 TXB0D7 = 0X00;

 TXB0D0=0x01; 
   
 TXB0CONbits.TXREQ = 1;    //请求发送
 while(PIR3bits.TXB0IF!=1){;}  //等待发送完成
 TXB0CONbits.TXREQ=0;    //禁止发送
 PIR3bits.TXB0IF = 0;
}
//***************************************************************
//CAN数据发送:空调请求
//***************************************************************
void SendAir2(void)
{
 TXB0SIDH = 0X67;      //28--21
 TXB0SIDL = 0Xff;      //bits7--5(20--18) 3(exide) 1--0(17--16)
 TXB0EIDH = 0Xd4;      //15--8 
 TXB0EIDL = 0X05;      //7--0 
 TXB0DLC  = 0x01;             //发送数据的长度 6 字节 
 
 TXB0D0 = 0X00; 
 TXB0D1 = 0X00;   
 TXB0D2 = 0X00;
 TXB0D3 = 0X00;   
 TXB0D4 = 0X00;   
 TXB0D5 = 0X00;   
 TXB0D6 = 0X00;
 TXB0D7 = 0X00;

 TXB0D0=0x00; 
   
 TXB0CONbits.TXREQ = 1;    //请求发送
 while(PIR3bits.TXB0IF!=1){;}  //等待发送完成
 TXB0CONbits.TXREQ=0;    //禁止发送
 PIR3bits.TXB0IF = 0;
}
//***************************************************************
//CAN数据发送:发动机冷却液温度
//***************************************************************
void SendMototemp(void)
{
 TXB0SIDH = 0Xc7;      //28--21
 TXB0SIDL = 0Xff;      //bits7--5(20--18) 3(exide) 1--0(17--16)
 TXB0EIDH = 0X60;      //15--8 
 TXB0EIDL = 0X0c;      //7--0 
 TXB0DLC  = 0x08;             //发送数据的长度 8 字节 
 
 TXB0D0 = 0X00; 
 TXB0D1 = 0X00;   
 TXB0D2 = 0X00;
 TXB0D3 = 0X00;   
 TXB0D4 = 0X00;   
 TXB0D5 = 0X00;   
 TXB0D6 = 0X00;
 TXB0D7 = 0X00;

 TXB0D4=ecu_data.fadongjitemp+40; 
   
 TXB0CONbits.TXREQ = 1;    //请求发送
 while(PIR3bits.TXB0IF!=1){;}  //等待发送完成
 TXB0CONbits.TXREQ=0;    //禁止发送
 PIR3bits.TXB0IF = 0;
}


//===================================显示界面编写=============================
//***************************************************************************
//函数:void dataflow_1(void)
//功能:数据流显示界面1
//参数:无
//***************************************************************************
void dataflow_1(void)
{
  clear_LCD();
  KeyName=0;
  LCD_PrintChar(chesu,1,0,6);    //第一排
  LCD_PrintChar(licheng,3,0,6);   //第三排 
  LCD_PrintChar(KM_H,2,6,4);  //第二排 
  LCD_PrintChar(KM,4,6,2);  //第四排 
  LCD_PrintChar(up_arrow,1,7,2);
  LCD_PrintChar(down_arrow,4,7,2);
  while(num==0x01)  //界面不跳一直对数据进行读取和显示
  {
  	//车速
  	HEX_count(ecu_data.Speed); //车速
  	Number_ICO[0]=transfordata(hex_bit.hundred_bit);
  	Number_ICO[1]=transfordata(hex_bit.ten_bit);
  	Number_ICO[2]=transfordata(hex_bit.ge_bit);
  	LCD_PrintNumber(Number_ICO,2,3,3);
  	//里程
  	HEX_count(Odo); //里程
  	Number_ICO[0]=transfordata(hex_bit.million_bit);
  	Number_ICO[1]=transfordata(hex_bit.shiwan_bit);
  	Number_ICO[2]=transfordata(hex_bit.wan_bit);
  	Number_ICO[3]=transfordata(hex_bit.thousand_bit);
  	Number_ICO[4]=transfordata(hex_bit.hundred_bit);
  	Number_ICO[5]=transfordata(hex_bit.ten_bit);
  	Number_ICO[6]=0x2E;
  	Number_ICO[7]=transfordata(hex_bit.ge_bit); 
  	LCD_PrintNumber(Number_ICO,4,1,8); 
  }

}
//***************************************************************************
//函数:void dataflow_2(void)
//功能:数据流显示界面
//参数:无
//***************************************************************************
void dataflow_2(void)
{
  clear_LCD();
  KeyName=0;
  LCD_PrintChar(zhenkongshachexitong,1,0,16);    //第一排   
  LCD_PrintChar(zhenkongdu,2,0,8);   //第二排   
  LCD_PrintChar(zhenkongbeng,3,0,16);  //第3排
  LCD_PrintChar(fadongji,4,0,16);  //第4排
  LCD_PrintChar(down_arrow,4,7,2);
  while(num==0x02)
  {
  	//==========第二排的显示=====================================
  	HEX_count(ecu_data.zhenkongyali); //真空度
  	Number_ICO[0]=transfordata(hex_bit.thousand_bit);
  	Number_ICO[1]=transfordata(hex_bit.hundred_bit);
  	Number_ICO[2]=transfordata(hex_bit.ten_bit);
  	Number_ICO[3]=transfordata(hex_bit.ge_bit);
  	LCD_PrintNumber(Number_ICO,2,4,4); 
  	//==========第3排:真空泵状态===============================
  	if(ecu_state.zhenkongstate==1)
  	{
       LCD_PrintChar(xihe,3,5,4);
  	}
  	if(ecu_state.zhenkongstate==0)
  	{
       LCD_PrintChar(guanduan,3,5,4);
  	}  
    //第4排:发动机冷却液温度
	HEX_count(ecu_data.fadongjitemp); //发动机冷却液温度
    Number_ICO[0]=transfordata(hex_bit.hundred_bit);
  	Number_ICO[1]=transfordata(hex_bit.ten_bit);
  	Number_ICO[2]=transfordata(hex_bit.ge_bit);
  	LCD_PrintNumber(Number_ICO,4,4,3); 
  }
}
//***************************************************************************
//函数:void dataflow_3(void)
//功能:数据流显示界面
//参数:无
//***************************************************************************
void dataflow_3(void)
{
  unsigned char water_temp1;
  clear_LCD();
  KeyName=0;
  LCD_PrintChar(shuiwenlengquexitong,1,0,16);  //第1排 
  LCD_PrintChar(shuiwen,2,0,16);   //第2排 
  LCD_PrintChar(lengquefengjizhuangtai,3,0,16);   //第3排 
  LCD_PrintChar(lengningfengshan,4,0,16);   //第4排
  LCD_PrintChar(down_arrow,4,7,2);

while(num==0x03)
{
  //==========第二排的显示=====================================
  if(ecu_data.shuiwen==0)
  {
	  	Number_ICO[0]=0x20;
	  	Number_ICO[1]=0x20;
	  	Number_ICO[2]=0x20;
	  	Number_ICO[3]=0x20;
	  	Number_ICO[4]=0x30;
	  	LCD_PrintNumber(Number_ICO,2,3,5);
   }
   else
   {
		   if(ecu_data.shuiwen<0x28&&ecu_data.shuiwen>0)
		   {
		     LCD_PrintChar(fu,2,3,2);
		     water_temp1=0x28-ecu_data.shuiwen; 
		   }
		   if(ecu_data.shuiwen>=0x28)
		   {
		     LCD_PrintChar(zheng,2,3,2);
		     water_temp1=ecu_data.shuiwen-0x28;
		   }
		   HEX_count(water_temp1); 
		   Number_ICO[0]=transfordata(hex_bit.hundred_bit);
		   Number_ICO[1]=transfordata(hex_bit.ten_bit);
		   Number_ICO[2]=transfordata(hex_bit.ge_bit);
		   LCD_PrintNumber(Number_ICO,2,4,3);
	}
	//第3排的显示
	//冷却风机状态
	  if(ecu_state.fengjididangstate==0&&ecu_state.fengjigaodangstate==0)
	  {
	  	LCD_PrintNumber(guanduan,3,5,4);
	  }
	  if(ecu_state.fengjididangstate==1&&ecu_state.fengjigaodangstate==0)
	  {

⌨️ 快捷键说明

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