第十届蓝桥杯嵌入式省赛真题G431

引用头文件

#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);
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值