单片机 > 单片机程序设计 > 详情

stm32基础实验2(按键输入—查询模式)

发布时间:2020-09-03 发布时间:
|

一、实验原理


1、实现步骤 


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


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


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


读取IO口输入电平三种方式 

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);(库函数) 

GPIOx_IDR:端口输入寄存器(寄存器) 

PEin(4)-读取GPIOE.4口电平(位操作)


Static申明的局部变量,存储在静态存储区。它在函数调用结束之后,不会被释放。它的值会一直保留下来,具有记忆功能。

 

2、硬件连接 


  


如图 

PE3——key1 

PE4——key0 

PA0——WK_UP 


初始化时,按键未按下, 

KEY_UP引脚是低电平,即下拉 

KEY0,KEY1引脚是高电平,即上拉 

GPIO_ReadInputDataBit()函数检测此三个引脚的电平。


3、按键扫描实现思路 



二、实验代码

**key.h**


#ifndef __KEY_H

#define __KEY_H  

#include "sys.h"


//#define KEY0 PEin(4)      //PE4

//#define KEY1 PEin(3)  //PE3 

//#define WK_UP PAin(0) //PA0  WK_UP


#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0

#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1

#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) 


#define KEY0_PRES   1   //KEY0按下

#define KEY1_PRES     2 //KEY1按下

#define WKUP_PRES   3   //KEY_UP按下(即WK_UP/KEY_UP)


void KEY_Init(void);//IO初始化

u8 KEY_Scan(u8);    //按键扫描函数                        

#endif


**key.c**


#include "stm32f10x.h"

#include "key.h"

#include "sys.h" 

#include "delay.h"


//按键初始化函数

void KEY_Init(void) //IO初始化

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟


    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3


    //初始化 WK_UP-->GPIOA.0     下拉输入

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉     

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0


}

//按键处理函数

//返回按键值

//mode:0,不支持连续按;1,支持连续按;

//0,没有任何按键按下

//1,KEY0按下,见.h文件

//2,KEY1按下

//3,KEY3按下 WK_UP

//注意此函数有响应优先级,KEY0>KEY1>KEY_UP!!

u8 KEY_Scan(u8 mode)

{    

    static u8 key_up=1;//按键按松开标志

    if(mode)key_up=1;  //支持连按         

    if(key_up&&(KEY0==0||KEY1==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(WK_UP==1)return WKUP_PRES;

    }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;       

    return 0;// 无按键按下

}




**main.c**


int main(void)

 {

    vu8 key=0;  

    delay_init();            //延时函数初始化    

    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 KEY1_PRES: //控制LED1翻转   

                    LED1=!LED1;

                    break;

                case KEY0_PRES: //同时控制LED0,LED1翻转 

                    LED0=!LED0;

                    LED1=!LED1;

                    break;

            }

        }else delay_ms(10); 

    }    

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机按键切换下一首歌