打印
[STM32]

立创商城STM32F系列——STM32f4按键输入实验代码(02)

[复制链接]
873|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-8-31 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