(二)stm32f103~~GPIO基本操作二(按鍵)


GPIO基本配置之按鍵輸入操作(通過按鍵控制小燈的翻轉)

KEY0 對用端口PE4,KEY1 對用端口PE3,這兩個按鍵是一段接地,另一端接單片機。
KEYWKUP 對用端口PA0,這個按鍵是一段接高電平,另一端接片機。


key.h

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

#define KEY0_PIN GPIO_Pin_4
#define KEY0_PORT GPIOE
#define KEY1_PIN GPIO_Pin_3
#define KEY1_PORT GPIOE
#define KEYWKUP_PIN GPIO_Pin_0
#define KEYWKUP_PORT GPIOA


#define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //讀取按鍵0的值 並賦值給key0
#define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //讀取按鍵1的值 並賦值給key1
#define key_wkup GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //讀取按鍵2的值 並賦值給key_wkup

typedef enum
{ key0_value=1, key1_value=2,key_wkup_value=3 }key_value; //將3個按鍵返回值定義成int,用來給按鍵掃描不同按鍵返回值使用

void key_init(void); //按鍵GPIO初始化
u8 key_scan( u8 ); //按鍵掃描函數

#endif


 

key.c

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

void key_init(void)
{
GPIO_InitTypeDef GPIO_Initstructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE); //使能PA,PE端口時鍾

GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPD; //下拉輸入
GPIO_Initstructure.GPIO_Pin=KEYWKUP_PIN; //PA.0
GPIO_Init(KEYWKUP_PORT,&GPIO_Initstructure);

GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IPU; //上拉輸入
GPIO_Initstructure.GPIO_Pin=KEY0_PIN | KEY1_PIN; //PE.3 PE.4
GPIO_Init(KEY0_PORT,&GPIO_Initstructure);
}

//按鍵處理函數
//返回按鍵值
//0,沒有任何按鍵按下
//1,KEY0按下
//2,KEY1按下
//3,KEY3按下 WK_UP
//注意此函數有響應優先級, key0>key1>wake_up

u8 key_scan(u8 mode) //mode:0,不支持連續按;1,支持連續按;
{
u8 key_pre=0; //定義一個按鍵值,供不同按鍵返回
static u8 key_up = 1; //按鍵松開標志(靜態局部變量實際上就是一個特殊的全局變量)
if ( mode == 1 ) key_up = 1; //按鍵模式調整
if(key_up && (key0==0 || key1==0 || key_wkup==1) ) //如果按鍵按下
{
delay_ms(10);//去抖動
key_up=0;
if(key0==0) key_pre=key0_value;
else if(key1==0) key_pre=key1_value;
else if(key_wkup==1) key_pre=key_wkup_value;
}
else if(key0==1 && key1==1 && key_wkup==0) key_up=1;
return key_pre; // 返回按鍵鍵值
}


 

main.c

int main(void)
{
delay_init(); //初始化延時函數
led_init(); //初始化LED端口
key_init(); //初始化按鍵端口
  while(1)
  {
    switch(key_scan(0)) //模式0,不支持聯按
    {
      case key0_value:
        GPIO_WriteBit(LED0_PORT,LED0_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED0_PORT,LED0_PIN))); break; //按鍵0,led0翻轉
      case key1_value:
        GPIO_WriteBit(LED1_PORT,LED1_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED1_PORT,LED1_PIN))); break; //按鍵1,led1翻轉
      case key_wkup_value:
         GPIO_WriteBit(LED0_PORT,LED0_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED0_PORT,LED0_PIN)));//按鍵0,led0翻轉
         GPIO_WriteBit(LED1_PORT,LED1_PIN,(BitAction)(1-GPIO_ReadOutputDataBit(LED1_PORT,LED1_PIN)));//按鍵1,led1翻轉
           break;
    }
    delay_ms(50);
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM