定时器按键tim_key模版

低优先级放在高优先级内势必是程序卡死

 把高优先级放到低优先级内,会使程序卡死

可修改 

Debuger调试方法

 Pwm

 rcc

#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
void LED_Disp(uint8_t dsLED)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void setup()
{
	HAL_TIM_Base_Start_IT(&htim6);
	LED_Disp(0x00);//关掉所有LED
	
	LCD_Init();//LCD初始化
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
}

void loop()
{

	/*     LCD演示     */
	sprintf(text,"    number:%x  ",led_sta);
	LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	/*     按键操作演示     */
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)
		{
			led_sta=(led_sta&0xfe)|0x01;
			led_sta=(led_sta&0xfd)|0x00;
			LED_Disp(led_sta);			
		}
	}
	
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)
		{
			led_sta=(led_sta&0xfd)|0x02;
			led_sta=(led_sta&0xfe)|0x00;
			LED_Disp(led_sta);		
		}
	}	

}	

key_tim2

#include "key.h"




#ifndef _KEY_H_
#define _KEY_H_

#include "my_main.h"
struct Bkeys
{
	uint16_t age;
	uint8_t short_flag;
	uint8_t long_flag;
	uint8_t press;
	
	uint8_t double_ageEN;
	uint8_t double_age;
	uint8_t double_flag;
};
void key_serv(void);
void key_serv_long(void);
void key_serv_double(void);
#endif


struct Bkeys bkey[5]={0,0,0,0,0,0,0};

uint8_t key_read()
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;
	else return 0;
}

void key_serv()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age==2)bkey[key_sta].short_flag=1;
	}
	else
	{
		for(int i=0;i<5;i++) bkey[i].age=0;
	}
}
/*长按快速增加*/
//void key_serv_long()
//{
//	uint8_t key_sta=key_read();
//	if(key_sta!=0)
//	{
//		bkey[key_sta].age++;
//		if(bkey[key_sta].age>1)bkey[key_sta].press=1;
//	}
//	else
//	{
//		for(int i=0;i<5;i++) 
//		{
//			if(bkey[i].press==1&&bkey[i].long_flag==0)
//				bkey[i].short_flag=1;
//			
//			bkey[i].press=0;
//			bkey[i].age=0;
//			bkey[i].long_flag=0;
//		}
//	}
//	if(bkey[key_sta].age>69)bkey[key_sta].long_flag=1;
//}
/*长按后抬起执行*/
void key_serv_long()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1)bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].age>69)bkey[i].long_flag=1;
			if(bkey[i].press==1&&bkey[i].long_flag==0)
				bkey[i].short_flag=1;
			
			bkey[i].press=0;
			bkey[i].age=0;
		}
	}
}
/*融合按键双击*/
void key_serv_double()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1)bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].double_ageEN==1&&bkey[i].press==1)
			{
				bkey[i].double_flag=1;
				bkey[i].press=0;
				bkey[i].double_ageEN=0;				
			}
			if(bkey[i].press==1&&bkey[i].long_flag==0)bkey[i].double_ageEN=1;
			if(bkey[i].double_ageEN==1)bkey[i].double_age++;
			if(bkey[i].double_ageEN==1&&bkey[i].double_age>20)
			{
				bkey[i].short_flag=1;
				bkey[i].double_age=0;
				bkey[i].double_ageEN=0;
			}
			bkey[i].press=0;
			bkey[i].age=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69)bkey[key_sta].long_flag=1;
}

//PWM模版

/-----------------------------------------key------------------------------------------------------/

#include "key.h"

struct Bkeys bkey[5]={0,0,0,0};

uint8_t key_read()
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;
	else return 0;
}


void key_serv()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1)bkey[key_sta].short_flag=1;
	}
	else
	{
		for(int i=0;i<5;i++) bkey[i].age=0;
	}
}
/*长按快速增加功能*/
void key_serv_long()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].press==1&&bkey[i].long_flag==0)
				bkey[i].short_flag=1;
			bkey[i].age=0;
			bkey[i].press=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
/*长按后抬起执行*/
//void key_serv_long()
//{
//	uint8_t key_sta=key_read();
//	if(key_sta!=0)
//	{
//		bkey[key_sta].age++;
//		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
//	}
//	else
//	{
//		for(int i=0;i<5;i++) 
//		{
//			if(bkey[i].age>69) bkey[i].long_flag=1;
//			if(bkey[i].press==1&&bkey[i].long_flag==0)
//				bkey[i].short_flag=1;
//			bkey[i].age=0;
//			bkey[i].press=0;
//		}
//	}
//}

void key_serv_double()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].double_ageEN==1&&bkey[i].press==1)
			{
				bkey[i].double_flag=1;
				bkey[i].double_ageEN=0;
				bkey[i].press=0;
			}
			if(bkey[i].press&&bkey[i].long_flag==0)
			{
				bkey[i].double_ageEN=1;
			}
			if(bkey[i].double_ageEN==1)bkey[i].double_age++;
			if(bkey[i].double_ageEN==1&&bkey[i].double_age>20)
			{
				bkey[i].short_flag=1;
				bkey[i].double_ageEN=0;
				bkey[i].double_age=0;
			}
			bkey[i].age=0;
			bkey[i].press=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];

void LED_Disp(uint8_t dsLED)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void setup()
{
	HAL_TIM_Base_Start_IT(&htim6);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	LED_Disp(0x00);//关掉所有LED
	
	LCD_Init();//LCD初始化
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
}

void loop()
{
	static uint16_t temp=0;
	if(bkey[1].short_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 down!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		
		__HAL_TIM_SET_AUTORELOAD(&htim2,250-1);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,125);
		bkey[1].short_flag=0;
	}		
	if(bkey[2].short_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_2 down!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		bkey[2].short_flag=0;
	}		
	/*长按快速增加功能*/
	if(bkey[1].long_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 long!,%d  ",temp++);
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
	}	
	if(bkey[1].double_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 double!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		bkey[1].double_flag=0;
	}	
	/*长按后抬起执行*/
//	if(bkey[1].long_flag==1)
//	{
//	/*     LCD演示     */
//		sprintf(text,"    KEY_1 long!     ");
//		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
//		bkey[1].long_flag=0;
//	}	
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM6)
		key_serv_double();
}	

TIM_CAP+systick

/---------------------------key----------------------------------/

#include "key.h"

struct Bkeys bkey[5]={0,0,0,0};

uint8_t key_read()
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;
	else return 0;
}


void key_serv()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1)bkey[key_sta].short_flag=1;
	}
	else
	{
		for(int i=0;i<5;i++) bkey[i].age=0;
	}
}
/*长按快速增加功能*/
void key_serv_long()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].press==1&&bkey[i].long_flag==0)
				bkey[i].short_flag=1;
			bkey[i].age=0;
			bkey[i].press=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
/*长按后抬起执行*/
//void key_serv_long()
//{
//	uint8_t key_sta=key_read();
//	if(key_sta!=0)
//	{
//		bkey[key_sta].age++;
//		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
//	}
//	else
//	{
//		for(int i=0;i<5;i++) 
//		{
//			if(bkey[i].age>69) bkey[i].long_flag=1;
//			if(bkey[i].press==1&&bkey[i].long_flag==0)
//				bkey[i].short_flag=1;
//			bkey[i].age=0;
//			bkey[i].press=0;
//		}
//	}
//}

