历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

2021年02月20日 | 按键实验(GPIO的输入模式)

2021-02-20 来源:eefocus

@按键实验(GPIO的输入模式)


#引言

在之前的实验中,小罗同学使用的都只是GPIO的输出模式,这次的按键实验虽然比较简单,但也是我第一次接触GPIO的输入,所以还是想写点东西记录一下。


#按键模块电路图

我手中的开发板除去复位按键后还有其余四个按键,电路结构图如下:

在这里插入图片描述

以上四个按键所对应的管脚编号分别为:PA0、PE4、PE3、PE2。由图可知,KEY_UP为高电平有效,其他三个均为低电平有效。


#按键配置

大家都知道,在使用引脚之前首先要进行相应的配置来初始化,相关代码如下:


void KEY_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct; //先对挂接在PA0的KEY_UP进行配置

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENABLE);

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_DOWN; //由于改端口高电平视为有效,所以默认为低电平

GPIO_Init(GPIOA,&GPIO_InitStruct);


GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;

GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP; //由于改端口低电平视为有效,所以默认为高电平

GPIO_Init(GPIOE,&GPIO_InitStruct);

}


这里要注意的是要根据电路图的连接来判断究竟是选择GPIO_PuPd_UP还是GPIO_PuPd_DOWN(我就是因为这里的配置错误而调了半天╮(╯▽╰)╭)


#扫描函数

初始化配置完成之后,接下来要进行的就是利用判断语句来判断究竟是哪个引脚接收到了有效电平,由于这里我们需要一个返回值,所以定义为u8类型,而形参mode则用于选择是连续扫描还是单次扫描。


u8 KEY_scan(u8 mode)      //自定义扫描函数即模式。mode为1时,连续扫描;为0时为单次扫描

{

u8 flag=1;  //flag作为一个标志数,若为1则表示需要进行判断

if(flag&&(KEY_UP==1||KEY_LEFT==0||KEY_DOWN==0||KEY_RIGHT==0)) //判断是否有按键按下

{

flag=0;

delay_nms(10);  //通过延时消除按键抖动,再次进行按键的判断

if(KEY_UP==1)  //由于KEY_UP为高电平有效,所以若为1,则证明该按键按下,返回相应的key_up,以下同理。

{

return key_up;

}

else if(KEY_LEFT==0)

{

return key_left;

}

else if(KEY_DOWN==0)

{

return key_down;

}

else if(KEY_RIGHT==0)

{

return key_right;

}

}

else if(KEY_UP==0&&KEY_LEFT==1&&KEY_DOWN==1&&KEY_RIGHT==1)

{

flag=1;

}

if(mode==1)

{

flag=1;

}

return 0;

}


在上面的代码中,运用到了头文件中的两部分宏定义,分别为:


#define KEY_UP PAin(0) //PAin(0)等函数的封装详见我的另一篇博文(https://blog.csdn.net/qq_45683640/article/details/105476554)

#define KEY_LEFT PEin(2)

#define KEY_DOWN PEin(3)

#define KEY_RIGHT PEin(4)


#define key_up 1  //在这里,1 2 3 4并没有重要的实际含义,只是进行区别的返回值,不为0即可

#define key_left 4

#define key_down 3

#define key_right 2


相关的解释我基本上在注释里写的比较清楚了,有问题的小伙伴阔以留言评论哈~


#实验主程序


#include "stm32f4xx.h"

#include "led.h"

#include "bit_operation.h"

#include "Systick.h"

#include "beep.h"

#include "key.h"


int main()

{

BEEP_Init();

KEY_Init();

SysTick_Init(168);  //系统时钟为168M

RCC_HSE_Config(8,336,2,7);

LED_Init();

int key;

while(1)

{

key=KEY_scan(0);

switch(key)

{

case key_up: led2=0; break;  //灯亮

case key_left: beep=0; break; //蜂鸣器不响

    case key_down: led2=1; break;  //灯灭

    case key_right: beep=1; break; //蜂鸣器响

}

}

}



推荐阅读

史海拾趣

Festo公司的发展小趣事

Festo公司成立于1925年,由Albert Fezer和Gottlieb Stoll两位创始人共同创立。最初,公司专注于木工机械和木工工具的生产,其品牌Festool在行业内享有盛誉。凭借对工艺的精湛掌握和对品质的严格把控,Festo迅速在木工机械领域崭露头角,为公司的后续发展奠定了坚实的基础。

