目录
我们之前都是了解了一下输出模式,现在我们来了解一下输入模式,我们目前采用的是通过按键来实现输入控制LED以及蜂鸣器,接下来,我们就来看看硬件部分吧!
首先, 我们来看一下按键以及对应的引脚位置,下排三个按钮接的是GND,所以应该选择上拉输入,上排按钮接的是VCC,所以选择下拉输入。
先来写一下按键的代码部分
#include "key.h"
#include "delay.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);
// 下三个按键
// 普通输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
//KEY0 KEY1 KEY2对应引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
//上拉
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//100M
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//初始化GPIOE2,3,4
GPIO_Init(GPIOE, &GPIO_InitStructure);
//上面按键
//WK_UP对应引脚PA0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//下拉
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;
//初始化GPIOA0
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//按键返回函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0:无按钮按下
//1:KEY0按下
//2:KEY1按下
//3:KEY2按下
//4:WKUP按下 WK_UP
// uint8_t的意思是unsigned int 类型的
uint8_t KEY_Scan(uint8_t mode)
{
static uint8_t key_up=1;//按键松开标准
if(mode)key_up=1; //支持连续按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//消抖
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;
// 无按键按下
}
之后是主函数的
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
int main(void)
{
uint8_t key; //保存键值ֵ
delay_init(168); //初始化延时函数
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 KEY0_PRES: //控制LED0
LED0=!LED0;
break;
case KEY1_PRES: //控制LED1
LED1=!LED1;
break;
case KEY2_PRES: //同时控制LED0,LED1
LED0=!LED0;
LED1=!LED1;
break;
}
}else delay_ms(10);
}
}
运行结果如下所示:
这个和51独立按键类似,没有说明很特别的地方,就先介绍这么多了。