void key_serv_double()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].double_ageEN==1&&bkey[i].press==1)
			{
				bkey[i].double_flag=1;
				bkey[i].double_ageEN=0;
				bkey[i].press=0;
			}
			if(bkey[i].press&&bkey[i].long_flag==0)
			{
				bkey[i].double_ageEN=1;
			}
			if(bkey[i].double_ageEN==1)bkey[i].double_age++;
			if(bkey[i].double_ageEN==1&&bkey[i].double_age>20)
			{
				bkey[i].short_flag=1;
				bkey[i].double_ageEN=0;
				bkey[i].double_age=0;
			}
			bkey[i].age=0;
			bkey[i].press=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];
uint32_t time500ms;

void LED_Disp(uint8_t dsLED)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void LED_Chg(uint8_t num,uint8_t sta)
{
	uint8_t pos=0x01<<(num-1);
	led_sta=(led_sta&(~pos))|(pos*sta);
	LED_Disp(led_sta);
}
void setup()
{
	HAL_TIM_Base_Start_IT(&htim6);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	//TIM15_CH1输入演示
	HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_1);
	HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_2);
	//TIM3_CH2输入演示
	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);
	
	LED_Disp(0x00);//关掉所有LED
	
	LCD_Init();//LCD初始化
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	
	time500ms=uwTick;
}

void loop()
{
	static uint16_t temp=0;
	
	float frq1,frq2=0;
	float duty1,duty2=0;
	frq1=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);
	duty1=((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1)));
	sprintf(text,"FRQ:%.2fHz   ",frq1);
	LCD_DisplayStringLine(Line1,(uint8_t *)text);//局部刷新	
	sprintf(text,"DUTY:%.2f%%   ",duty1);
	LCD_DisplayStringLine(Line2,(uint8_t *)text);//局部刷新	
	
	frq2=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1);
	duty2=((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1)));
	sprintf(text,"FRQ2:%.2fHz   ",frq2);
	LCD_DisplayStringLine(Line3,(uint8_t *)text);//局部刷新	
	sprintf(text,"DUTY2:%.2f%%   ",duty2);
	LCD_DisplayStringLine(Line4,(uint8_t *)text);//局部刷新		
	
	if(uwTick-time500ms>500)
	{
		static uint8_t LED_sta=0;
		LED_Chg(2,LED_sta);
		LED_sta=!LED_sta;
		time500ms=uwTick;
	}
	
	if(bkey[1].short_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 down!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		
		__HAL_TIM_SET_AUTORELOAD(&htim2,250-1);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,125);
		bkey[1].short_flag=0;
	}		
	if(bkey[2].short_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_2 down!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		bkey[2].short_flag=0;
	}		
	/*长按快速增加功能*/
	if(bkey[1].long_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 long!,%d  ",temp++);
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
	}	
	if(bkey[1].double_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 double!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		bkey[1].double_flag=0;
	}	
	/*长按后抬起执行*/
//	if(bkey[1].long_flag==1)
//	{
//	/*     LCD演示     */
//		sprintf(text,"    KEY_1 long!     ");
//		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
//		bkey[1].long_flag=0;
//	}	
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM6)
		key_serv_double();
}	

RTC实验

#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];

void LED_Disp(uint8_t dsLED)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void setup()
{
	HAL_TIM_Base_Start_IT(&htim6);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	//TIM15_CH1输入演示
	HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_1);
	HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_2);
	//TIM3_CH2输入演示
	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);
	
	LED_Disp(0x00);//关掉所有LED
	
	LCD_Init();//LCD初始化
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
}

