stm32按键输入实验c语言,stm32f103学习笔记(三)按键输入(IO口输入)

学stm32第三天了,才学到按键输入,这进度也是醉了。。。谁叫俺c语言基础不行,还没有学过模数电呢。。

开发板上有4个按键:key0,key1,key2和wk_up,分别接在PE4,PE3,PE2和PA0上:

6f595b9e3c07f3afd52debedfd83cd5b.png

KEY0、 KEY1 和 KEY2 是低电平有效,而 WK_UP 是高电平有效,接下来就是新建key.c和key.h导入工程了:

#include"key.h"

#include"sys.h"

#include"delay.h"

//按键初始化函数

voidKEY_Init(void)//IO初始化

{

GPIO_InitTypeDefGPIO_InitStructure;

157

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|

RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//GPIOE.2~4

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设置成上拉输入

GPIO_Init(GPIOE,&GPIO_InitStructure);//初始化GPIOE2,3,4

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//初始化WK_UP-->GPIOA.0

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//PA0设置成输入,下拉

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA.0

}

//按键处理函数

//返回按键值

//mode:0,不支持连续按;1,支持连续按;

//0,没有任何按键按下;1,KEY0按下;2,KEY1按下;3,KEY2按下;4,KEY3按下WK_UP

//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!

u8KEY_Scan(u8mode)

{

staticu8key_up=1;//按键按松开标志

if(mode)key_up=1;//支持连按

if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))

{

delay_ms(10);//去抖动

key_up=0;

if(KEY0==0)returnKEY_RIGHT;

elseif(KEY1==0)returnKEY_DOWN;

elseif(KEY2==0)returnKEY_LEFT;

elseif(KEY3==1)returnKEY_UP;

}elseif(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;

return0;//无按键按下

}

首先要设置GPIO234和GPIOA的初始化,前三个是上拉输入,后一个是下拉输入。

重要的是这个按键扫描函数,static是静态关键字,只允许定义一次,mode是判断是否连按的参数,如果mode=0,则不连按,这时按下之后,经过去抖,令按键松开标志为0,好吧,我就是卡在这了,导致按下时led一直挂不住,其实少了这一句,就相当于连续按键了,然后再判断是哪一个按键按下,返回给主函数。如果没有按键按下,则进入else,重新令key_up为1,然后循环检测。。。

另外,key.h里:

#ifndef__KEY_H

#define__KEY_H

#include"sys.h"

#defineKEY0GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0

#defineKEY1GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1

#defineKEY2GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2

#defineKEY3GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP)

#defineKEY_UP4

#defineKEY_LEFT3

#defineKEY_DOWN2

#defineKEY_RIGHT1

voidKEY_Init(void);//IO初始化

u8KEY_Scan(u8);//按键扫描函数

#endif

再看主函数:

#include"led.h"

#include"delay.h"

#include"key.h"

#include"sys.h"

#include"beep.h"

intmain(void)

