📄 lcddrive.c
字号:
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 + -