void loop()
{
	static uint16_t temp=0;
	
	float frq1,frq2=0;
	float duty1,duty2=0;
	RTC_TimeTypeDef time;
	RTC_DateTypeDef date;
	HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);
	sprintf(text,"time:%d:%d:%d      ",time.Hours,time.Minutes,time.Seconds);
	LCD_DisplayStringLine(Line9,(uint8_t *)text);//局部刷新			
	
	frq1=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);
	duty1=((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1)));
	sprintf(text,"FRQ:%.2fHz   ",frq1);
	LCD_DisplayStringLine(Line1,(uint8_t *)text);//局部刷新	
	sprintf(text,"DUTY:%.2f%%   ",duty1);
	LCD_DisplayStringLine(Line2,(uint8_t *)text);//局部刷新	
	
	frq2=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1);
	duty2=((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1)));
	sprintf(text,"FRQ2:%.2fHz   ",frq2);
	LCD_DisplayStringLine(Line3,(uint8_t *)text);//局部刷新	
	sprintf(text,"DUTY2:%.2f%%   ",duty2);
	LCD_DisplayStringLine(Line4,(uint8_t *)text);//局部刷新		
	
	
	
	if(bkey[1].short_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 down!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		
		__HAL_TIM_SET_AUTORELOAD(&htim2,250-1);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,125);
		bkey[1].short_flag=0;
	}		
	if(bkey[2].short_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_2 down!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		bkey[2].short_flag=0;
	}		
	/*长按快速增加功能*/
	if(bkey[1].long_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 long!,%d  ",temp++);
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
	}	
	if(bkey[1].double_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 double!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		bkey[1].double_flag=0;
	}	
	/*长按后抬起执行*/
//	if(bkey[1].long_flag==1)
//	{
//	/*     LCD演示     */
//		sprintf(text,"    KEY_1 long!     ");
//		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
//		bkey[1].long_flag=0;
//	}	
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM6)
		key_serv_double();
}	

key

#include "key.h"

struct Bkeys bkey[5]={0,0,0,0};

uint8_t key_read()
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;
	else return 0;
}


void key_serv()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1)bkey[key_sta].short_flag=1;
	}
	else
	{
		for(int i=0;i<5;i++) bkey[i].age=0;
	}
}
/*长按快速增加功能*/
void key_serv_long()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].press==1&&bkey[i].long_flag==0)
				bkey[i].short_flag=1;
			bkey[i].age=0;
			bkey[i].press=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
/*长按后抬起执行*/
//void key_serv_long()
//{
//	uint8_t key_sta=key_read();
//	if(key_sta!=0)
//	{
//		bkey[key_sta].age++;
//		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
//	}
//	else
//	{
//		for(int i=0;i<5;i++) 
//		{
//			if(bkey[i].age>69) bkey[i].long_flag=1;
//			if(bkey[i].press==1&&bkey[i].long_flag==0)
//				bkey[i].short_flag=1;
//			bkey[i].age=0;
//			bkey[i].press=0;
//		}
//	}
//}

void key_serv_double()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].double_ageEN==1&&bkey[i].press==1)
			{
				bkey[i].double_flag=1;
				bkey[i].double_ageEN=0;
				bkey[i].press=0;
			}
			if(bkey[i].press&&bkey[i].long_flag==0)
			{
				bkey[i].double_ageEN=1;
			}
			if(bkey[i].double_ageEN==1)bkey[i].double_age++;
			if(bkey[i].double_ageEN==1&&bkey[i].double_age>20)
			{
				bkey[i].short_flag=1;
				bkey[i].double_ageEN=0;
				bkey[i].double_age=0;
			}
			bkey[i].age=0;
			bkey[i].press=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}

 

adc相关配置及代码

#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];

void LED_Disp(uint8_t dsLED)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
float adc_read(ADC_HandleTypeDef *hadc)
{
	uint16_t adc_val;
	float adc_f;
	HAL_ADC_Start(hadc);
	adc_val=HAL_ADC_GetValue(hadc);
	adc_f=adc_val*3.3f/4096.0f;
	return adc_f;
}
float adc_read_os(ADC_HandleTypeDef *hadc)
{
	uint16_t adc_val;
	float adc_f;
	HAL_ADC_Start(hadc);
	adc_val=HAL_ADC_GetValue(hadc);
	adc_f=adc_val*3.3f/65536.0f;
	return adc_f;
}
void setup()
{
	HAL_TIM_Base_Start_IT(&htim6);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	//TIM15_CH1输入演示
	HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_1);
	HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_2);
	//TIM3_CH2输入演示
	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);
	
	HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);
	LED_Disp(0x00);//关掉所有LED
	
	LCD_Init();//LCD初始化
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
}

