第九届 蓝桥杯 嵌入式设计与开发项目 省赛

赛题

请添加图片描述
请添加图片描述

部分程序

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
	m24c02_init();
	LED_init();
	KEY_init();
	LCD_Init();	//LCD初始化
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		KEY_function();
		LED_function();
		PWM_function();
		LCD_function();	
  }
  /* USER CODE END 3 */

void LCD_function(void)
{
	u8 a;
	if(get_time_task(TASK_TIMES.LCD_TIME)==0)
	{
		TASK_TIMES.LCD_TIME=get_time()+LCD_time;
		
		LCD_Line2_buf[5]=flag_storage+1+48;			//存储位
		if((timer_statr==1)||(timer_statr==2))	{a=6;}	//在启动或暂停状态下,显示倒计时时间
		else if(timer_statr==3) 								{a=5;}	//在设置状态下,显示设置时间
		else 								 										{a=flag_storage;}	//在停止状态下,显示当前存储位时间
		LCD_Line4_buf[6]=storage_buf[a][0]/10+48; LCD_Line4_buf[7]=storage_buf[a][0]%10+48;
		LCD_Line4_buf[9]=storage_buf[a][1]/10+48; LCD_Line4_buf[10]=storage_buf[a][1]%10+48;
		LCD_Line4_buf[12]=storage_buf[a][2]/10+48;LCD_Line4_buf[13]=storage_buf[a][2]%10+48;
		
		if(timer_statr==3)	//在设置状态下,被选中的时间高亮
		{
			if(flag_set_time==0) {LCD_SetTextColor(Red);LCD_DisplayStringLine2(Line4,LCD_Line4_buf+6,6,2);LCD_SetTextColor(White);}
			else 								 {LCD_DisplayStringLine2(Line4,LCD_Line4_buf+6,6,2);}
			if(flag_set_time==1) {LCD_SetTextColor(Red);LCD_DisplayStringLine2(Line4,LCD_Line4_buf+9,9,2);LCD_SetTextColor(White);}
			else 								 {LCD_DisplayStringLine2(Line4,LCD_Line4_buf+9,9,2);}
			if(flag_set_time==2) {LCD_SetTextColor(Red);LCD_DisplayStringLine2(Line4,LCD_Line4_buf+12,12,2);LCD_SetTextColor(White);}
			else 								 {LCD_DisplayStringLine2(Line4,LCD_Line4_buf+12,12,2);}			
		}
		else { LCD_DisplayStringLine(Line4,LCD_Line4_buf); }					//其他状态正常显示
		LCD_DisplayStringLine(Line2,LCD_Line2_buf);										//刷新LCD第2行
		LCD_DisplayStringLine(Line6,&LCD_Line6_buf[timer_statr][0]);	//刷新LCD第6行
	}
}

void PWM_function(void)
{
	static u8 flag=0xff;
	
	if(timer_statr!=flag)	//定时器状态发送改变
	{
		if(timer_statr==1)	{ HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); }	//启动
		else								{ HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1); }		//停止
	}
	flag=timer_statr;			
}

按键扫描(长短按)


u8 KEY_scan(void)
{
	u8 val=0;
	u8 key=0;	//第7位为长短按标志位 
	static u8 falg_down_up=0;
	static u8 key_val;
	static u32 key_down_time=0;
	
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET) 		 val=1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET) val=2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==RESET) val=3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==RESET) val=4;
	else 																							 val=0;
	
	if((val!=0))
	{
		if(falg_down_up==0)	//刚按下
		{
			key_down_time=sys_time;
			falg_down_up=1;	
			key_val=val;			
		}
		else if(falg_down_up==1)	//等待按下时间超过0.8秒
		{
			if((sys_time-key_down_time)>800)	//第一次超过0.8秒,此次为长按
			{
				falg_down_up=2;
				key=key_val;
				key|=0x80;
			}
		}
		else if(falg_down_up==2)	//等待长按松开
		{
				key=key_val;
				key|=0x80;		
		}
	}
	else if(val==0)	//按键松开
	{
		if(falg_down_up==1)	//上个状态为按下,时间小于0.8秒,此次状态为短按
		{
			falg_down_up=0;
			key=key_val;
		}
		else if(falg_down_up==2)	//长按松开
		{
			falg_down_up=0;
			key=0;
		}
	}

	return key;
}

按键功能


