引用头文件
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "key.h"
#include "i2c_hal.h"
#include "badc.h"
#include "math.h"
浮点型在数字后加个f可以避免警告,由于ucled是十六进制,在lcd显示时是十进制所以单独定义i,
//全局变量
uint8_t ucState;
float Volt,Ma=2.4f,Mi=1.2f;
int flag;
__IO uint32_t uwTick_Led_Set_Point = 0;
//*按键扫描专用变量
unsigned char ucKey_Val, ucKey_Down, ucKey_Up, ucKey_Old;
//*LCD显示专用变量
unsigned char text[21];//最多显示20个字符
//*LED专用变量
unsigned char ucLed, ucLed1=0x01,ucLed2=0x02;
unsigned int i1=1,i2=2;
声明函数
//声明子函数
void Key_Proc(void);
void Lcd_Proc(void);
void Led_Proc(void);
//-----------初始化外设函数----------------
LCD_Init();
LCD_Clear(White);
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
while(1)中
Key_Proc();
Lcd_Proc();
Led_Proc();
Volt =getADC(&hadc2);
flag=(Volt<Mi)?1:(Volt<=Ma)?2:3;
定义函数
需要注意电压值在0-3.3v范围且,下限不能超过上限,小数比较时不能直接比较,要用&&fabs(a-b)>1e-6这种形式(调用math.h)
//按键处理函数
void Key_Proc(void)
{
// if((uwTick - uwTick_Key_Set_Point)<100) return;//减速函数
// uwTick_Key_Set_Point = uwTick;
ucKey_Val = Key_Scan();
ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);
ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);
ucKey_Old = ucKey_Val;
switch(ucKey_Down)
{
case 2: //B2短按
if(++ucState==6) ucState =1;
break;
case 4: //B4短按,ucled进行-1操作,v-0.3
if(ucState ==2)
{
if(Ma>=Mi&& fabs(Mi-Ma)>1e-6)
Ma-=0.3f;
}
else if(ucState ==3)
{
if(Mi>0)
Mi-=0.3f;
}
else if(ucState ==4)
{
if(--i1==0)
{
i1=8;
ucLed1=0x80;
}
else
ucLed1=(ucLed1>>1);
ucLed =0x00;
}
else if(ucState ==5)
{
if(--i2==0)
{
i2=8;
ucLed2=0x80;
}
else
ucLed2=(ucLed2>>1);
ucLed =0x00;
}
break;
case 3: //B3短按,ucled进行左移1位操作,v+0.3
if(ucState ==2)
{
if(Ma<3.3f)
Ma+=0.3f;
}
else if(ucState ==3)
{
if(Mi<Ma && fabs(Mi-Ma)>1e-6)
Mi+=0.3f;
}
else if(ucState ==4)
{
if(++i1==9)
{
i1=1;
ucLed1=0x01;
}
else
ucLed1=(ucLed1<<1);
ucLed =0x00;
}
else if(ucState ==5)//lower
{
if(++i2==9)
{
i2=1;
ucLed2=0x01;
}
else
ucLed2=(ucLed2<<1);
ucLed =0x00;
}
break;
case 1: //B1短按,切换显示界面
if(++ucState >=2)
{
ucState =0;
LCD_Clear(White);
}
break;
}
}
//LCD显示函数
void Lcd_Proc(void)
{
if(ucState ==0)
{
sprintf((char*)text," Main " );
LCD_DisplayStringLine(Line1,text);
sprintf((char *)text," Volt:%.2fV ",Volt);
LCD_DisplayStringLine(Line4,(uint8_t *)text);
switch(flag)
{
case 1:
sprintf((char *)text," Status:Lower ");
LCD_DisplayStringLine(Line6,(uint8_t *)text);
break ;
case 2:
sprintf((char *)text," Status:Normal ");
LCD_DisplayStringLine(Line6,(uint8_t *)text);
break ;
case 3:
sprintf((char *)text," Status:Upper ");
LCD_DisplayStringLine(Line6,(uint8_t *)text);
break ;
}
}
else
{
if(ucState ==2) LCD_SetBackColor(Green);
sprintf((char *)text," Max Volt:%.1fV",Ma);
LCD_DisplayStringLine(Line2,(uint8_t *)text);
LCD_SetBackColor(White );
if(ucState ==3) LCD_SetBackColor(Green);
sprintf((char *)text," Min Volt:%.1fV",Mi);
LCD_DisplayStringLine(Line4,(uint8_t *)text);
LCD_SetBackColor(White );
if(ucState ==4) LCD_SetBackColor(Green);
sprintf((char *)text," Upper:LD%d ",i1);
LCD_DisplayStringLine(Line6,(uint8_t *)text);
LCD_SetBackColor(White );
if(ucState ==5) LCD_SetBackColor(Green);
sprintf((char *)text," Lower:LD%d ",i2);
LCD_DisplayStringLine(Line8,(uint8_t *)text);
LCD_SetBackColor(White );
}
switch(ucState)//状态
{
case 1:
case 2:
case 3:
case 4:
case 5:
sprintf((char*)text," Setting " );
LCD_DisplayStringLine(Line1,text);
break ;
}
}
这里led闪烁并且led序号会变化,所以每次按键调整led时要将ucled赋值0x00,避免以后异或影响。
//LED显示操作
void Led_Proc(void)
{
if((uwTick - uwTick_Led_Set_Point)<200) return;//减速函数
uwTick_Led_Set_Point = uwTick;
switch(flag)
{
case 1:
ucLed^=ucLed2;
break ;
case 2:
ucLed=0x00;
break;
case 3:
ucLed^=ucLed1;
break ;
}
LED_Disp(ucLed);
}