STM32f4————按键输入实验代码(02)
/*******************************************************/
接下来我们看看头文件 key.h 里面的代码:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
/*下面的方式是通过直接操作库函数方式读取IO*/
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //PE3
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //PA0
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
void KEY_Init(void); //IO 初始化
u8 KEY_Scan(u8); //按键扫描函数
#endif
这段代码里面最关键就是4个宏定义:
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //PE3
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //PA0
这里使用的是调用库函数来实现读取某个 IO 口的 1 个位的。同输出一样,上面的功能也同样可以通过位带操作来简单的实现:
#define KEY0 PEin(4) //PE4
#define KEY1 PEin(3) //PE3
#define KEY2 PEin(2) //P32
#define WK_UP PAin(0) //PA0
用库函数实现的好处是在各个 STM32 芯片上面的移植性非常好,不需要修改任何代码。用位带操作的好处是简洁,至于使用哪种方法,看各位的爱好了。
在 key.h 中,我们还定义了 KEY0_PRES / KEY1_PRES/ KEY2_PRES/WKUP_PRESS 等 4个宏定义,分别对应开发板四个按键(KEY0/KEY1/KEY2/ KEY_UP)按键按下时 KEY_Scan返回的值。通过宏定义的方式判断返回值,方便大家**和使用。
最后,我们看看main.c里面编写的主函数代码如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
int main(void)
{
u8 key; //保存键值
delay_init(168); //初始化延时函数
LED_Init(); //初始化 LED 端口
BEEP_Init(); //初始化蜂鸣器端口
KEY_Init(); //初始化与按键连接的硬件接口
LED0=0; //先点亮红灯
while(1)
{ key=KEY_Scan(0); //得到键值
if(key)
{ switch(key)
{ case WKUP_PRES: //控制蜂鸣器
BEEP=!BEEP;
break;
case KEY0_PRES: //控制 LED0 翻转
LED0=!LED0;
break;
case KEY1_PRES: //控制 LED1 翻转
LED1=!LED1;
break;
case KEY2_PRES: //同时控制 LED0,LED1翻转
LED0=!LED0;
LED1=!LED1;
break;
}
}else delay_ms(10);
}
}
主函数代码比较简单,先进行一系列的初始化操作,然后在死循环中调用按键扫描函数KEY_Scan()扫描按键值,最后根据按键值控制LED和蜂鸣器的翻转。
/*******************************************************/
【立创商城】STM32F103CBT6 托盘 https://item.szlcsc.com/8796.html |