一、具体实现过程:
1.CUBEMX配置 LED、 KEY、定时器:10ms(选用)、串口(调试打印)
(对这部分配置不熟悉的,可以去看看基础配置,)
2.点击生成代码:
二、具体使用函数:
代码如下(示例):
/*
每10ms进入一次该函数,检查一下引脚状态
可以用定时器,也可以用查询
*/
void Key_scan(void)
{
//1 表示高电平,0表示低电平。低电平时按下
uint8_t val = HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin);
static uint16_t count=0;
if(!val)//按键按下 记录按下的时间
{
count++;
}
else //按键松开 计数值清零并返回按下的时间值
{
if(count>100)//按下经过1s 10*10ms=100ms
{
//长按
KEY_flag = 2;
printf("key_flag == 2rn");
}
else if(count>10 && count <100)//表示超过10ms
{
//短按
KEY_flag = 1;
printf("key_flag == 1rn");
}
else
{
//消抖时间
}
count=0;
}
}
/*
*依据标志位改变LED的状态
*/
void Led_scan()
{
switch(KEY_flag)
{
case 1:
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
break;
case 2:
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
break;
default:
break;
}
}
三、主函数:
/*
*依据标志位改变LED的状态
*/
HAL_Delay(3000); //防止一上电定时器,就开始计数
HAL_TIM_Base_Start_IT(&htim4); //定时器使能
printf("正常rn");
while (1)
{
/* USER CODE BEGIN 3 */
//1.查询方式扫描按键状态
// Key_scan();
// Led_scan();
// HAL_Delay(10);
//2.定时器方式扫描按键状态
Led_scan();
}
/* USER CODE END 3 */
五、回调函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
Key_scan();
HAL_TIM_Base_Start_IT(&htim4); //再次使能
}
六、串口重定向函数:
在uart.c中添加:
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
总结
现在看看其实代码也挺好理解,可为什么当时没写出来呢,害,还需继续努力。在嵌入式这条路上我还是个菜鸡,路漫漫其修远兮,在这里主要是把我学习遇到的坑分享一下!
一、具体实现过程:
1.CUBEMX配置 LED、 KEY、定时器:10ms(选用)、串口(调试打印)
(对这部分配置不熟悉的,可以去看看基础配置,)
2.点击生成代码:
二、具体使用函数:
代码如下(示例):
/*
每10ms进入一次该函数,检查一下引脚状态
可以用定时器,也可以用查询
*/
void Key_scan(void)
{
//1 表示高电平,0表示低电平。低电平时按下
uint8_t val = HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin);
static uint16_t count=0;
if(!val)//按键按下 记录按下的时间
{
count++;
}
else //按键松开 计数值清零并返回按下的时间值
{
if(count>100)//按下经过1s 10*10ms=100ms
{
//长按
KEY_flag = 2;
printf("key_flag == 2rn");
}
else if(count>10 && count <100)//表示超过10ms
{
//短按
KEY_flag = 1;
printf("key_flag == 1rn");
}
else
{
//消抖时间
}
count=0;
}
}
/*
*依据标志位改变LED的状态
*/
void Led_scan()
{
switch(KEY_flag)
{
case 1:
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
break;
case 2:
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
break;
default:
break;
}
}
三、主函数:
/*
*依据标志位改变LED的状态
*/
HAL_Delay(3000); //防止一上电定时器,就开始计数
HAL_TIM_Base_Start_IT(&htim4); //定时器使能
printf("正常rn");
while (1)
{
/* USER CODE BEGIN 3 */
//1.查询方式扫描按键状态
// Key_scan();
// Led_scan();
// HAL_Delay(10);
//2.定时器方式扫描按键状态
Led_scan();
}
/* USER CODE END 3 */
五、回调函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
Key_scan();
HAL_TIM_Base_Start_IT(&htim4); //再次使能
}
六、串口重定向函数:
在uart.c中添加:
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
总结
现在看看其实代码也挺好理解,可为什么当时没写出来呢,害,还需继续努力。在嵌入式这条路上我还是个菜鸡,路漫漫其修远兮,在这里主要是把我学习遇到的坑分享一下!
举报