一、环境配置
1、选择MDK-ARM V5版本的。选择固件包,版本自选
2、使能外部时钟,配置时钟为24MHz,系统时钟为80MHz
二、KEY
1、引脚使能,配置为上拉输入(检测到低电平为按键按下)
2、按键扫描:实现短按、长按、双击(定时器3扫描)
(1)添加工程文件interrupt.c interrupt.h。定义按键的结构体如下:
interrupt.h
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include "main.h"
#include "stdbool.h"
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);//定时器周期性中断事件发生时被调用
struct keys
{
uint8_t state ;//状态机当前的状态
uint8_t key ;//按键当前的状态
uint8_t long_flag;//长按标志位
uint8_t count_flag;//记录短按次数
uint8_t double_flag;//单双击的区分
uint32_t tick ;//记录时间
};
#endif
interrupt.c
#include "interrupt.h"
struct keys key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器周期性中断事件发生时被调用
{
if(htim->Instance==TIM3)//如果是定时器3
{
//读按键状态
key[0].key=HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin);
key[1].key=HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin);
key[2].key=HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin);
key[3].key=HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin);
for(int i=0;i<4;i++)
{
if(key[i].state>0) key[i].tick++;//如果按键按下,就开始计时
//按键状态机
switch (key[i].state)
{
case 0://无按键按下状态
if(key[i].key==0)
{
key[i].state=1;
key[i].count_flag=1;//记录单击次数
key[i].tick=0;//时间清零
}
break;
case 1://有无按下判断长按
{
if(key[i].key!=0)//没有按下
{
key[i].tick=0;//时间清零
key[i].state=2;//没有长按进入2状态判断单击双击
}else if (key[i].tick > 50)
{
key[i].long_flag=1;//发生长按
key[i].tick=0;//时间清零
key[i].count_flag=0;//记录单击次数
}
}
break;
case 2:
{
if(key[i].tick > 15 )
{
if (key[i].count_flag==1)//超过15秒又只按了1次
key[i].double_flag=1;
else if (key[i].count_flag==2) //超过15秒又按了2次
{key[i].double_flag=2;}
key[i].state=0;
}else {
//检测是否再按下判断是否为长按
if(key[i].key==0)
{
key[i].count_flag++;
key[i].tick=0;//时间清零
key[i].state=1;//有无按下判断长按
}
}
}
break;
}
}
}
}
(2)开定时器TIM3
三、LCD
1、引脚使能,推挽输出,默认低电平(20个引脚)(2 5 6 7)
2、将LCD库文件导入到工程文件,所需文件如下:fonts.h、lcd.h、lcd.c
LCD_Init(); //初始化
LCD_Clear(u16 Color); //清屏
LCD_SetTextColor(u16 Color);//设置文本颜色
LCD_SetBackColor(u16 Color); //设置背景颜色
LCD_DisplayStringLine(u8 Line, u8 *ptr); //显示文字
四、KEY和LCD
采用定时器扫描按键需开定时器
HAL_TIM_Base_Start_IT(&htim3);//开定时器
main.c