蓝桥杯嵌入式第九届(代查)

目录

一、题目

1.LCD显示

2. 按键功能

 3.  长按判断功能

总结


一、题目

二、程序代码

1.LCD显示

void LCD_Proc(void)
{
	sprintf((char *)LCD_Str,"   No %d      ",time_save_add);
	LCD_DisplayStringLine(Line1,LCD_Str);
	if(set_time==1)
	{
		LCD_SetTextColor(Yellow);
		LCD_DisplayChar(Line3,224,(Time_H/10+0x30));
		LCD_DisplayChar(Line3,208,Time_H%10+0x30);
		LCD_SetTextColor(Black);
	}
	else
	{
		LCD_SetTextColor(Black);
		LCD_DisplayChar(Line3,224,(Time_H/10+0x30));
		LCD_DisplayChar(Line3,208,Time_H%10+0x30);
	}
	LCD_DisplayChar(Line3,192,':');
	if(set_time==2)
	{
		LCD_SetTextColor(Yellow);
		LCD_DisplayChar(Line3,176,(Time_M/10+0x30));
		LCD_DisplayChar(Line3,160,Time_M%10+0x30);
		LCD_SetTextColor(Black);
	}
	else
	{
		LCD_SetTextColor(Black);
		LCD_DisplayChar(Line3,176,(Time_M/10+0x30));
		LCD_DisplayChar(Line3,160,Time_M%10+0x30);
	}
	LCD_DisplayChar(Line3,144,':');
	if(set_time==3)
	{
		LCD_SetTextColor(Yellow);
		LCD_DisplayChar(Line3,128,(Time_S/10+0x30));
		LCD_DisplayChar(Line3,112,Time_S%10+0x30);
		LCD_SetTextColor(Black);
	}
	else
	{
		LCD_SetTextColor(Black);
		LCD_DisplayChar(Line3,128,(Time_S/10+0x30));
		LCD_DisplayChar(Line3,112,Time_S%10+0x30);
	}
	
	switch(Tim_State)
	{
		case 1:
			sprintf((char *)LCD_Str,"       Standby   ");
			LCD_DisplayStringLine(Line5,LCD_Str);break;
		case 2:
			sprintf((char *)LCD_Str,"       Setting   ");
			LCD_DisplayStringLine(Line5,LCD_Str);break;
		case 3:
			sprintf((char *)LCD_Str,"       Running   ");
			LCD_DisplayStringLine(Line5,LCD_Str);break;
		case 4:
			sprintf((char *)LCD_Str,"       Pause     ");
			LCD_DisplayStringLine(Line5,LCD_Str);break;
	}
	sprintf((char *)LCD_Str,"    %d     ",set_time);
	LCD_DisplayStringLine(Line6,LCD_Str);;
	sprintf((char *)LCD_Str,"       Test:%d   ",Key_time);
	LCD_DisplayStringLine(Line7,LCD_Str);
}

2. 按键功能

void Key_Proc(void)
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)//B1
	{
		HAL_Delay(10);
		if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)&&(Key_busy==0))
		{
			Key_busy=1;
		}			
	}
	else if( (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)!=GPIO_PIN_RESET)&&(Key_busy==1))
	{
		time_save_add+=1;
		if(time_save_add==6)
		{
			time_save_add=1;
		}
		Read_Time_Proc();
		Save_temporary=1;
		Key_time_sign=0;
		Key_busy=0;
	}
	
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)//B2
	{
		HAL_Delay(10);
		if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)&&(Key_busy==0))
		{
			Key_time_sign=1;
			Key_busy=2;			
		}
	}
	else if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)!=GPIO_PIN_RESET)&&(Key_busy==2))
	{
		Key_time=0;
		if (Time_0_8_sign==1)//大于0.8
		{
			Tim_State=3;//启动
			Save_temporary=1;//储存标志
			Save_Time_Proc();//保存
			HAL_Delay(1);
		}
		else if (Time_0_8_sign==0)
		{
			Tim_State=2;//设置模式
			set_time+=1;
			if(set_time==4)
			{
				set_time=1;
			}
		}
		Time_0_8_sign=0;
		Key_time_sign=0;
		Key_busy=0;
	}
	
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)//B3
	{
		HAL_Delay(10);
		if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)&&(Key_busy==0))
		{
			Key3_time_sign=1;
			Key_busy=3;
		}
	}
	else if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)!=GPIO_PIN_RESET)&&(Key_busy==3) )
	{
		Key_time=0;
		Key3_time_sign=0;
		if(Time_0_8_sign==0)
		{
			if(set_time==1)
			{
				Time_H+=1;
			}
			else if(set_time==2)
			{
				Time_M+=1;
			}
			else if(set_time==3)
			{
				Time_S+=1;
			}
		}
		Key_busy=0;
	}
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)//B4
	{
		HAL_Delay(10);
		if((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)&&(Key_busy==0))
		{
			Key_time_sign=1;
			Key_busy=4;
		}
	}
	else if(((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)!=GPIO_PIN_RESET)&&(Key_busy==4)))
	{
		Key_time_sign=0;//停止计时标志位
		Key_time=0;
		if(Time_0_8_sign==1)//大于0.8
		{
			Tim_State=1;
			Time_0_8_sign=0;
		}
		else if(Time_0_8_sign==0)
		{
			Tim_State+=1;
			if( (Tim_State!=3)&&(Tim_State!=4) )
			{
				Tim_State=3;//运行
			}
			if(Tim_State==3)//运行
			{
				HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
				__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,800);
			}
			else if(Tim_State==4)//暂停
			{
				HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);
				LED=0x00;
			}
		}
		Key_busy=0;
	}
}

 3.  长按判断功能

//长短按键
if( (Key_busy==1)||(Key_busy==2)||(Key_busy==3)||(Key_busy==4) )
{
	Key_time++;
	if(Key_time>=8)
	{
		Time_0_8_sign=1;
	}
}		
if( (Key_busy==3)&&(Time_0_8_sign==1) )
{
	Add_key3_num++;
	if(Add_key3_num>=3)
	{
		if(set_time==1)
		{
			Time_H++;
		}
		else if(set_time==2)
		{
			Time_M+=1;
		}
		else if(set_time==3)
		{
			Time_S+=1;
		}
		Add_key3_num=0;
	}
}

总结

改变了按键的编写方式,让按键不会因为多个按键同时按下而产生误识别的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DDKevin19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值