一、硬件I2CHAL库配置
1、配置时钟树
根据自己使用的芯片和具体需求配置,我使用的是stm32f103c8t6芯片,晶振配置为8,设置72MHZ分频。
2、打开RCC外部时钟
3、打开Debug
4、配置GPIO引脚
(1)选择引脚
根据具体需求选择GPIO引脚配置成输入模式,上拉输入。博主这里选择·的是PA0,PB1,PB2,PB3这四个引脚。点击引脚选择GPIO_Input。
(2)配置上拉输入
点击System Core,选择GPIO,再选中自己配置的引脚,如下图中的(3)选择Pull- up
5、配置定时器
选择Timers,根据具体需求选择定时器,博主这里选择的是TIM4定时器,时钟配置成外部时钟Internal CIock,设置预分频为80HZ,分频是从零开始,所以要减1。重装载值设置为10000,同理也需要减1。
此时的输出频率=80M/预分频/重装载值=100HZ,即等于10毫秒。
6、生成工程
二、代码部分
(1)定时器按键代码
GPIO引脚配置为上拉输入,所以引脚未按下时为高电平1,按下时引脚为低电平0。
首先在(key.h)文件中定义一个结构体。如下代码。
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include "main.h"
struct keys
{
char key_dat;//按键数据标志位
char key_judge;//按键按下的判断位
char key_flag;//按下标志位
char key_longflag;//长按标志位
char key_time;//按键时间标志位
};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
#endif
以下是key.c文件代码,注意按键按下时为低电平0,松开时为高电平1。
#include "interrupt.h"
#include "tim.h"
struct keys key[4]={0,0,0,0,0,};//定义结构体数组存放数据
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
uint i=0;
if(htim->Instance==TIM4)
{
key[0].key_dat=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);//数据位读取GPIO引脚高低电平
key[1].key_dat=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_dat=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_dat=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
for(i=0;i<4;i++)
{
switch(key[i].key_judge)//按键判断位,判断按键是否按下,总共判断三次消除抖动
{
case 0:
{
if(key[i].key_dat==0)//如果按键按下
{
key[i].key_judge=1; //按键按下判断位配置为1,进入下一次判断
key[i].key_time=0;//时间为零
}
}
break;
case 1:
{
if(key[i].key_dat==0)//重复判断按键按下,消除抖动
{
key[i].key_judge=2;
}
else
{
key[i].key_judge=0;//如果按键未按下,判断位归零。再重复消抖操作
}
}
break;
case 2:
{
if(key[i].key_dat==1)按键未按下,判断位归零。再重复消抖操作
{
key[i].key_judge=0;
}
else
{
key[i].key_time++;//按键按下,时间位不断自加1
if(key[i].key_time<100)
{
key[i].key_flag=1;//时间位小于100,短按标志置1
}
else
{
key[i].key_longflag=1;//反之长按标志位置1
}
}
}
break;
}
}
}
(2)读取按键代码
按键读取代码相对简单,以下是一个实例,博主在此不再赘述。
uint8_t Key_GetNum(void)
{
int KeyNum=0;
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0)
{
HAL_Delay(20);
while (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)== 0);//消除抖动操作
HAL_Delay(20);
KeyNum=1;
}
return KeyNum;
}
以下是按键代码的使用,将此代码放进main.c文件中便可实现按键功能。
if(KeyNum ==1)//按键按下
{
HAL_Delay(20);
//以下是自行添加按键工能
y++;
s++;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(20);
KeyNum =0;//按键标志位清零
}