void loop()
{
	static uint16_t temp=0;
	float frq1,frq2=0;
	float duty1,duty2=0;
	float adc_data_PB15;
	RTC_TimeTypeDef time;
	RTC_DateTypeDef date;
	HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);
	sprintf(text,"time:%d:%d:%d      ",time.Hours,time.Minutes,time.Seconds);
	LCD_DisplayStringLine(Line9,(uint8_t *)text);//局部刷新	
	
	frq1=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);
	duty1=((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1)));
	sprintf(text,"FRQ:%.2fHz   ",frq1);
	LCD_DisplayStringLine(Line1,(uint8_t *)text);//局部刷新	
	sprintf(text,"DUTY:%.2f%%   ",duty1);
	LCD_DisplayStringLine(Line2,(uint8_t *)text);//局部刷新	
	
	frq2=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1);
	duty2=((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1)));
	sprintf(text,"FRQ2:%.2fHz   ",frq2);
	LCD_DisplayStringLine(Line3,(uint8_t *)text);//局部刷新	
	sprintf(text,"DUTY2:%.2f%%   ",duty2);
	LCD_DisplayStringLine(Line4,(uint8_t *)text);//局部刷新		
	
	adc_data_PB15=adc_read_os(&hadc2);
	sprintf(text,"PB15:%.4fV   ",adc_data_PB15);
	LCD_DisplayStringLine(Line5,(uint8_t *)text);//局部刷新	
	
	if(bkey[1].short_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 down!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		
		__HAL_TIM_SET_AUTORELOAD(&htim2,250-1);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,125);
		bkey[1].short_flag=0;
	}		
	if(bkey[2].short_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_2 down!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		bkey[2].short_flag=0;
	}		
	/*长按快速增加功能*/
	if(bkey[1].long_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 long!,%d  ",temp++);
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
	}	
	if(bkey[1].double_flag==1)
	{
	/*     LCD演示     */
		sprintf(text,"    KEY_1 double!     ");
		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
		bkey[1].double_flag=0;
	}	
	/*长按后抬起执行*/
//	if(bkey[1].long_flag==1)
//	{
//	/*     LCD演示     */
//		sprintf(text,"    KEY_1 long!     ");
//		LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新	
//		bkey[1].long_flag=0;
//	}	
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM6)
		key_serv_double();
}	

key

#include "key.h"


#ifndef _KEY_H_
#define _KEY_H_

#include "my_main.h"
struct Bkeys
{
	uint16_t age;
	uint8_t short_flag;
	uint8_t press;
	uint8_t long_flag;
	
	uint8_t double_ageEN;
	uint8_t double_age;
	uint8_t double_flag;
};
void key_serv(void);
void key_serv_long(void);
void key_serv_double(void);
#endif


struct Bkeys bkey[5]={0,0,0,0};

uint8_t key_read()
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;
	else return 0;
}


void key_serv()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1)bkey[key_sta].short_flag=1;
	}
	else
	{
		for(int i=0;i<5;i++) bkey[i].age=0;
	}
}
/*长按快速增加功能*/
void key_serv_long()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].press==1&&bkey[i].long_flag==0)
				bkey[i].short_flag=1;
			bkey[i].age=0;
			bkey[i].press=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
/*长按后抬起执行*/
//void key_serv_long()
//{
//	uint8_t key_sta=key_read();
//	if(key_sta!=0)
//	{
//		bkey[key_sta].age++;
//		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
//	}
//	else
//	{
//		for(int i=0;i<5;i++) 
//		{
//			if(bkey[i].age>69) bkey[i].long_flag=1;
//			if(bkey[i].press==1&&bkey[i].long_flag==0)
//				bkey[i].short_flag=1;
//			bkey[i].age=0;
//			bkey[i].press=0;
//		}
//	}
//}