{

u8t;

delay_init();//延时函数初始化

LED_Init();//LED端口初始化

KEY_Init();//初始化与按键连接的硬件接口

BEEP_Init();//初始化蜂鸣器端口

LED0=0;//先点亮红灯

while(1)

{

t=KEY_Scan(0);//得到键值

if(t)

{switch(t)

{caseKEY_UP://控制蜂鸣器

BEEP=!BEEP;break;

caseKEY_LEFT://控制LED0翻转

LED0=!LED0;break;

caseKEY_DOWN://控制LED1翻转

LED1=!LED1;break;

caseKEY_RIGHT://同时控制LED0,LED1翻转

LED0=!LED0;LED1=!LED1;break;

}

}elsedelay_ms(10);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMF调用摄像头粉屏的问题(win10 64位系统)

最近突然想做一个人脸识别的程序,图像的获取可以从本地或者摄像头获取。 1、从本地获取比较简单,不多说。 2、从摄像头获取图片。网上查了一下,都是用的JMF(但是JMF已经很久没有更新,而且只支持32位的JDK,如果知道有更…

科技部5个6G重点项目

来源:5G重要信息未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图…

mysqlsql怎么比较当前月与去年的这个月的同比_沃尔沃汽车8月全球销量同比增7.2% 中美两大地区领涨...

加入盖世行业交流群,请加微信(盖世汽车冬冬:gasgoo2015)出示名片,了解更多行业资讯盖世汽车讯 根据沃尔沃汽车官方发布的销量数据,今年8月份,得益于广受欢迎的SUV系列产品,该公司继续保持强劲的销售势头&am…

c#语言程序设计上机实验,C#语言程序设计基础实验指导(第3版)

第1章 绪论1.1 知识点回顾1.2 实验目的和要求1.3 实验内容1.4 实验指导实验1-1 模拟电子邮箱注册实验1-2 创建和调用C#类库程序1.5 补充上机练习第2章 C#数据类型2.1 知识点回顾2.2 实验目的和要求2.3 实验内容2.4 实验指导实验2-1 字符及其ASCII码转换实验2-2 使用ConsoleColo…

POI(java 操作excel,word等)编程

一、下载所需jar包 下载地址:http://poi.apache.org/download.html http://download.csdn.net/detail/likai22/534250 二、上代码 package com.sxdx.excelpoi.action;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.File…

一文读懂测序技术在新冠病毒检测中的应用(文末附FAQ)

来源:生物探索随着世界疫情的发展,多个国家进入公共卫生紧急状态,全球科学家都在抓紧研究更好的检测、治疗、防控手段。从最初未知β属冠状病毒的快速鉴定到病毒序列的完整破译,再到病毒序列的变异监测,高通量测序技术…

可以用中文编写python_用中文也能寫Python程式

目前的程式設計中,Android平臺上的App開發算是相當熱門,從電腦書的熱賣,也可看出端倪。在網路書店博客來2011年的年度暢銷榜中,就有好幾本是關於Android開發的電腦書,其中奪下電腦類別第五名的就是《Google!Android 3手…

c 高级语言,C作为高级语言?

So, what C do YOU use in you practice? Do you mix the styles, say, arrays and vectors? Are there any rules or best practices here?…现代C,绝对。但是在我看来,这并不排除阵列。仍然存在阵列优于载体的情况。但是当我使用数组时,…

2020技术趋势报告-中文版

来源:德勤咨询今年的技术趋势报告继续在开篇回顾了11年来的技术趋势发展,展示了技术趋势随时间推移的演进全过程,及最新宏观科技力量作为业务转型基础带来的共生效益,和不久的未来的新兴科技力量。随着企业需要适应不断变化的技术…

HBase:分布式列式NoSQL数据库

传统的ACID数据库,可扩展性上受到了巨大的挑战。而HBase这类系统,兼具可扩展性的同时,也提出了类SQL的接口。 HBase架构组成 HBase采用Master/Slave架构搭建集群,它隶属于Hadoop生态系统,由一下类型节点组成&#xff1…

LINUX装魂斗罗游戏,魂斗罗战甲1-支援形态装置搭配思路及攻略

哈喽,老伙计们大家好,虽然真魂战甲这个机制已经出了有段时间了,但是今天我还是要给大家搞一个深度攻略,别问!问就是真男人必须开机甲!其实是很多小伙伴向我吐槽血隼副本和虚空副本太过变态,自己…

ui和python_python 将ui转成py(和UI文件放在同一目录,运行)

-- coding: utf-8 --【简介】ui转换成py的转换工具import osimport os.pathUI文件所在的路径dir ./列出目录下的所有ui文件def listUiFile():list []files os.listdir(dir)for filename in files:#print( dir os.sep f )#print(filename)if os.path.splitext(filename)[1]…

好文 | “智能经济”时代,协作机器人的应用前景与趋势探讨

来源:赛迪顾问本文要点一、协作机器人定义及分类二、全球协作机器人发展概况三、中国协作机器人发展概况四、中国协作机器人发展面临瓶颈及趋势展望1、研发设计人才短缺,协作机器人产业创新驱动力不强2、核心零部件技术缺失,是制约我国工业机…

C/C++ scanf 函数中%s 和%c 的简单差别

首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf。getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取)。另外特别注意键盘上敲入回车实际为“\r…

c语言求100以内整除13的最大,VB程序设计的一道题,找出100以内能被3整除的所有数之和,并把值保存在一维数组中...

VB程序设计的一道题,找出100以内能被3整除的所有数之和,并把值保存在一维数组中以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!VB程序设计的一道题,找出1…

Cdn英文的读音音标_宋sir的美式音标教程 Unit 1 /i/ tea

剑桥国际英语语音教程(Pronunciation Pairs)是一本很优秀的美式口音学习教材,其特点是对一些读音相近的音标进行对比,可以帮助学习者进行更准确地道地发音。该教材唯一的缺点就是不够深入,很多知识点并没有进一步详细阐…

兰德报告:思维机器时代的威慑

来源:中国指挥与控制学会从全球来看人工智能和自主系统在军事上的应用逐渐增多,这可能影响危机和冲突中使用的威慑策略以及冲突的升级变化。到目前为止,威慑主要指人类设法阻止其他人采取特定行动的行为。如果参与思维和决策过程的不止人类&a…

c语言设计一维数组,一维数组 (1)C语言程序设计.pdf

C语言程序设计一维数组 C语焉不详内容提要1 一维数组的定义2 一维数组的初始化3 一维数组的引用怎样学好C语言?引例【案例】从键盘上输入某学科竞赛组6名成员的成绩(整数),求平均成绩、并找出最高分和最低分。分析:6名学生的成绩,…

在windows 2008 R2上安装sharepoint 2013时遇到提示必须安装 .netframeword4.5的处理办法...

近日,有个客户需要个测试环境,需要搭建一个sps2013的测试服务器 但基于服务器软件授权的考虑,让使用windows2008 作为系统服务器 但一安装就碰到个提示,要求先安装framework4.5。结合以往的经验 ,估计是系统太新了。后…

转子接地保护原理_转子一点接地保护和转子两点接地保护的作用及发生的原因和处理...

转子一点接地保护和转子两点接地保护的作用及发生的原因和处理转子一点接地保护:作用:用于监视发电机转子励磁回路绝缘(即发生接地或某处绝缘下降时报警)发生的原因:滑环绝缘环,转子槽口绝缘损坏,引线绝缘损坏&#xf…