Deutronic Elektronik GmbH公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Deutronic Elektronik GmbH始终坚持创新驱动和可持续发展的理念。公司不断推出新产品、新技术和新服务,以满足客户的不断变化的需求。同时,公司也注重环境保护和可持续发展,积极推广绿色能源和环保技术,为社会和环境做出了积极贡献。

DACHANG公司的发展小趣事

DACHANG公司深知创新是企业发展的根本动力。因此,公司始终将创新作为自己的核心竞争力,不断推出具有创新性的产品和解决方案。无论是产品设计、技术研发还是市场营销,DACHANG公司都积极引入新的理念和模式,为公司的发展注入了源源不断的活力。

Fascomp公司的发展小趣事

为了进一步提升技术实力和市场竞争力,Fascomp积极寻求与国际知名企业的技术合作。通过与多家跨国公司的联合研发项目,Fascomp成功吸收和借鉴了国际先进的技术和管理经验。此外,公司还积极拓展海外市场,产品远销欧美、亚洲等多个国家和地区,进一步提升了公司的国际化水平。

AverLogic公司的发展小趣事

AverLogic公司在电子行业中以其技术创新和产品突破而崭露头角。在早期的发展阶段,公司专注于研发高质量的视频处理芯片,以满足市场对于更高清晰度和更流畅视频播放的需求。经过多次实验和迭代,公司成功推出了一款具有革命性的转换器产品——AL110,这款产品能够将PC和Macintosh的VGA信号转换为高品质的NTSC或PAL信号,从而极大地提升了视频信号的处理效率和输出品质。这一创新不仅为公司赢得了市场的认可,也为公司在电子行业中奠定了坚实的基础。

Franel Corp公司的发展小趣事

面对中国市场的多样化和个性化需求,法勒公司积极提供定制化解决方案。无论是复杂的物流系统改造,还是特殊环境下的设备供电需求,法勒都能凭借其专业的技术团队和丰富的项目经验,为客户提供量身定制的解决方案。这种以客户为中心的服务模式,不仅增强了客户粘性,也进一步巩固了法勒在中国市场的领先地位。

问答坊 | AI 解惑

求vxworks网络驱动开发资料

求vxworks网络驱动开发资料…

查看全部问答>

我来说下关于论坛的看法(如果发错板块了,请版主见谅阿)

很久没上论坛了啊,最近一段时间太忙,今天上了下,发现人气还是很火,真的不错,现在很多的论坛,qq群虽然都很多人,但是讨论的太少,交流也有限。(不知道是不是人人都不爱说话的原因) 我支持我们这个论坛,希望能一直这么热闹下去,和大家一起 ...…

查看全部问答>

打印机数据获取

一台仪器(由专用微机控制, 输出为USB打印机接口),其输出为打印机 现,想把这台仪器输出的数据到PC上,编辑后,再打印 Q: 现在: 仪器  --- 输出 ---> 打印机(USB) 需求: 仪器  --- 输出--->PC(编 ...…

查看全部问答>

单片机开发深度资料

单片机开发深度资料…

查看全部问答>

吉他 电子 发展方向 研究领域

各位IT界的专家和同行们,你们有喜欢吉他的吗?我想了解一下有关吉他方面的电子发展前景,比如吉他的拾音器等等。谢谢!…

查看全部问答>

请问下UCOS+ARM9模式下如何编写串口通信

请问下UCOS+ARM9模式下如何编写串口通信 最近将UCOS移植到了ARM9下,但是编写串口通信时出了问题,主要是目前串口无法接受到PC机上的数据,请问各位朋友有谁碰到过类似的问题?…

查看全部问答>

USB资料共享

小弟最近学习USB,发现论坛这方面资料很少。上传些,希望大家能多多交流。…

查看全部问答>

在CCSV5怎样加载IAR工程

在CCSV5怎样加载IAR工程,求教…

查看全部问答>

开关AD中断会影响AD转换结果?

程序中在计算数值的时候将AD中断关闭,计算完成后再将AD中断打开,但是现在发现在AD采样率低的时候AD转换结果没问题,但是提高了采样率,AD结果就不对了,寄存器显示OVERRUN,貌似是数据丢失或者覆盖,这是咋回事呢? 开关AD中断不该影响AD转换啊? ...…

查看全部问答>

cc2650dk运行contiki-os

本帖最后由 lyzhangxiang 于 2015-7-2 23:07 编辑 搭建了一下开发环境,已经能够运行contiki了,基本和我预料的一样,分分钟可以跑contiki,就是这么easy。 最简单的hello-world 复杂一点的cc26xx-web-demo 效果 mqtt+coap+sensor ...…

查看全部问答>