STM32F103ZE按键输入实验- 库函数

规划:

(其中调用到的led和beep需要基于前两篇文章中源码,这篇文章只列出有关按键的源码)

1.使能按键对应IO口时钟。调用函数:RCC_APB2PeriphClockCmd();

2.初始化IO模式:上拉/下拉输入。调用函数:GPIO_Init();

3.扫描IO口电平(库函数/寄存器/位操作)。

硬件连接(战舰)

图片

按键有两种,一种是支持连按,一种是不支持连按,需要用到static。

static申明的局部变量有记忆功能。

按键扫描程序:(mode0时不支持连按,mode1时支持连按)

u8 KEY_Scan(u8 mode)
{  
 static u8 key_up=1;
 if(mode)key_up=1;  
 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
 {
  delay_ms(10);  //消抖
  key_up=0;      //标记按下
  if(KEY0==0)return KEY0_PRES;//key0按下
  else if(KEY1==0)return KEY1_PRES;//key1按下
  else if(KEY2==0)return KEY2_PRES;//key2按下
  else if(WK_UP==1)return WKUP_PRES;//wkup按下
 }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;      
  return 0;//没有按下
}

key.h(定义)

#ifndef __KEY_H
#define __KEY_H  
#include "sys.h"

#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) 
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
 
#define KEY0_PRES  1 
#define KEY1_PRES 2 
#define KEY2_PRES 3 
#define WKUP_PRES   4 

void KEY_Init(void);
u8 KEY_Scan(u8);           
#endif

key.c(配置各GPIO模式以及按键扫描)

#include "stm32f10x.h"
#include "key.h"
#include "sys.h" 
#include "delay.h"

void KEY_Init(void) //初始化
{ 
GPIO_InitTypeDef GPIO_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 
GPIO_Init(GPIOA, &GPIO_InitStructure);

u8 KEY_Scan(u8 mode)
{  
 static u8 key_up=1;
 if(mode)key_up=1;  
 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
 {
  delay_ms(10);
  key_up=0;
  if(KEY0==0)return KEY0_PRES;
  else if(KEY1==0)return KEY1_PRES;
  else if(KEY2==0)return KEY2_PRES;
  else if(WK_UP==1)return WKUP_PRES;
 }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;      
  return 0;
}

main.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
 int main(void)
 {
 vu8 key=0; 
 delay_init();         
 LED_Init();        
 KEY_Init();         
 BEEP_Init();       //初始化   
 LED0=0;     //红灯亮
 while(1)
 {
   key=KEY_Scan(0); 
     if(key)
  {         
   switch(key)
   {     
    case WKUP_PRES: //WKUP按下BEEP反转
     BEEP=!BEEP;
     break;
    case KEY2_PRES: //key2按下led0反转
     LED0=!LED0;
     break;
    case KEY1_PRES:  //key1按下led1反转 
     LED1=!LED1;
     break;
    case KEY0_PRES: //key0按下led1和led0都反转
     LED0=!LED0;
     LED1=!LED1;
     break;
   }
  }else delay_ms(10); 
 }  
}

烧录并测试程序,测试成功。

发布了31 篇原创文章 · 获赞 28 · 访问量 9490

猜你喜欢

转载自blog.csdn.net/visual_eagle/article/details/104150389