定时器按键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);//关掉所有LEDLCD_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);
#endifstruct 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);//关掉所有LEDLCD_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);//关掉所有LEDLCD_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);//关掉所有LEDLCD_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);//关掉所有LEDLCD_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);
#endifstruct 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.mzph.cn/bicheng/69240.shtml

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

相关文章

大模型-本地化部署调用--基于ollama+openWebUI+springBoot

大模型-本地化部署调用–基于ollamaopenWebUIspringBoot 前言 前段时间&#xff0c;啊&#xff0c;可能不是前段时间&#xff0c;过去的2024年吧&#xff0c;大模型这块的内容也是非常火的&#xff0c;各家巨头也开始卷大模型的研发。那么本人呢也在过去的一年中也是用到了一…

Vue组件开发-使用 html2canvas 和 jspdf 库实现PDF文件导出 设置页面大小及方向

在 Vue 项目中实现导出 PDF 文件、调整文件页面大小和页面方向的功能&#xff0c;使用 html2canvas 将 HTML 内容转换为图片&#xff0c;再使用 jspdf 把图片添加到 PDF 文件中。以下是详细的实现步骤和代码示例&#xff1a; 步骤 1&#xff1a;安装依赖 首先&#xff0c;在项…

RV1126+FFMPEG推流项目源码

源码在我的gitee上面&#xff0c;感兴趣的可以自行了解 nullhttps://gitee.com/x-lan/rv126-ffmpeg-streaming-projecthttps://gitee.com/x-lan/rv126-ffmpeg-streaming-project

宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等

需求&#xff1a; 将word中所有excel表格的格式进行统一化&#xff0c;修改其中的数字类型为“宋体&#xff0c; 五号&#xff0c;右对齐&#xff0c; 不加粗&#xff0c;不倾斜”&#xff0c;其中的中文为“宋体&#xff0c; 五号&#xff0c; 不加粗&#xff0c;不倾斜” 数…

ServletOutputStream failed to write: Broken pipe

案发现场 问题&#xff1a; org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream failed to write: Broken pipe org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream …

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…

14-6-2C++STL的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…

Docker 系列之 docker-compose 容器编排详解

文章目录 前言一、Docker-compose简介二、Docker-compose 的安装三、Docker-compose卸载四、Docker-compose常用命令4.1 Docker-compose命令格式4.2 docker-compose up4.3 docker-compose ps4.4 docker-compose stop4.5 docker-compose -h4.6 docker-compose down4.7 docker-co…

React第二十五章(受控组件/非受控组件)

React 受控组件理解和应用 React 受控组件 受控组件一般是指表单元素&#xff0c;表单的数据由React的 State 管理&#xff0c;更新数据时&#xff0c;需要手动调用setState()方法&#xff0c;更新数据。因为React没有类似于Vue的v-model&#xff0c;所以需要自己实现绑定事件…

转换算术表达式

文章目录 构造二叉树表示的算术表达式&#xff1a;按先序次序输入二叉树中结点的值(操作数及运算符均以一位字符表示&#xff0c;注意转换)&#xff0c; #字符表示空树&#xff0c;如上图的算术表达式 输入2##*3##4## 输入格式 第一行输入表示要计算的算术表达式的二叉树结点的…

[b01lers2020]Life on Mars1

打开题目页面如下 看了旁边的链接&#xff0c;也没有什么注入点&#xff0c;是正常的科普 利用burp suite抓包&#xff0c;发现传参 访问一下 http://5edaec92-dd87-4fec-b0e3-501ff24d3650.node5.buuoj.cn:81/query?searchtharsis_rise 接下来进行sql注入 方法一&#xf…

Linux的udev详解、安装和使用(dev下的设备每次开机的名称不固定怎么办?)

前言&#xff08;问题与需求&#xff09;&#xff1a; 在传统的devfs 1&#xff1a;设备映射的不确定&#xff1a;一个设备多次加载设备的设备文件可能不同&#xff0c;比如一个hub有可能是ttyUSB0或ttyUSB2或ttyUSB3 2&#xff1a;devfs没有足够的主辅设备号&#xff0c;当设…

Linux 内核中的 InfiniBand 核心模块:drivers/infiniband/core/device.c 分析

InfiniBand 是一种高性能、低延迟的网络互连技术,广泛应用于高性能计算(HPC)、数据中心和云计算等领域。Linux 内核中的 InfiniBand 子系统提供了对 InfiniBand 设备的支持,而 drivers/infiniband/core/device.c 文件则是 InfiniBand 核心模块的重要组成部分。本文将对 dev…

如何快速开发LabVIEW项目,成为LabVIEW开发的高手

发现了一篇多年前写的文章&#xff0c;转发到这里 如何快速开发LabVIEW项目&#xff0c;成为LabVIEW开发的高手。 如果您手里有LabVIEW项目&#xff0c;领导催的又很紧&#xff0c;该怎么办&#xff1f; 如果您公司规模小&#xff0c;就想把LabVIEW项目快速搞定&#xff0c;有什…

Zookeeper(27)Zookeeper的CAP理论是什么?

CAP 理论&#xff0c;又称为 Brewer 定理&#xff0c;是分布式系统设计中的一个基本定理。CAP 代表一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容忍性&#xff08;Partition Tolerance&#xff09;。该理论指出&#xff0c;…

CodeForces 611:New Year and Domino ← 二维前缀和

【题目来源】 https://codeforces.com/contest/611/problem/C 【题目描述】 They say "years are like dominoes, tumbling one after the other". But would a year fit into a grid? I dont think so. Limak is a little polar bear who loves to play. He has r…

数组

数组 栈区的空间很有限&#xff0c;静态区的空间大些&#xff0c;一般在静态区去申请较大的空间 考虑特例能不能归并到一起也很重要 在二维数组中&#xff0c;基于范围的 for 循环直接遍历的是行&#xff0c;而不是单个元素 对于一个 int arr[3][4] 的二维数组&#xff0c; m…

网易Android开发面试题200道及参考答案 (下)

说明原码、反码、补码的概念 原码:是一种简单的机器数表示法。对于有符号数,最高位为符号位,0 表示正数,1 表示负数,其余位表示数值的绝对值。比如,对于 8 位二进制数,+5 的原码是 00000101,-5 的原码是 10000101。原码的优点是直观,容易理解,但在进行加减法运算时,…

K8S中的数据存储之基本存储

基本存储类型 EmptyDir 描述&#xff1a;当 Pod 被调度到节点上时&#xff0c;Kubernetes 会为 Pod 创建一个空目录&#xff0c;所有在该 Pod 中的容器都可以访问这个目录。特点&#xff1a; 生命周期与 Pod 绑定&#xff0c;Pod 删除时&#xff0c;数据也会丢失。适用于临时…

如何移植ftp服务器到arm板子?

很多厂家提供的sdk&#xff0c;一般都不自带ftp服务器功能&#xff0c; 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk&#xff1a;复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…