GPIO 输入之按键轮询 | 学习笔记

简介: 快速学习 GPIO 输入之按键轮询

开发者学堂课程【嵌入式之 RFID 开发与应用2020版:GPIO 输入之按键轮询】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/665/detail/11153


GPIO 输入之按键轮询

接一个按键,假设这个按键是接在了 PA1 一和 PA0 上面。按键的工作原理:把开关一个引脚接在 PA1,另一个引脚接在 PA0。如果开关没有按下去,PA1 和 PA0 没有关系,但一旦这个按键按下去了,PA1 和 PA0 的电平就是一样的了。

image.png

可以让 PA0 工作在一个输出状态,输出 1 输出 0 都可以。输出 0 的话,PA1 默认情况下给其一个上拉电阻,就保证了 PA0 和 PA1 这两个引脚在没有按下按键的情况下是不一样的。如果当这个按键按下去的时候,由于 PA0 是 0,才使得 PA1 也跟着成了 0。所以只需要判断 PA1 有没有从 1 变成 0 来判断有没有按下按键。

将下程序输入,叫作键盘的初始化:

Void led-int(void)

{

GPIO-InitTypeDef   GPIO-InitStructure;

RCC-APB2PeriphclockCmd(RCC-XXX-LED, ENABLE);

GPIO-InitStructure,GPIO-Pin=GPIO-XXX-LED;

GPIO-InitStructure,GPIO-Mode=GPIO-Mode-Out-PP;

GPIO-InitStructure,GPIO-Speed=GPIO-Speed-2MHZ;

GPIO-Init(GPIO-XXX-LED-PORT,& GPIO-InitStructure);

GPIO-XXX-LED-OFF():

}

现在用到 GPIOA,用的是 A0 和 A1 引脚,如果引脚有多个,没有必要重复去写,只需要扩上另一个就可以了。这里还不能用或,因为这两个引脚的工作方式不一样,一个输入一个输出所以这还是要分开写,这里的 io 口当然就是 GPIOA。

接下来再复制上面的代码做成两个 io,A0 的 iO 做成输出,输出低电平,GPIOA,A0 引脚。A1 的 iO 做成输入,ipu 上拉输入,频率不变。一个是输入,一个是输出,然后这个时钟都是 A。

按键的初始化做完之后,直接判断 io 口的值是多少。resetbits 是在设置电平的状态,是清零的,现在不是要至零了,要输入就要去读取输入的 io,参数就是 gpioa除去 a 的几个广角,0 是用作输出,1 是输入。读取的值如果等于 0 就表示这个按键被按下,按下了让灯和蜂鸣器都响起来,否则就关掉,具体代码修改完成后如下:

Int main(void)

