按键输入实验
1.硬件接法
4个按键:WK_UP 控制蜂鸣器,KEY0 同时控制DS0和DS1;KEY1 控制DS1;KEY2控制DS0,
WK_UP 外部上拉,芯片内部需要设置为下拉输入;KEY0-KEY2 外部下拉,芯片内部需要设置为上拉输入。
2.头文件编写
本次实验涉及到LED 蜂鸣器 按键,其中LED和蜂鸣器是输出,按键是输入。
LED头文件编写:
2-1.1 先来个条件编译,不要问为什么要这样写,问就是不知道。标准格式:
#ifndef __XXX_H
#define __xxx_H
//其中 XXX 表示的是需要初始化的名称,比如 led.h 文件就是初始化LED,所以对应的XXX 应为 LED
然后设定I/O 的值,一般的格式为:I/O口的脚位和模式;比如这个实验中的控制LED灯I/O 的值的程序是:
#define LED0 PBout(5)
#define LED1 PEout(5)
2-2:初始化输入/输出I/O口:
2.2-1:调用对应的I/O口初始化文件;
2-2-2:定义一个类型,并使能对应的GPIO,设置PIN脚,模式,并初始化。
2-2-3:按键输入处理:
//mode:0 不支持连续按键;1 支持连续按键
//0,没有任何按键按下;1.KEY0按下;2.KEY1按下;3.KEY2按下;4.WK_UP按下
//函数优先级:KEY0>KEY1>KEY2>WK_UP
u8 KEY_Scan(u8 mode)//扫描I/O口是否有按键按下
{
static u8 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 KEY0_PRES;
else if(KEY1 ==0)return KEY1_PRES;
else if(KEY2 ==0)return KEY2_PRES;
else if(WK_UP ==1)return WKUP_PRES;
}
else if(KEY0 ==1&&KEY1 ==1&&KEY2 ==1&&WK_UP ==0)key_up =1;
return 0;//无按键按下
}
2-2-4:按键初始化I/O:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3
#define KEY0_PRES 1//按键K0按下
#define KEY1_PRES 2//按键K1按下
#define KEY2_PRES 3//按键K2按下
#define WKUP_PRES 4//按键WKUP 按下
void KEY_Init(void);
u8 KEY_Scan(u8);
#endif
其中按键读取可以写成:
#define KEY0 PEin(4)
#define KEY1 PEin(3)
#define KEY2 PEin(2)
#define WK_UP PAin(0)
3.主函数编写
3-1:调用延时函数,LED函数,蜂鸣器函数,按键输入函数:
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
3-2:I/O口初始化:
vu8 key = 0;
delay_init();//延时函数初始化
LED_Init();//LED端口初始化
KEY_Init();//初始化与按键连接的硬件接口
BEEP_Init();//初始化蜂鸣器
LED0 = 0;//先点亮LED0
3-3;按键控制:
while(1)
{
key = KEY_Scan(0);//提取按键值
if(key)
{
switch(key)
{
case WKUP_PRES:
BEEP = ! BEEP ;break;//WKUP按下,控制蜂鸣器
case KEY2_PRES:
LED0 = ! LED0 ;break;//KEY2按下,控制LED0翻转
case KEY1_PRES:
LED1 = ! LED1;break;//KEY1按下,控制LED1翻转
case KEY0_PRES:
LED0 =! LED0;
LED1 =!LED1;break;//KEY0按下,控制LED0,LED1翻转
}
}else delay_ms(10);
}
以上 即为按键输入控制的代码。