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

📄 lcddrive.c

📁 以PIC4580为平台开发的集成液晶屏显示功能
💻 C
📖 第 1 页 / 共 3 页
字号:
	  	LCD_PrintNumber(di,3,5,4);
	  }
	  if(ecu_state.fengjididangstate==0&&ecu_state.fengjigaodangstate==1)
	  {
	  	LCD_PrintNumber(gao,3,5,4);
	  }
	  //冷凝风扇状态
	  if(ecu_state.lengningstate==0)
	  {
	   LCD_PrintChar(guanduan,4,5,4);    //第3排 
	  }
	  if(ecu_state.lengningstate==1)
	  {
	   LCD_PrintChar(gongzuo,4,5,4);    //第3排 
	  }
  }
}

//***************************************************************************
//函数:void dataflow_4(void)
//功能:数据流显示界面
//参数:无
//***************************************************************************
void dataflow_4(void)
{
  clear_LCD();
  KeyName=0;
  LCD_PrintChar(zhujiechuqi,1,0,16);    //第一排 
  LCD_PrintChar(shuibeng,2,0,16);           //第2排
  LCD_PrintChar(kongtiaojidianqi,3,0,12);  //第3排  
  LCD_PrintChar(down_arrow,4,7,2);
while(num==0x04)
{
//======================第一排:主继电器===========================
  if(ecu_state.zhujidianqistate==0)
  {
   LCD_PrintChar(guanduan,1,5,4);    //第一排 
  }
  if(ecu_state.zhujidianqistate==1)
  {
   LCD_PrintChar(xihe,1,5,4);        //第一排
  }
//========================第2排:水泵状态========================
  if(ecu_state.shuibengstate==1)
  {
    LCD_PrintChar(gongzuo,2,5,4);
  }
  if(ecu_state.shuibengstate==0)
  {
    LCD_PrintChar(guanduan,2,5,4);
  } 
//======================第3排:空调继电器状态===========================
  if(ecu_state.kongtiaostate==0)
  {
   LCD_PrintChar(guanduan,3,6,4);    //第2排 
  }
  if(ecu_state.kongtiaostate==1)
  {
   LCD_PrintChar(xihe,3,6,4);    //第2排 
  }   
}

}
//===========================按键扫描===========================================
/*******************************************************************************
//函数:uint8 KeyName()
//入口参数:无
//返回:具体的按键值
//说明:用来检测“方向”按键的值,并返回具体的按键值
********************************************************************************/
unsigned char Key_Name(void)
{
  unsigned char c;//,b
  c=PORTD&0x30;
  switch(c)
  {
    case 0x20: return key_up; break;
    case 0x10: return key_down;break;
    default: break;
  }
 }
/*******************************************************************************
**函数:void Key_scan()
**功能:用来检测“方向”按键的具体值,并用来防抖
**参数:无
**返回:无
**说明:
********************************************************************************/
void Key_scan(void)
{
static signed char KeyP,KeyS,KeyTemp;
unsigned char tempscan;
unsigned char a;
 a=PORTD&0x30;
	if(a!=0x30)
	{
	tempscan = Key_Name(); 
		if(KeyS==1)
		{
			if(KeyTemp==tempscan)
			{
			KeyP = 1;
			}
			else
			{
			KeyTemp = tempscan;
			KeyP = 0;
			}
		}
		else
		{
		KeyTemp = tempscan;
		KeyS = 1;
		}
	}
	else
	{
		if(KeyP==1) 
		{
		  KeyName = KeyTemp;
		}
	KeyP = 0;
	KeyS = 0;
	KeyTemp = 0;
	}
}
/*******************************************************************************
//函数:uint8 KeyName1()
//入口参数:无
//返回:具体的按键值
//说明:用来检测“车速”按键的值,并返回具体的按键值
********************************************************************************/
unsigned char Key_Name1(void)
{
    unsigned char b;
	b=PORTA&0x08;
    switch(b)
    {
	  case 0x00:  return key_chesu; break;
 	  default : break;
	}
 }
/*******************************************************************************
**函数:void Key_scan1()
**功能:用来检测“车速”按键的具体值,并用来防抖
**参数:无
**返回:无
**说明:
********************************************************************************/
void Key_scan1(void)
{
static signed char KeyP,KeyS,KeyTemp;
unsigned char tempscan;
unsigned char d;
 d=PORTA&0x08;
	if(d!=0x08)
	{
	tempscan = Key_Name1(); 
		if(KeyS==1)
		{
			if(KeyTemp==tempscan)
			{
			KeyP = 1;
			}
			else
			{
			KeyTemp = tempscan;
			KeyP = 0;
			}
		}
		else
		{
		KeyTemp = tempscan;
		KeyS = 1;
		}
	}
	else
	{
		if(KeyP==1) 
		{
		  KeyName1 = KeyTemp;
		}
	KeyP = 0;
	KeyS = 0;
	KeyTemp = 0;
	}
}
/*******************************************************************************
//函数:uint8 KeyName2()
//说明:用来检测空调请求按键
********************************************************************************/
unsigned char Key_Name2(void)
{
    unsigned char b;
	b=PORTA&0x04;
	if(b==0x00)   KeyName2=qingqiu;
	else          KeyName2=cexiao;
	return KeyName2;  
 }

//*************************************************
//显示界面跳转函数
//*************************************************
void display(unsigned i)
{
  switch(num)
 {
  case 1:
   dataflow_1();
   break;
  case 2:
   dataflow_2();
   break;
  case 3:
   dataflow_3();
   break;
  case 4:
   dataflow_4();
   break;
  default:
   break;
 }
} 