void KEY_handle(u8 key)
{
	static u8 key_time=0;
	if(key&0x80)	//长按功能
	{
		key&=0x7f;	//长按标志位清零
		if(key==1)
		{
			;
		}
		else if(key==2)	//临时存储到当前存储位,退出设置状态
		{
			if(timer_statr==3)	//在设置状态
			{
				storage_buf[flag_storage][0]=storage_buf[5][0];	//临时存储位赋值给当前存储
				storage_buf[flag_storage][1]=storage_buf[5][1];
				storage_buf[flag_storage][2]=storage_buf[5][2];
				X24c02_buf[1+flag_storage*3+0]=storage_buf[flag_storage][0];
				X24c02_buf[1+flag_storage*3+1]=storage_buf[flag_storage][1];
				X24c02_buf[1+flag_storage*3+2]=storage_buf[flag_storage][2];
				m24c02_write(X24c02_buf+1+flag_storage*3,DATA_ARR+1+flag_storage*3,3);	//保存到EEPROM
				timer_statr=0;	//退出设置状态
			}
		}
		else if(key==3)			//时间快速递增
		{
			if(++key_time>=5)
			{
				key_time=0;
				if(flag_set_time==0) {if(++storage_buf[5][flag_set_time]>23) {storage_buf[5][flag_set_time]=0;}}
				else								 {if(++storage_buf[5][flag_set_time]>59) {storage_buf[5][flag_set_time]=0;}}				
			}
		}	
		else if(key==4)	//定时器返回停止状态
		{
			if(timer_statr!=3) {timer_statr=0;}	//在设置状态该功能无效
		}			
	}
	else 					//短按功能
	{	
		if(key==1)	//切换存储位置
		{
			if(++flag_storage==5) {flag_storage=0;}	
			LCD_Line4_buf[6]=storage_buf[flag_storage][0]/10+48;	LCD_Line4_buf[7]=storage_buf[flag_storage][0]%10+48;
			LCD_Line4_buf[9]=storage_buf[flag_storage][1]/10+48;	LCD_Line4_buf[10]=storage_buf[flag_storage][1]%10+48;
			LCD_Line4_buf[12]=storage_buf[flag_storage][2]/10+48;	LCD_Line4_buf[13]=storage_buf[flag_storage][2]%10+48;
		}
		else if(key==2)	//切换时间设置和存储键
		{	
			if(timer_statr!=3) 	//未在设置状态,切换到设置状态
			{
				timer_statr=3;flag_set_time=0;
				storage_buf[5][0]=storage_buf[flag_storage][0];	//当前存储位赋值给临时存储
				storage_buf[5][1]=storage_buf[flag_storage][1];
				storage_buf[5][2]=storage_buf[flag_storage][2];
			}	
			else if(timer_statr==3)	//在设置状态
			{
				if(++flag_set_time==3) {flag_set_time=0;}	//切换时分秒设置
			}
		}
		else if(key==3)	//时间加1
		{
			if(flag_set_time==0) {if(++storage_buf[5][flag_set_time]>23) {storage_buf[5][flag_set_time]=0;}}
			else								 {if(++storage_buf[5][flag_set_time]>59) {storage_buf[5][flag_set_time]=0;}}
		}	
		else if(key==4)	//定时器启动键
		{
			if(timer_statr==1) {timer_statr=2;}	//启动状态切换为暂停状态
			else 		//其他状态切换启动状态	
			{
				if(timer_statr==0)	//停止切换为启动
				{
					storage_buf[6][0]=storage_buf[flag_storage][0];
					storage_buf[6][1]=storage_buf[flag_storage][1];
					storage_buf[6][2]=storage_buf[flag_storage][2];				
				}
				else if(timer_statr==2)	//暂停状态切换为启动状态 							 
				{			
					;	
				}	
				else if(timer_statr==3)	 //设置状态切换为启动状态
				{
					storage_buf[6][0]=storage_buf[5][0];
					storage_buf[6][1]=storage_buf[5][1];
					storage_buf[6][2]=storage_buf[5][2];					
				}	
				if((storage_buf[6][0]!=0)||(storage_buf[6][1]!=0)||(storage_buf[6][2]!=0))	//时间不为0方可启动
				{timer_statr=1;}				
			}
		}		
	}
}

void KEY_function(void)
{
	u8 key;
	if(get_time_task(TASK_TIMES.KEY_TIME)==0)
	{
		TASK_TIMES.KEY_TIME=get_time()+KEY_time;
		key=KEY_scan();		//扫描按键
		KEY_handle(key);	//按键功能		
	}
}

完整程序下载

下载链接:
链接:https://pan.baidu.com/s/1LMECSy3GuABduu42YUJdSQ
提取码:qy2o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值