昨天了解怎么用按键今天先学了长短按键的代码
头文件
#ifndef __INTERRUPT_H_
#define __INTERRUPT_H_
#include "main.h"
#include "stdbool.h"
struct Keys
{
uchar Judge_Sta; //记录进行到哪一步
bool Key_Sta; //记录硬件状态 如果按键就为零
bool Single_Flag; //如果确认按键按下就为一
bool Long_Flag; //如果确认长按键就为一
uint Key_Time; //按下的时间
};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
#endif
模块文件
#include "Interrupt.h"
struct Keys key[4] = {0,0,0}; //设定4个按键为在头文件中设定的按键结构体
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3) //如果时TIM3时钟 TIM3设定的10ms进行一次
{
//判断硬件按键状态
key[0].Key_Sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); //函数作用:读取B0口的电平
key[1].Key_Sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
key[2].Key_Sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
key[3].Key_Sta = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
//确认硬件状态
for(int i=0;i<4;i++)
{
switch(key[i].Judge_Sta)
{
case 0:
{
if(key[i].Key_Sta == 0)
{
key[i].Judge_Sta = 1;
key[i].Key_Time = 0;
} //如果按键按下 进行到第1步
}
break;
case 1:
{
if(key[i].Key_Sta == 0)
{
key[i].Judge_Sta = 2;
}
else
{
key[i].Judge_Sta = 0;
} //如果按键继续按下 进行到第2步 如果没有相反
}
break;
case 2:
{
if(key[i].Key_Sta == 1)
{
key[i].Judge_Sta = 0;
if(key[i].Key_Time<70){key[i].Single_Flag = 1;} //如果按键这时松开 按键标志为短按键
}
else
{
key[i].Key_Time++;
if(key[i].Key_Time>70){key[i].Long_Flag = 1;} //如果按键这时松开 按键标志为长按键
}
}
break;
}
}
}
}
配置PWM输出
只能选择 CHx 的定时器 CHxN是产生互补PWM波(和正常PWM波电位相反)
配置2路PWM
代码
改变昨天的代码
2,按键和显示函数的代码
//按键操作
void Key_proc(void)
{
if(key[0].Single_Flag == 1)
{
view = !view ;
key[0].Single_Flag = 0;
}
if(key[1].Single_Flag == 1)
{
PA6_Duty+=10;
if(PA6_Duty>=100)PA6_Duty=10;
__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,PA6_Duty);//将特定定时器占空比设为PA6_Duty的数值
key[1].Single_Flag = 0;
}
if(key[2].Single_Flag == 1)
{
PA7_Duty+=10;
if(PA7_Duty>=100)PA7_Duty=10;
__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,PA7_Duty);//将特定定时器占空比设为PA7_Duty的数值
key[2].Single_Flag = 0;
}
}
//显示界面
void Disp_proc(void)
{
if(view == 0)
{
char text[30];
sprintf(text," Data ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
}
if(view == 1)
{
char text[30];
sprintf(text," Para ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
sprintf(text," PA6:%d%% ",PA6_Duty);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text," PA7:%d%% ",PA7_Duty);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
}
}
最后就可以实现这些功能
1)开启PA6的PWM输出频率为100HZ,开启PA7的PWM输出频率为200HZ
注意,
1,实际中是先有要求然后针对写代码,教学顺序并不严谨。
2,如果有纰漏请评论