当前位置: 首页 > article >正文

定时器按键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;
}


http://www.kler.cn/a/521377.html

相关文章:

  • SQL Server查询计划操作符(7.3)——查询计划相关操作符(5)
  • 类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件
  • Spring Security 应用详解
  • LAPD协议
  • spark运行流程
  • Linux:文件与fd(被打开的文件)
  • DeepSeek-R1,用Ollama跑起来
  • 【25考研】人大计算机考研复试该怎么准备?有哪些注意事项?
  • HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码
  • Effective C++ 规则51:编写 new 和 delete 时需固守常规
  • pytorch深度学习模型推理和部署、pytorchONNXtensorRT模型转换以及python和C++版本部署
  • [MILP] Logical Constraints 0-1 (Note1)
  • 人力资源管理HR系统的需求设计和实现
  • 智慧消防营区一体化安全管控 2024 年度深度剖析与展望
  • 高频 SQL 50 题(基础版)_620. 有趣的电影
  • 作业day3
  • Day43:列表元素的统计
  • c++ list
  • 一次端口监听正常,tcpdump无法监听到指定端口报文问题分析
  • 以用户为中心,优化 B 端界面设计