📄 lcddrive.c
字号:
#include "F3E.h"
unsigned char KeyName; //按键值
unsigned char KeyName1; //车速按键值
unsigned char KeyName2; //空调请求按键
unsigned int counter;
unsigned int counter1;
unsigned char rcv_data[10]; //CAN数据存储函数
unsigned char num=1; //界面标识
unsigned char num1=1;
unsigned char Number_ICO[10];
unsigned char n;//低位
unsigned char m;//高位
//=====================================显示界面==============================
unsigned char up_arrow[]={0xA1,0xFC} ;
unsigned char down_arrow[]={0xA1,0xFD} ;
unsigned char clear[]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//============================第1屏================================
//车速
unsigned char chesu[]={0xB3,0xB5,0xCB,0xD9,0xA3,0xBA};
//KM/H
unsigned char KM_H[4]={0x6B,0x6D,0x2F,0x68};
//里程
unsigned char licheng[]={0xC0,0xEF,0xB3,0xCC,0xA3,0xBA};
//KM
unsigned char KM[]={0x6B,0x6D};
//============================第2屏================================
unsigned char zhenkongshachexitong[]={0xD5,0xE6,0xBF,0xD5,0xC9,0xB2,0xB3,0xB5,0xCF,0xB5,0xCD,0xB3,0xA3,0xBA,0xA1,0xFC};
unsigned char zhenkongdu[]={0xD5,0xE6,0xBF,0xD5,0xB6,0xC8,0xA3,0xBA};
unsigned char zhenkongbeng[]={0xD5,0xE6,0xBF,0xD5,0xB1,0xC3,0xA3,0xBA,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//吸合:
unsigned char xihe[]={0xCE,0xFC,0xBA,0xCF};
//关断
unsigned char guanduan[]={0xB9,0xD8,0xB6,0xCF};
//发动机冷却液温度
unsigned char fadongji[]={0xC0,0xE4,0xC8,0xB4,0xD2,0xBA,0xA3,0xBA,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//正
unsigned char zheng[]={0xA3,0xAB};
//负
unsigned char fu[]={0xA3,0xAD};
//============================第3屏================================
unsigned char shuiwenlengquexitong[]={0xCB,0xAE,0xCE,0xC2,0xC0,0xE4,0xC8,0xB4,0xCF,0xB5,0xCD,0xB3,0xA3,0xBA,0xA1,0xFC};
unsigned char lengningfengshan[]={0xC0,0xE4,0xC4,0xFD,0xB7,0xE7,0xC9,0xC8,0xA3,0xBA,0x20,0x20,0x20,0x20,0x20,0x20};
unsigned char lengquefengjizhuangtai[]={0xC0,0xE4,0xC8,0xB4,0xB7,0xE7,0xBB,0xFA,0xA3,0xBA,0x20,0x20,0x20,0x20,0x20,0x20};
unsigned char shuiwen[]={0xCB,0xAE,0xCE,0xC2,0xA3,0xBA,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//工作
unsigned char gongzuo[]={0xB9,0xA4,0xD7,0xF7};
//高
unsigned char gao[]={0xB8,0xDF,0xB5,0xB5};
//低
unsigned char di[]={0xB5,0xCD,0xB5,0xB5};
//============================第4屏================================
unsigned char zhujiechuqi[]={0xD6,0xF7,0xBD,0xD3,0xB4,0xA5,0xC6,0xF7,0xA3,0xBA,0x20,0x20,0x20,0x20,0xA1,0xFC};
unsigned char kongtiaojidianqi[12]={0xBF,0xD5,0xB5,0xF7,0xBC,0xCC,0xB5,0xE7,0xC6,0xF7,0xA3,0xBA};
unsigned char shuibeng[]={0xCB,0xAE,0xB1,0xC3,0xA3,0xBA,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//==========================定义主控数据============================
//主控状态数据
typedef struct
{
unsigned char zhujidianqistate ; //主继电器状态
unsigned char fengjididangstate ; //低档风机
unsigned char fengjigaodangstate; //高档风机
unsigned char zhenkongstate ; //真空泵状态
unsigned char kongtiaostate ; //空调继电器
unsigned char shuibengstate ; //水泵状态
unsigned char lengningstate ; //冷凝风扇状态
}ECU_state;
//主控AD数据
typedef struct
{
unsigned char shuiwen; //水温值
unsigned char zhenkongyali; //真空度
unsigned char fadongjitemp; //发动机冷却液温度
unsigned char Speed; //车速
}ECU_DATA;
ECU_state ecu_state;
ECU_DATA ecu_data;
long int Odo; //里程
//数据转换为十进制时使用
long int hexdata_transfer;
unsigned char hexdata_million;
unsigned char hexdata_shiwan;
unsigned char hexdata_wan;
unsigned char hexdata_thousand;
unsigned char hexdata_hundred;
unsigned char hexdata_ten;
unsigned char hexdata_ge;
typedef struct
{
unsigned char million_bit;
unsigned char shiwan_bit;
unsigned char wan_bit;
unsigned char thousand_bit;
unsigned char hundred_bit;
unsigned char ten_bit;
unsigned char ge_bit;
}Hexbits; //十进制数结构
Hexbits hex_bit;
//================AD转换数据存储结构==================
union adres
{
unsigned int AD;
unsigned char adre[2];
}adresult;
//lcd指令参考
// RS RW DB7~DB0
// 0 0 0x01 清除显示
// 0 0 0x30 8位基本指令集动作
// 0 0 0x0c 开整体显示,无光标,不反显
// 0 0 ox06 进入点设定,并设置光标右移,即AC+1
void dataflow_1(void);
void dataflow_2(void);
void dataflow_3(void);
void dataflow_4(void);
void dataflow_5(void);
void Delay(void) //2.4ms
{
unsigned char i,j;
for(i=0; i<10; i++)
for(j=0; j<100; j++)
;
}
//****************************************************************************//
//名称:check_busy(void)
//入口参数:无
//出口参数:无
//函数说明:检查LCD是否忙碌子程序
//*****************************************************************************//
void check_busy(void)
{
unsigned char lcd_status;
TRISC=0xff; //设置C口为输入
RS=0;
RW=1;
lcd_status=0xff;
while((lcd_status & 0x80) == 0x80)
{
E=1;
// Delay();
E=0;
lcd_status = PORTC; //读取C口引脚状态
}
}
//****************************************************************************//
//名称:LCD_WriteCommand(uint8 command)
//入口参数:command 要写入的命令字
//出口参数:无
//函数说明:写命令子程序
//*****************************************************************************//
void LCD_WriteCommand(unsigned char lcd_com)
{
TRISC=0x00; //设置C口为输出
RS=0;
RW=0;
LATC=lcd_com;
E=1;
//Delay();
E=0;
check_busy();
}
//****************************************************************************//
//名称:LCD_WriteData(uint8 dat)
//入口参数:dat 要写入的数据
//出口参数:无
//函数说明:写数据子程序
//*****************************************************************************//
void LCD_WriteData(unsigned char dat)
{
TRISC=0x00; //设置C口为输出
RS=1;
RW=0;
LATC=dat;
E=1;
Delay();
E=0;
check_busy();
}
//****************************************************************************//
//名称:clear_LCD(void)
//入口参数:无
//出口参数:无
//函数说明:清屏
//*****************************************************************************//
void clear_LCD(void)
{
check_busy();
LCD_WriteCommand(0x01);
}
//****************************************************************************//
//名称:LCD_Initialize(void)
//入口参数:无
//出口参数:无
//函数说明:LCM初始化,将LCM初始化为纯图形模式
//*****************************************************************************//
void LCD_Initialize(void)
{
//LCD_WriteCommand(0x30); //选择基本指令集
LCD_WriteCommand(0x30); //选择8bits数据流
LCD_WriteCommand(0x08); //开整体显示,无光标,不反显
LCD_WriteCommand(0x01); //清除显示,并设置DDRAM位计数器(AC)为“00H”(即地址指针为00H)
LCD_WriteCommand(0x06); //设定进入点,并设置光标右移
LCD_WriteCommand(0x0c); //
LCD_WriteCommand(0x14); //
LCD_WriteCommand(0x80); //
}
//****************************************************************************//
//名称:LCD_WriteNByte(uint8 *pd,uint8 n)
//入口参数:字符串地址pd,字节数n
//出口参数:无
//函数说明:向LCD写入N字节数据
//*****************************************************************************//
void LCD_WriteNByte(unsigned char *pd,unsigned char n)
{
TRISC=0x00; //设置C口为输出
for(;n!=0;n--,pd++)
{
LCD_WriteData(*pd);
// check_busy();
// RS=1;
// RW=0;
// E=1;
// PORTC=*pd;
// E=0;
}
// RW=1;
}
//****************************************************************************//
//名称:LCD_SelectPlace(uint8 PlaceY,uint8 PlaceX)
//入口参数:行PlaceY,列PlaceX
//出口参数:无
//函数说明:设定字符串要从Y行X列写入
//*****************************************************************************//
void LCD_SelectPlace(unsigned char PlaceY,unsigned char PlaceX)
{
switch(PlaceY)
{
case 1: PlaceY=0x80+PlaceX; break;
case 2: PlaceY=0x90+PlaceX; break;
case 3: PlaceY=0x88+PlaceX; break;
case 4: PlaceY=0x98+PlaceX; break;
default: break;
}
// LCD_WriteCommand(0x30);
LCD_WriteCommand(PlaceY); //设定字符串的插入点
}
//****************************************************************************//
//名称:LCD_PrintChar(uint8 *pd,uint8 PlaceY,uint8 PlaceX,uint8 n)
//入口参数:字符串地址pd,行PlaceY,列PlaceX,字节数n
//出口参数:无
//函数说明:将要显示的字符串写入LCD。
//*****************************************************************************//
void LCD_PrintChar(unsigned char *pd,unsigned char PlaceY,unsigned char PlaceX,unsigned char n)
{
LCD_SelectPlace(PlaceY,PlaceX);
LCD_WriteNByte(pd,n);
}
/****************************************************************************
**函数:uint8 transfordata(uint8 i)
**功能:转换数值
**参数:无
**说明:0-9数值的显示数值转换。
** 用于十六位数据提出以后的十进制数据能在显示屏中以0-9显示出来
** 使用一个对照表就能让所有数据显示出来。
******************************************************************************/
unsigned char transfordata(unsigned char i)
{
unsigned char n;
switch(i)
{
case 0:n=0x30;break;
case 1:n=0x31;break;
case 2:n=0x32;break;
case 3:n=0x33;break;
case 4:n=0x34;break;
case 5:n=0x35;break;
case 6:n=0x36;break;
case 7:n=0x37;break;
case 8:n=0x38;break;
case 9:n=0x39;break;
default:break;
}
return n;
}
/*************************************************************
**函数:void LCD_PrintNumber(uint8 *NUM,uint8 y,uint8 x,uint8 n)
**参数:uint8 *NUM: 字符串的首地址
uint8 y: 行数
uint8 x: 起始地址
uint8 n: 显示字符串的个数
**功能:数字显示的情况为: 1:3位显示
2:4位显示
3:5位显示,带小数点
4:8位显示,带小数点
**说明:用于显示数值,不需要的0不显示
**************************************************************/
void LCD_PrintNumber(unsigned char *NUM,unsigned char y,unsigned char x,unsigned char n)
{
switch(n)
{
case 3:
//百位为0时不显示
if(*NUM==0x30)
{
*NUM=0x20;
//百位和十位都为0时都不显示
if(*(NUM+1)==0x30)
{
*(NUM+1)=0x20;
}
}
break;
case 4:
//千位为0时不显示
if(*NUM==0x30)
{
*NUM=0x20;
//千位和百位都为0时都不显示
if(*(NUM+1)==0x30)
{
*(NUM+1)=0x20;
//千位、百位和十位都为0时都不显示
if(*(NUM+2)==0x30)
{
*(NUM+2)=0x20;
}
}
}
break;
case 5: //带小数点的数字 111.6
//百位为0时不显示
if(*NUM==0x30)
{
*NUM=0x20;
//百位和十位都为0时都不显示
if(*(NUM+1)==0x30)
{
*(NUM+1)=0x20;
}
}
break;
case 8:
//百万位0时不显示
if(*NUM==0x30)
{
*NUM=0x20;
//百万位、十万位为0不显示
if(*(NUM+1)==0x30)
{
*(NUM+1)=0x20;
//百万位、十万位、万位不为0时不显示
if(*(NUM+2)==0x30)
{
*(NUM+2)=0x20;
//百万位、十万位、万位、千位不为0时不显示
if(*(NUM+3)==0x30)
{
*(NUM+3)=0x20;
//百万位、十万位、万位、千位、百位不为0时不显示
if(*(NUM+4)==0x30)
{
*(NUM+4)=0x20;
}
}
}
}
}
break;
default:
break;
}
LCD_PrintChar(NUM,y,x,n);
}
/*********************************************************************
*函数:void HEX_count()
*参数:int32 hexdata
*功能:用于16进制的数据的十进制的转换。
*说明:对CAN总线上获取的十六进制的数据进行转换为十进制的数,用于显示部
**** 分的显示。
**********************************************************************/
unsigned char HEX_count( long int hexdata)
{
hexdata_transfer=hexdata;
//===============百万位的计算==============
if(hexdata_transfer<=999999)
{
hex_bit.million_bit=0;
}
while( hexdata_transfer-1000000>=0)
{
hexdata_million++;
hex_bit.million_bit=hexdata_million;
hexdata_transfer= hexdata_transfer-1000000;
}
//===============十万位的计算==============
if(hexdata_transfer<=99999)
{
hex_bit.shiwan_bit=0;
}
while( hexdata_transfer-100000>=0)
{
hexdata_shiwan++;
hex_bit.shiwan_bit=hexdata_shiwan;
hexdata_transfer= hexdata_transfer-100000;
}
//===============万位的计算================
if(hexdata_transfer<=9999)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -