按键输入实验

按键输入实验

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);
	}

以上 即为按键输入控制的代码。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值