定时器按键tim_key模版

news2025/1/27 8:44:56

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

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

可修改 

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.coloradmin.cn/o/2283860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Swing使用MVC模型架构

什么是MVC模式? MVC是一组英文的缩写,其全名是Model-View-Controller,也就是“模型-视图-控制器”这三个部分组成。这三个部分任意一个部分发生变化都会引起另外两个发生变化。三者之间的关系示意图如下所示: MVC分为三个部分,所以在MVC模型中将按照此三部分分成三…

ui-automator定位官网文档下载及使用

一、ui-automator定位官网文档简介及下载 AndroidUiAutomator&#xff1a;移动端特有的定位方式&#xff0c;uiautomator是java实现的&#xff0c;定位类型必须写成java类型 官方地址&#xff1a;https://developer.android.com/training/testing/ui-automator.html#ui-autom…

gitee——报错修改本地密码

有时候当我们向远端push本地的仓库时会有一些报错的行为。 如下&#xff1a; 这是因为我们在gitee修改了密码时&#xff0c;本地还没有更新提交&#xff0c;总是报错 解决修改密码报错 如下&#xff1a; 1.在本地点击搜索栏找到控制面板 步骤如下

小盒科技携手体验家,优化智能教育服务体验,打造在线教育新高度

北京小盒科技有限公司&#xff08;简称“小盒科技”&#xff0c;由“作业盒子”更名而来&#xff09;是一家专注于教育科技的公司&#xff0c;致力于利用人工智能、大数据等先进技术&#xff0c;为中小学教育提供创新的解决方案和产品。 近日&#xff0c;「小盒科技」携手体…

Docker Hub 全面解析及应对策略

在现代 DevOps 和容器化应用开发中&#xff0c;Docker Hub 是一个不可或缺的工具。然而&#xff0c;一些地区或企业对 Docker Hub 的访问受到限制&#xff0c;甚至全面禁止。这种现象引发了开发者和运维人员的广泛关注。那么&#xff0c;为什么 Docker Hub 会被禁用&#xff1f…

分布式理解

分布式 如何理解分布式 狭义的分布是指&#xff0c;指多台PC在地理位置上分布在不同的地方。 分布式系统 分布式系**统&#xff1a;**多个能独立运行的计算机&#xff08;称为结点&#xff09;组成。各个结点利用计算机网络进行信息传递&#xff0c;从而实现共同的“目标或者任…

macOS使用LLVM官方发布的tar.xz来安装Clang编译器

之前笔者写过一篇博文ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器介绍了Ubuntu下使用官方发布的tar.xz包来安装Clang编译。官方发布的版本中也有MacOS版本的tar.xz&#xff0c;那MacOS应该也是可以安装的。 笔者2015款MBP笔记本&#xff0c;CPU是intel的&#xff0c;出厂…

ppp综合实验

IP地址 r1 r2 r3 r4 hdlc封装 pap认证 r2 r3 chap认证 r2 r4 MGRE 主认证 [r1]int Tunnel 0/0/0 [r1-Tunnel0/0/0]ip add 192.168.4.1 24 [r1-Tunnel0/0/0]tunnel-protocol gre p2mp [r1-Tunnel0/0/0]source 12.1.1.1 [r1-Tunnel0/0/0]nhrp entry multicast dynamic [r1-Tu…

HBuilderX构建Vue项目

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl HBuilderX概述 HBuilderX是一款专为开发者设计的高效开发工具&#xff0c;致力于提升开发者的编码效率和体验。HBuilderX既适合追求极致效率的极客&#xff0c;也适合希望简…

基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent

作者&#xff1a;来自 Elastic Nima Rezainia Confluent Cloud 用户现在可以使用更新后的 Elasticsearch Sink Connector 与 Elastic Agent 和 Elastic Integrations 来实现完全托管且高度可扩展的数据提取架构。 Elastic 和 Confluent 是关键的技术合作伙伴&#xff0c;我们很…

JDK17 HashMap

HashMap ArrayList用动态数组存放元素&#xff0c;而HashMap用动态数组&#xff08;桶&#xff09;存储键值对。 如果两个键值对映射到桶同一个索引&#xff0c;则称为散列冲突。HashMap采用拉链法解决冲突&#xff0c;即桶中每个索引指向一个链表或者红黑树&#xff0c;多个键…

ansible自动化运维实战--通过role远程部署nginx并配置(8)

文章目录 1、准备工作2、创建角色结构3、编写任务4、准备配置文件&#xff08;金甲模板&#xff09;5、编写变量6、编写处理程序7、编写剧本8、执行剧本Playbook9、验证-游览器访问每台主机的nginx页面 在 Ansible 中&#xff0c;使用角色&#xff08;Role&#xff09;来远程部…

Python网络自动化运维---用户交互模块

文章目录 目录 文章目录 前言 实验环境准备 一.input函数 代码分段解析 二.getpass模块 前言 在前面的SSH模块章节中&#xff0c;我们都是将提供SSH服务的设备的账户/密码直接写入到python代码中&#xff0c;这样很容易导致账户/密码泄露&#xff0c;而使用Python中的用户交…

计算机的错误计算(二百二十二)

摘要 利用大模型化简计算 实验表明&#xff0c;虽然结果正确&#xff0c;但是&#xff0c;大模型既绕了弯路&#xff0c;又有数值计算错误。 与前面相同&#xff0c;再利用同一个算式看看另外一个大模型的化简与计算能力。 例1. 化简计算摘要中算式。 下面是与一个大模型的…

mybatis(78/134)

前天学了很多&#xff0c;关于java的反射机制&#xff0c;其实跳过了new对象&#xff0c;然后底层生成了字节码&#xff0c;创建了对应的编码。手搓了一遍源码&#xff0c;还是比较复杂的。 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE …

数据分箱 baggingboosting onehot独热编码 woe编码 sklearn的ensemble(集成学习)

目录 数据分箱就是将连续变量离散化。 bagging&boosting onehot独热编码 独热编码的结果如下&#xff1a; woe编码 WOE编码的基本原理 步骤一&#xff1a;计算WOE 步骤二&#xff1a;应用WOE WOE编码的优点 示例 数据示例 步骤一&#xff1a;计算每个类别的违约…

企业微信开发010_使用WxJava企业微信开发框架_封装第三方应用企业微信开发003_并且实现多企业授权访问---企业微信开发012

继续来看吧,上一节,已经把config部分,代码都拿过来了: 并且把企业微信第三方应用开发部分,对应的config的配置,mutiltp 代码拿过来了,并且把yml中的配置也给出了. 然后,这里说一下config中的内容,到时候自己看也可以看懂 其实就是封装了,当系统启动,加载企微模块,这个时候,会…

Office2021下载与安装保姆级教程【Office Tool Plus】

Office Tool Plus安装Office2021 下载Office Tool Plus安装OfficeⅠ. 清除旧版本Ⅱ. 配置安装参数Ⅲ. 安装许可证Ⅳ. 激发&#xff08;JH&#xff09;Office 本文介绍使用Office Tool Plus工具下载、安装、部署Office 2021全过程。 下载Office Tool Plus OfficeToolPlus是一个…

Unity在WebGL中拍照和录视频

原工程地址https://github.com/eangulee/UnityWebGLRecoder Unity版本2018.3.6f1&#xff0c;有点年久失修了 https://github.com/xue-fei/Unity.WebGLRecorder 修改jslib适配了Unity2021 效果图 录制的视频 Unity在WebGL中拍照和录视频