定时器按键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;
}
相关文章:

定时器按键tim_key模版
低优先级放在高优先级内势必是程序卡死 把高优先级放到低优先级内,会使程序卡死 可修改 Debuger调试方法 Pwm rcc #include "my_main.h" uint8_t led_sta0x10; char text[30]; void LED_Disp(uint8_t dsLED) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPI…...

Kanass快速安装配置教程(入门级)
Kanass是一款国产开源免费的项目管理工具,工具简洁易用、开源免费,本文将介绍如何快速安装配置kanass,以快速上手。 1、快速安装 1.1 Linux 安装 点击官网 -> 演示与下载 ->下载,下载Linux安装包,…...

无用知识之:std::initializer_list的秘密
先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…...
论文阅读笔记 —— 英文论文常见缩写及含义
正文 缩写全称含义Reference发音w.r.twith reference to关于, 根据WRT - Wikiet al.拉丁语et alia的缩写等等Et Al. | Meaning & Use in APA, MLA & Chicago–etc拉丁语et cetera的缩写等等ETC - Cambridge DictionaryWhat’s ‘etc.’ an abbreviation of (and what …...

实验9 JSP访问数据库(二)
实验9 JSP访问数据库(二) 目的: 1、熟悉JDBC的数据库访问模式。 2、掌握预处理语句的使用 实验要求: 1、使用Tomcat作为Web服务器 2、通过JDBC访问数据库,实现增删改查功能的实现 3、要求提交实验报告,将代…...

[c语言日寄]C语言类型转换规则详解
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...

Airflow:选择合适执行器扩展任务执行
Apache Airflow是面向开发人员使用的,以编程方式编写、调度和监控的数据流程平台。可伸缩性是其关键特性之一,Airflow支持使用不同的执行器来执行任务。在本文中,我们将深入探讨如何利用这些执行器在Airflow中有效地扩展任务执行。 理解Airfl…...

使用冒泡排序模拟实现qsort函数
1.冒泡排序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int arr[] { 0,2,5,3,4,8,9,7,6,1 };int sz sizeof(arr) / sizeof(arr[0]);//冒泡排序一共排序 sz-1 趟for (int i 0; i < sz - 1; i){//标志位,如果有序,直接…...
AI大模型开发原理篇-4:神经概率语言模型NPLM
神经概率语言模型(NPLM)概述 神经概率语言模型(Neural Probabilistic Language Model, NPLM) 是一种基于神经网络的语言建模方法,它将传统的语言模型和神经网络结合在一起,能够更好地捕捉语言中的复杂规律…...
Eigen::Tensor使用帮助
0 引言 用python实现了某些算法之后,想转成C来获取更高的性能。但是python数组的操作太灵活了,尤其是3维、4维、5维等高维数组,以及它们的广播、数组坐标、切片等机制。还有numpy的pad、where等操作更是给C转换带来了更多的麻烦。 查阅了相…...

git基础使用--3---git安装和基本使用
文章目录 git基础使用--3--git-安装和基本使用1. git工具安装1.1 git1.2 TortoiseGit1.3 远程仓2. git本地仓库版本管理2.1 git常用命令2.2 git基本操作2.2.1 设置用户名和邮箱 2.2 git基本操作2.2.1 初始化本地仓 git init2.2.2 查看本地库状态 git status2.2.3 添加暂缓区2.2…...

html的字符实体和颜色表示
在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…...
OpenAI发布o3-mini:免费推理模型,DeepSeek引发的反思
引言 在人工智能领域,OpenAI再次引领潮流,推出了全新的推理模型系列——o3-mini。这一系列包括low、medium和high三个版本,旨在进一步推动低成本推理的发展。与此同时,OpenAI的CEO奥特曼也在Reddit的“有问必答”活动中罕见地公开…...

Zemax 中带有体素探测器的激光谐振腔
激光谐振腔是激光系统的基本组成部分,在光的放大和相干激光辐射的产生中起着至关重要的作用。 激光腔由两个放置在光学谐振器两端的镜子组成。一个镜子反射率高(后镜),而另一个镜子部分透明(输出耦合器)。…...

大模型训练(5):Zero Redundancy Optimizer(ZeRO零冗余优化器)
0 英文缩写 Large Language Model(LLM)大型语言模型Data Parallelism(DP)数据并行Distributed Data Parallelism(DDP)分布式数据并行Zero Redundancy Optimizer(ZeRO)零冗余优化器 …...
C# 实现 “Hello World” 教程
.NET学习资料 .NET学习资料 .NET学习资料 C# 作为一种广泛应用于.NET 开发的编程语言,以其简洁、高效和类型安全等特性,深受开发者喜爱。在踏入 C# 编程领域时,编写经典的 “Hello World” 程序是重要的起点,它能帮助我们快速熟…...

LabVIEW无线齿轮监测系统
本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…...
IM 即时通讯系统-01-概览
前言 有时候希望有一个 IM 工具,比如日常聊天,或者接受报警信息。 其实主要是工作使用,如果是接收报警等场景,其实DD这种比较符合场景。 那么有没有必要再创造一个DD呢? 答案是如果处于个人的私有化使用࿰…...

【人工智能】 在本地运行 DeepSeek 模型:Ollama 安装指南
持续更新。。。。。。。。。。。。。。。 【人工智能】 在本地运行 DeepSeek 模型:Ollama 安装指南 安装 Ollama安装 DeepSeek 模型选择版本 ,版本越高,参数越多 性能越好使用 DeepSeek 模型 安装 Ollama 访问 Ollama 官网: 前往 https://oll…...

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)
理解Linux系统内进程信号的整个流程可分为: 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生,本文会讲解信号的保存和信号处理相关的概念和操作: 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...