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

📄 lcddrive.c

📁 以PIC4580为平台开发的集成液晶屏显示功能
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -