持续关注阿杰在线更新保姆式笔记~~坚持日更
一、补充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;// 无按键按下
}
评论(0)
您还未登录,请登录后发表或查看评论