stm32按键功能设置

硬件设置:

KEY012 -》 PE432 WAKE-UP ->PA0

软件配置:

  1. 初始化端口、时钟

  1. 按键检测处理

  1. 按键控制处理

代码:初始化以及按键检测

#include "key.h"
#include "SysTick.h"
void key_Init()
    {
  GPIO_InitTypeDef GPIO_InitStructure;    
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE);    //使能端口A,E
        
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//wake—up
    GPIO_InitStructure.GPIO_Pin=wake_up_PIN;
    GPIO_Init(KEY_UP_PORT,&GPIO_InitStructure);  

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=KEY0_PIN|KEY1_PIN|KEY2_PIN;//或运算同时初始化(要在同意端口GPIOA下)
    GPIO_Init(KEY_PORT,&GPIO_InitStructure);  
    }
    
    u8 key_scan(u8 mode)
    {
        static u8 key=1;//mode==0,单次按键;反之,连续按键
        if(mode)key=1;
        if(key==1&&WAKE_UP_PRESS==1|KEY0==0|KEY1==0|KEY2==0)//模式为0,进入判断
            {                                                   //key变为0,如果此时一直按键不松手则key为0,没变化,无法连续按键
                key=0;                                             //松开,进入到key==0的判断,此时key变回1,在按下可以继续按键
                delay_ms(10);
                    if(KEY0==1)                                     // 模式为1,进入判断
            return KEY0_PRESS;                                   //key在判断里面变0后出来,if(mode)key=1;又变回1,此时可以连续按键
            else if(KEY1==1)
                return KEY1_PRESS;
            else if(KEY2==0)
                return KEY2_PRESS;
         }
            else if(key==0&&WAKE_UP_PRESS==0&&KEY0==1&&KEY1==1&&KEY2==0)
                {
            key=1;
            }
            return 0;
    }    

main函数:先进行初始化,在循环里检测按键状态,然后通过switch检测按键


#include "led.h"
#include "system.h"
#include "SysTick.h"
#include "key.h"
#include "beep.h"
int main()
{
    u8 i=0;
 key_Init();
u8 key=0;
while(1)
    {    
         key=key_scan(0);
        switch(key)
        {
            case WAKE_UP_PRESS:LED1=0;break;
            case KEY0_PRESS:BEEP=0;break;
            case KEY1_PRESS:LED1=1;break;    
            case KEY2_PRESS:BEEP=1;break;
        }
        i++;
        if(i%20==0){
        LED1=!LED1;
            delay_ms(10);
        }     
  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值