前言
本文是基于嵌入式开发板CT117E,stm32f103RBT6。"空手套白狼"就是直接利用官方给的库(v3.5),进行拷贝修改形成可以正常运行的代码。
一、原理图
二、由原理图得到的信息
- 四个按键,按下时状态为低电平。
- 按键的N K1----N K4,连接的端口分别是PA0 PA8 PB1 PB2。
三、按键初始化
1. 按键属于输入,所以配置初始化函数时应该配置为浮空输入。
2. 初始化函数: 直接使用led初始化的内容,进行修改,对模式改为GPIO_Mode_IN_FLOATING。
STM32固件库代码V3.5版\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle\main.c
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8; //按键1,按键2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; //按键3,按键4
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
四、按键的应用方法
读取各个按键端口的值,低电平就是按键按下。
#define key1 GPIO_ReadInputDataBit (GPIOA,GPIO_Pin_0)
#define key2 GPIO_ReadInputDataBit (GPIOA,GPIO_Pin_8)
#define key3 GPIO_ReadInputDataBit (GPIOB,GPIO_Pin_1)
#define key4 GPIO_ReadInputDataBit (GPIOB,GPIO_Pin_2)
五、按键在主函数的应用方法 ----长按 & 短按
按键的程序编写不难,但有的题目可能会要求区分长按和短按,主要思路:按键的扫描时间是50ms扫描一次(这里50ms刚好达到消抖的效果),可以在按键按下的时候定义变量,每次扫描记录加一次,当变量大于20时就判断为长按1秒,如果按键松开就判断变量的值是否在1-10之间,从而判断是否为短按,再把变量清0。
void key_read(void)
{
if(key1==0)
{
key1_num++; //每50ms加1
if(key1_num>20) //长按判断2s
{
led_ctrl(led1,1);
}
}
else
{
if(key1_num>1 && key1_num<10) //短按判断
{
led_ctrl(led1,0);
}
key1_num=0;
}
}
while(1)
{
if(key_flag) //key_flag这个变量在滴答计时器的中断函数里面,每50ms就对它置1;
{
key_flag=0;
key_read(); //每50ms执行一次,每50ms函数里的key1_num加1;
}
}