持续关注阿杰在线更新保姆式笔记~~坚持日更

一、补充C语言知识:static

二、硬件连接

KEY0:上拉输入

KEY1:上拉输入

WK_UP:下拉输入

三、GPIO操作说明

四、代码区

**main.c**
#include "led.h"
#include "delay.h"
#include "beep.h"
#include "sys.h"
#include "key.h"
 
 
int main(void)
{    
    u8 key = 0;
    
    delay_init();//延时函数初始化    
    Led_Init();//初始化与LED连接的硬件接口  
    Beep_Init();//初始化蜂鸣器端口
    Key_Init();//初始化与按键连接的硬件接口
    LED0=0;                    //先点亮LED0
    
    while(1)
    {
        key = Key_read(0);//得到键值,mode:0,不支持连续按
        if(key)
        {
            switch(key)
            {
                case KEY0_PRES://KEY0控制蜂鸣器翻转
                    BEEP = !BEEP;
                break;
                case KEY1_PRES://KEY1控制LED1翻转
                    LED1 = !LED1;
                break;
                case WKUP_PRES://WK_UP同时控制LED0,LED1翻转 
                    LED0=!LED0;
                    LED1=!LED1;
                break;
            }        
        }//else delay_ms(10); 
    }
}

**key.c**
 
#include "key.h"
#include "delay.h"
 
//按键初始化函数
void Key_Init(void)//IO初始化
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOA,ENABLE);
    //使能GPIOA,GPIOE时钟
    
    //初始化 WK_UP-->GPIOA.0      下拉输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//PA0设置成输入,默认下拉      
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;//KEY0-KEY1
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//设置成上拉输入
    GPIO_Init(GPIOE,&GPIO_InitStructure);//初始化GPIOE4,3
}
 
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY3按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY_UP!!
u8 Key_read(u8 mode)
{
    static u8 Key_up = 1;//按键按松开标志
    if(mode)    Key_up = 1;//若mode为1时,支持连按    
    if(Key_up && (KEY0 == 0 || KEY1 == 0 || WK_UP == 1))
    {
        delay_ms(10);//消除抖动 
        Key_up = 0;//若mode:0,该条件满足不支持连续按;若mode:1,该条件满足支持连续按;
        
        if(KEY0 == 0)    return KEY0_PRES;             //1,KEY0按下
        else if(KEY1 == 0)    return KEY1_PRES;//2,KEY1按下
        else if(WK_UP == 1)    return WKUP_PRES;//3,KEY3按下 WK_UP
    }else if(KEY0 == 1 && KEY1 == 1 && WK_UP == 0)    Key_up = 1;
        //没有按键按下时,标志位恢复为1,为下次按键按下做准备
    return 0;// 无按键按下
}