//*************************************************
//TIMER0初始化
//*************************************************
void init_tim0(void)
{
	T0CON = 0x8f;							//开TIM0,16bit,没有分频
	INTCON2bits.TMR0IP = 1;					//溢出中断为高优先级
	TMR0H = 0Xf8;							//先H后L
	TMR0L = 0X55;                          //周期改为0.5ms
}
#pragma code
#pragma interrupt tim0_isr
void tim0_isr(void)
{
	INTCONbits.GIE = 0;
   	TMR0H = 0Xf8;							//先H后L
	TMR0L = 0X55; 

    if(PIR3bits.RXB0IF == 1)    //有新报文数据
	{
		RECV_DATA();
		PIR3bits.RXB0IF = 0;    //报文标识清零
		RXB0CONbits.RXFUL = 0;  //可以接收新报文
	} 
	counter1++;
    counter++;	
	if(counter1==1000)
	{
	  Key_Name2();
		//空调请求
      if(KeyName2==qingqiu)
	  {
		SendAir1();
	  }
	  if(KeyName2==cexiao)
	  {
		SendAir2();
	  }
	}
	if(counter1>=2000)
	{       
		SendMototemp();			//发动机冷却液温度报文发送
		counter1=0;
	}
    if(counter>=200)                   //0.1秒进一次中断
    {
	  counter=0;
      ad_sample();//AD采样	  
	  Key_scan();//方向按键检测	  
	  if(KeyName==key_down)      //向下按键
      {
	     num=num+1;
         if(num==5)
         {
          num=1;
         }
	  }
      if(KeyName==key_up)        //向上按键
      {
	     num=num-1;
         if(num==0)
         {
          num=4;
         }
	  }   
	  Key_scan1();//车速按键检测
	  if(KeyName1==key_chesu)   //车速按键
      {	
		 //m=0;
		 KeyName1=0;
	     num1=num1+1;
	     if(num1==6)
	     {
	        num1=1;
	     }	  	
      }
	 switch(num1)
	  {
		case 1: 
				T1CONbits.TMR1ON=0;
				 break;//n=699;
		case 2: 
				T1CONbits.TMR1ON=0;
				m=0x25;n=0x3F;  //27
				T1CONbits.TMR1ON=1;
				break;
		case 3: 
				T1CONbits.TMR1ON=0;
				m=0x92;n=0x9F;  //13
				T1CONbits.TMR1ON=1;
				break;
		case 4: 
				T1CONbits.TMR1ON=0;
				m=0xB9;n=0xAF;  //8
				T1CONbits.TMR1ON=1;
				break;
		case 5: 
				T1CONbits.TMR1ON=0;
				m=0xC9;n=0x4F;   //6
				T1CONbits.TMR1ON=1;
				break;
		default: break;
 	  }  
    }	
    INTCONbits.TMR0IF = 0;               //软件清零溢出中断标志位
	INTCONbits.GIE = 1;
}

//*************************************************
//TIMER1初始化
//*************************************************
void init_tim1(void)
{
	PIE1bits.TMR1IE = 0;
	T1CONbits.RD16=1;	//16位工作模式
	T1CONbits.TMR1CS=0;	//内部时钟
	T1CONbits.T1OSCEN=1;//使能TIMER1振荡器
	T1CONbits.T1CKPS1=0;
	T1CONbits.T1CKPS0=1;
	//T1CON = 0x8f;							//开TIM0,16bit,没有分频
	IPR1bits.TMR1IP = 1;					//溢出中断为高优先级
	TMR1H = m;				//先H后L
	TMR1L = n;                     //
}
#pragma code
#pragma interrupt tim1_isr
void tim1_isr(void)
{
	INTCONbits.GIE = 0;
   	TMR1H = m;				//先H后L
	TMR1L = n; 

 	cs=~cs;				//车速模拟

    PIR1bits.TMR1IF = 0;               //软件清零溢出中断标志位
	INTCONbits.GIE = 1;
}
#pragma code high = 0x08
void high(void)
{
	if(INTCONbits.TMR0IF==1)//寄存器溢出
	{
		_asm
		goto tim0_isr
		_endasm
	}

	if(PIR1bits.TMR1IF==1)//寄存器溢出
	{
		_asm
		goto tim1_isr
		_endasm
	}
}
#pragma code

//*************************************************
//主函数
//*************************************************
void main(void)
{
//管脚初始化
	//ADCON0 = 0x01;
	//ADCON1 = 0x0e;                            //开启AD,选择AN0
	ADCON0 = 0x00;
	ADCON1 = 0x0f;                            //屏蔽AD
    TRISE = TRISE & 0x08;                      //RE3为输入(MCLR)
    TRISA = TRISA | 0x0d;                      //RA0、RA2、RA3为输入
	TRISA = TRISA & 0xfd;	                   //RA1为输出
    TRISD = TRISD | 0x30;                      //RD4,RD5为输入(方向按键)
    TRISC =  0x00;

	//开定时器0中断
	INTCON = 0xC0;                              //开所有中断
    INTCONbits.TMR0IE = 1;						//使能TMR0溢出中断
    init_tim0();                                //定时器0初始化
	T1CONbits.TMR1ON=0;							//禁止TMR1
	init_tim1();								//初始化定时器1
    init_can();                                 //CAN初始化
	RST = 0;
    Delay();
	RST = 1;
	LCD_Initialize();
    dataflow_1();
 
    while(1)
    {
      if(KeyName==key_down||KeyName==key_up)
	  {//有按键按下
        display(num);
	  }
    }
}

⌨️ 快捷键说明

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