当前位置: 首页 > news >正文

按键输入实验

按键输入实验

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

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

http://www.xdnf.cn/news/802783.html

相关文章:

  • 如何把大容量10G的文件分享给别人?附上详细步骤!
  • 文字链接_新生命讲道目录及音频、文字链接(20200127更新)
  • CCF-201812-2-小明放学 JAVA代码20分求大神看看哪里错了
  • Linux Nexus3.X介绍与操作
  • 最热网友收藏
  • VPP系统 配置IPSec IKEv2 远端地址any
  • 原创:Nginx反向代理实战部署
  • 浏览器中的data类型的Url格式,data:image/png,data:image/jpeg! 收藏 苏生不惑 发表于 4年前 阅读 3943 收藏 3 点赞 0 评论 0 腾讯云·
  • 合格证标签图片_合格证图片_合格证模板_合格证设计素材下载
  • [Traversy Media | HTML CSS] Flexbox CSS In 20 Minutes
  • Spring MVC简介附入门案例
  • MPMoviePlayerController 电影播放器—IOS开发
  • 2023年5个美国代理IP推荐,最佳代理花落谁家?
  • MFC多线程使用进度条
  • 病狗问题 (逻辑推理)
  • 生成重复_王者荣耀空白名 可以生成空白名/重复名/特殊名/超长名字
  • 黑客入门指南,学习黑客必须掌握的技术
  • 详解SQL中的触发器
  • 用户界面设计可用性的基本常识介绍
  • 怎么让网页变成黑白色
  • Ubuntu安装深度音乐深度影音
  • 【嵌入式 C】嵌入式开发神器—SourceInsight的使用教程
  • 免费天气插件 免费天气预报 天气预报代码 天气预报模块
  • (2)OLEDB数据库操作
  • 我账户不显示pop3服务器地址,Hotmail 邮箱POP3服务器的设置方法
  • Pro/E二次开发入门详细教程
  • vs2008怎么创建c语言程序,VS2008的使用
  • 如何使用HTML制作个人网站( web期末大作业)
  • 数码变焦是什么
  • Avast! 4 Server 服务器版license许可文件获得方法