{

Led-int();

Beep-init();

Key-init();

Whie(1){

If(GPIO-ReadInputDataBit(GPIOA,GPIO-Pin-1)==0){

LED-XXX-ON();

BEEP-XXX-ON();

delay-ms(300);

}else{

LED-XXX-OFF();

BEEP-XXX-OFF();

delay-ms(300);

}

编译,复位,出现问题蜂鸣器反了,修改为

#define BEEP_XXX_ON() GPIO_SetBits(GPIO_XXX_BEEP_PORT,GPIO_XXX_BEEP)

#define BEEP_XXX_OFF() GPIO_ResetBits(GPIO_XXX_BEEP_PORT,GPIO_XXX_BEEP)

之前接反了,重新复位,运行正常,A0A1 上接了两个按键,

image.png

如图所示为之前接的蜂鸣器,还有按键接到 A0A1 上面,按动按键,灯也会随着闪烁,

image.png

这就是输入输出通过 IO 口蜂鸣器 LED 和按键的演示。但是还是存在一些问题,按键的主循环里做了一件事情判断按键,学习中断时就不要判断放到主循环中。

相关文章
|
人工智能 前端开发 Devops
.NET技术在现代开发中的作用:.NET技术的核心价值、在现代应用开发中的实际应用、以及面临的挑战与未来趋势。
.NET技术是软件开发领域的核心力量,本文从其核心价值、实际应用及未来挑战三方面进行探讨。它支持多种语言,提供强大的开发工具和丰富的类库,并具备跨平台能力。在现代应用开发中,.NET广泛应用于企业级系统、Web应用、移动应用、云服务和游戏开发等领域。面对性能优化、容器化、AI集成等挑战,.NET持续创新以适应不断发展变化的技术环境。
446 4
|
设计模式 存储 缓存
Java中的抽象类、接口、设计模式、包装类和泛型(附带相关面试题)
一.抽象类(abstract),二.接口(interface),三.设计模式,四.包装类,五.泛型
741 0
|
前端开发 JavaScript
[项目篇]vue3+ts 移动端和pc端双端实现瀑布流 - 第六天
[项目篇]vue3+ts 移动端和pc端双端实现瀑布流 - 第六天
|
4月前
|
人工智能 运维 安全
2026年阿里云GPU云服务器全解析:GPU卡规格、收费价格及使用场景指南
阿里云GPU云服务器(EGS)提供高性能、弹性可扩展的算力支持,覆盖模型训练、智能驾驶、图形渲染等全场景AI应用。2026年全新升级,涵盖T4、A10、V100、L20等多元GPU卡型,匹配不同算力需求。支持包年包月、按量付费、抢占式实例等多种计费模式,结合节省计划与智能调度,助力企业降本增效。广泛应用于大模型推理、计算机视觉、科学计算等领域,具备安全合规、高可用、易用性强、生态完善等核心优势,是企业数字化转型与AI创新的坚实底座。
|
人工智能 安全 Java
片段式代码VS完整工程生成:飞算JavaAI如何让开发者告别碎片化开发?
飞算 JavaAI 是一款基于大模型的智能开发平台,旨在解决传统开发中的“碎片化困局”。它通过“智能引导开发五步法”,从需求分析到工程代码交付实现全链路智能化。不仅能生成高质量代码片段,更能直接输出可运行的完整工程,帮助开发者摆脱重复性劳动,专注于系统架构设计和业务创新,推动软件开发从“体力劳动”向“脑力创造”转变,开启高效开发新时代。
|
人工智能 自然语言处理 API
研究大模型门槛太高?不妨看看小模型SLM,知识点都在这
大型语言模型(LLM)在文本生成、问答等领域表现出色,但也面临资源受限环境应用难、领域知识不足及隐私问题等挑战。为此,小型语言模型(SLM)逐渐受到关注,其具备低延迟、成本效益高、易于定制等优点,适合资源受限环境和领域知识获取。SLM可通过预训练、微调和知识蒸馏等技术增强性能,在自然语言处理、计算机视觉等领域有广泛应用潜力。然而,SLM也存在复杂任务表现有限等问题,未来研究将进一步提升其性能与可靠性。 论文链接:https://arxiv.org/abs/2411.03350
711 5
|
机器学习/深度学习 数据采集 人工智能
《大模型训练成本高,如何在不牺牲性能的前提下破局》
在人工智能领域,大模型训练成本高昂,主要源于硬件设备、数据处理和算法优化的需求。降低训练成本的关键在于合理配置硬件资源、改进数据处理方法、优化算法和模型结构,以及采用分布式训练技术。通过这些措施,企业可以在不影响模型性能的前提下,显著减少计算资源、人力和时间的投入,实现更高效的模型训练。实践证明,综合运用这些方法能够有效降低成本,推动人工智能技术的可持续发展。
1048 18
|
人工智能 程序员 iOS开发
一文彻底学会HarmonyOS的AI编程助手
本文介绍了华为官方AI辅助编程工具CodeGenie,该工具支持HarmonyOS NEXT领域的智能问答、ArkTS代码补全/生成及万能卡片生成,显著提升开发效率。安装步骤包括下载插件、离线安装及授权登录,功能涵盖知识问答、代码补全与生成、以及智能生成HarmonyOS万能卡片。
681 0
|
存储 缓存 NoSQL
【Redis从头学-6】Redis中的Hash数据类型实战场景之购物车
【Redis从头学-6】Redis中的Hash数据类型实战场景之购物车
1160 0
|
调度 项目管理 计算机视觉
『软件工程8』软件项目进度安排与跟踪,一招学会计算关键路径
该文章详细解释了如何在软件项目管理中安排进度与跟踪,特别是如何计算和利用关键路径方法(CPM)来优化项目时间管理。

热门文章

最新文章