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