void key_serv_double()
{
	uint8_t key_sta=key_read();
	if(key_sta!=0)
	{
		bkey[key_sta].age++;
		if(bkey[key_sta].age>1) bkey[key_sta].press=1;
	}
	else
	{
		for(int i=0;i<5;i++) 
		{
			if(bkey[i].double_ageEN==1&&bkey[i].press==1)
			{
				bkey[i].double_flag=1;
				bkey[i].double_ageEN=0;
				bkey[i].press=0;
			}
			if(bkey[i].press&&bkey[i].long_flag==0)
			{
				bkey[i].double_ageEN=1;
			}
			if(bkey[i].double_ageEN==1)bkey[i].double_age++;
			if(bkey[i].double_ageEN==1&&bkey[i].double_age>20)
			{
				bkey[i].short_flag=1;
				bkey[i].double_ageEN=0;
				bkey[i].double_age=0;
			}
			bkey[i].age=0;
			bkey[i].press=0;
			bkey[i].long_flag=0;
		}
	}
	if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacOS 如何解决无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件

背景 在安装软件时&#xff0c;遇到“无法打开 ‘xxx’&#xff0c;因为 Apple 无法检查其是否包含恶意软件” 的提示&#xff0c;许多用户可能会感到困惑&#xff0c;不知道该如何处理。遇到这个问题时&#xff0c;按以下步骤操作即可解决。 首先&#xff0c;这个警告提示的出…

数据结构与算法学习笔记----求组合数

数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题&#xff0c;因为数据范围的不同要用不同的方法进行求解&#xff0c;涉及了很多之前的东西快速幂&#xff0c;逆元&#xff0c;质数&#xff0c;高精度等…

柔性数组与c/c++程序中内存区域的划分

1.柔性数组 1.1柔性数组的定义 柔性数组是指在结构体中定义的&#xff0c;其大小在编译时未确定&#xff0c;而在运行时动态分配的数组。这种数组允许结构体的大小根据需要动态变化。语法如下&#xff1a; struct D {int a;int arry1[0]; };struct F {int a;int arry2[]; };…

Vivado生成X1或X4位宽mcs文件并固化到flash

1.生成mcs文件 01.在vivado里的菜单栏选择"tools"工具栏 02.在"tools"里选择"生成内存配置文件" 03.配置参数 按照FPGA板上的flash型号进行选型&#xff0c;相关配置步骤可参考下图。 注意&#xff1a;Flash数据传输位宽如果需要选择X4位宽&am…

云原生:构建现代化应用的基石

一、什么是云原生&#xff1f; 云原生是一种构建和运行应用程序的方法&#xff0c;旨在充分利用云计算的分布式系统优势&#xff0c;例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点&#xff0c;能够更好地适应云平台的动态变化&…

力扣动态规划-12【算法学习day.106】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…

day7手机拍照装备

对焦对不上&#xff1a;1、光太暗&#xff1b;2、离太近&#xff1b;3、颜色太单一没有区分点 滤镜可以后期P 渐变灰滤镜&#xff1a;均衡色彩&#xff0c;暗的地方亮一些&#xff0c;亮的地方暗一些 中灰滤镜&#xff1a;减少光差 手机支架&#xff1a;最基本70cm即可 手…

解锁微服务:五大进阶业务场景深度剖析

目录 医疗行业&#xff1a;智能诊疗的加速引擎 电商领域&#xff1a;数据依赖的破局之道 金融行业&#xff1a;运维可观测性的提升之路 物流行业&#xff1a;智慧物流的创新架构 综合业务&#xff1a;服务依赖的优化策略 医疗行业&#xff1a;智能诊疗的加速引擎 在医疗行业迈…

LosslessScaling-学习版[steam价值30元的游戏无损放大/补帧工具]

LosslessScaling 链接&#xff1a;https://pan.xunlei.com/s/VOHc-yZBgwBOoqtdZAv114ZTA1?pwdxiih# 解压后运行"A-绿化-解压后运行我.cmd"

51单片机开发:点阵屏显示数字

实验目标&#xff1a;在8x8的点阵屏上显示数字0。 点阵屏的原理图如下图所示&#xff0c;点阵屏的列接在P0端口&#xff0c;行接在74HC595扩展的DP端口上。 扩展口的使用详见&#xff1a;51单片机开发&#xff1a;IO扩展(串转并)实验-CSDN博客 要让点阵屏显示数字&#xff0…

ESP32-CAM实验集(WebServer)

WebServer 效果图 已连接 web端 platformio.ini ; PlatformIO Project Configuration File ; ; Build options: build flags, source filter ; Upload options: custom upload port, speed and extra flags ; Library options: dependencies, extra library stor…

代码随想录算法【Day34】

Day34 62.不同路径 思路 第一种&#xff1a;深搜 -> 超时 第二种&#xff1a;动态规划 第三种&#xff1a;数论 动态规划代码如下&#xff1a; class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n,…

WGCLOUD运维工具从入门到精通 - 如何设置主题背景

需要升级到WGCLOUD的v3.5.7或者以上版本&#xff0c;才会支持自定义设置主题背景色 WGCLOUD下载&#xff1a;www.wgstart.com 我们登录后&#xff0c;在右上角点击如下的小图标&#xff0c;就可以设置主题背景色了&#xff0c;包括&#xff1a;经典白&#xff08;默认&#x…

【shell工具】编写一个批量扫描IP地址的shell脚本

批量扫描某个网段中的主机&#xff08;并发&#xff09; 创建目录编写脚本文件 mkdir /root/ip_scan_shell/ touch /root/ip_scan_shell/online_server.txt touch /root/ip_scan_shell/offline_server.txt touch /root/ip_scan_shell/ip_scan.sh写入下面shell到脚本文件中…

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…

搭建 docxify 静态博客教程

首先&#xff0c;安装 node 环境安装 docxify &#xff0c;参考官网&#xff1a;https://docsify.js.org/#/zh-cn/ npm i docsify-cli -g新建docs文件夹专门用来放文章&#xff0c;初始化命令 docsify init ./docs就会生成如下两个文件&#xff0c;index.html 入口文件&#…

TiDB 常用命令

TiDB 常用命令 TiDB 是一款开源分布式数据库&#xff0c;在大数据、高并发场景下表现出色。作为开发者或数据库管理员&#xff0c;熟练掌握 TiDB 的常用命令&#xff0c;对于日常操作和维护非常重要。今天就来简单总结一下 TiDB 的常用命令&#xff0c;帮你提高工作效率。 1. …

【四川乡镇界面】图层shp格式arcgis数据乡镇名称和编码2020年wgs84无偏移内容测评

本文将详细解析标题和描述中提到的IT知识点&#xff0c;主要涉及GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;技术&#xff0c;以及与之相关的文件格式和坐标系统。 我们要了解的是"shp"格式&#xff0c;这是一种广泛用于存储…

MAX98357A一款数字脉冲编码调制(PCM)输入D类音频功率放大器

MAX98357A是一款数字脉冲编码调制&#xff08;PCM&#xff09;输入D类音频功率放大器&#xff0c;以下是对其的详细介绍&#xff1a; 一、主要特性 音频性能&#xff1a; 提供D类效率与AB类音频性能。支持高达3.2W&#xff08;4Ω负载&#xff0c;5V供电&#xff09;的输出功率…

MiniHack:为强化学习研究提供丰富而复杂的环境

人工智能咨询培训老师叶梓 转载标明出处 想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具&#xff08;限时免费&#xff09;。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Facto…