前言
大部分同学在学习STM32时都是通过硬件厂商提供的学习视频(如野火,正点原子等),在观看学习视频后对按键函数有了一个比较初步的了解,但在运用的过程可能会觉得运用起来不能得心应手,下面来分享本人在开发过程中的一些思路。
KEY.H文件
#ifndef _KEY_H
#define _KEY_H
#include "stm32f4xx.h"
#include "sys.h"
void KEYPinInit(void);
u8 KEYScan1(void);
u8 KEYScan2(void);
u8 KEYScan3(void);
u8 KEYScan4(void);
#define KEY1 (PAin(0))
#endif
头文件的编写几乎千篇一律,如果对这些代码不太熟悉建议回顾一下基础。
KEY.C文件
关于这个扫描函数的编写主要有两种逻辑,一种是只要按下就触发一次,另一种则是只要按下不松开的情况下是触发多次。关于这两个逻辑的在正点原子的视频里也有介绍,支持连按的版本使用的比较少,所以在这里介绍比较常见的不支持连按的。
#include "KEY.H"
static void delay(u32 ms)
{
u32 i = 168 * 1000 / 4 * ms;
while(i--)
{
;
}
}
void KEYPinInit(void)
{
GPIOA->MODER &= ~(0X3 << 0);
GPIOA->PUPDR &= ~(0X3 << 0);
}
u8 KEYScan1(void)
{
u8 key = 0;
static u8 key_up = 1;
if(key_up && !KEY1)
{
delay(10);
if(!KEY1) key = 1;
key_up = 0;
}
if(KEY1) key_up = 1;
return key;
}
MAIN函数
这个时候可能就有人会陷入迷惑了,如果只是用简单的IF函数当KEYscan函数返回值为1时触发,这个思路是大家开发时最容易想到的条件判断。但如果只用这个条件来进行判断的话实际产品设计起来比较受限,因为一个按键只能对应一个功能,但我们日常生活中很多消费电子产品比如台灯的话都是通过一个按键,根据按的次数不同来改变功能,下面我来简单介绍一下根据上面这个keyscan扫描函数设计的一个程序,此处以驱动LED灯设计一个简单的程序,按一下亮,按第二下灭。
int main(void)
{
KEYPinInit();
int pressnum=0;
int mode=0;
while (1)
{
if(KEYScan1())
{
pressnum=pressnum+1;
mode=pressnum%2;
if(mode) LED2=0;;
else LED2=1;
}
}
}
此处使用了一个pressnum的形参对按键按下的次数进行计数,此处示例时针对两个功能进行设计的,故pressnum对2进行求余,如果为余数1则为触发,余数为2则为不触发。
|