历史上的今天
返回首页

历史上的今天

今天是:2024年09月29日(星期日)

正在发生

2018年09月29日 | STM32f4按键输入实验代码(02)

2018-09-29 来源:eefocus

接下来我们看看头文件 key.h 里面的代码:

#ifndef __KEY_H

#define __KEY_H    

#include "sys.h"  

 

 

#define KEY0      GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4

#define KEY1      GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)  //PE3  

#define KEY2      GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2

#define WK_UP         GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)  //PA0

 

#define KEY0_PRES    1

#define KEY1_PRES  2

#define KEY2_PRES  3

#define WKUP_PRES   4

 

void KEY_Init(void);  //IO 初始化

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

#endif

这段代码里面最关键就是4个宏定义:

#define KEY0      GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4

#define KEY1      GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)  //PE3  

#define KEY2      GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2

#define WK_UP         GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)  //PA0

这里使用的是调用库函数来实现读取某个 IO 口的 1 个位的。同输出一样,上面的功能也同样可以通过位带操作来简单的实现:

#define KEY0      PEin(4)      //PE4

#define KEY1      PEin(3)    //PE3  

#define KEY2      PEin(2)    //P32

#define WK_UP         PAin(0)    //PA0

用库函数实现的好处是在各个 STM32 芯片上面的移植性非常好,不需要修改任何代码。用位带操作的好处是简洁,至于使用哪种方法,看各位的爱好了。

在 key.h 中,我们还定义了 KEY0_PRES  /  KEY1_PRES/  KEY2_PRES/WKUP_PRESS 等 4个宏定义,分别对应开发板四个按键(KEY0/KEY1/KEY2/  KEY_UP)按键按下时KEY_Scan返回的值。通过宏定义的方式判断返回值,方便大家记忆和使用。

最后,我们看看main.c里面编写的主函数代码如下:

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "beep.h"

#include "key.h"

int main(void)

{  

      u8 key;           //保存键值

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

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

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

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

  LED0=0;         //先点亮红灯

  while(1)

  {    key=KEY_Scan(0);    //得到键值

        if(key)

    {  switch(key)

      {  case WKUP_PRES:  //控制蜂鸣器

          BEEP=!BEEP;

          break;

        case KEY0_PRES: //控制 LED0 翻转

          LED0=!LED0;

          break;

        case KEY1_PRES: //控制 LED1 翻转    

          LED1=!LED1;

          break;

        case KEY2_PRES: //同时控制 LED0,LED1翻转  

          LED0=!LED0;

          LED1=!LED1;

          break;

      }

}else delay_ms(10);  

}

}

主函数代码比较简单,先进行一系列的初始化操作,然后在死循环中调用按键扫描函数KEY_Scan()扫描按键值,最后根据按键值控制LED和蜂鸣器的翻转。


推荐阅读

史海拾趣

南京中科微公司的发展小趣事

CSM成立以来,一直致力于研发具有自主知识产权的射频/模拟关键芯片。经过数年的辛勤耕耘,团队成功开发出了多款高性能的集成电路芯片与模块,其中不乏在功耗、成本、性能等方面达到国际先进水平的产品。这些技术突破不仅为公司赢得了市场的认可,也为国内电子行业的发展注入了新的活力。

ARRA Inc公司的发展小趣事

CSM深知在半导体领域,合作是实现共赢的关键。因此,公司积极与TSMC、UMC、SMIC等国内外领先的半导体芯片厂商建立合作关系,共同推进流片生产和技术研发。这种合作模式不仅提高了CSM的生产效率和产品质量,也促进了整个半导体产业链的发展。

ATP [ATP Electronics]公司的发展小趣事

面对工业应用领域的特殊需求,ATP敏锐地捕捉到了市场机遇。公司成功推出了业界首款工业级SLC e.MMC产品E800Pi,这款产品以其高达6万次的单元擦写耐久性和出色的耐高温、交叉温度能力,受到了工业领域的广泛认可。E800Pi的推出,不仅拓宽了ATP的产品线,也进一步提升了公司在工业存储解决方案领域的市场地位。

Alutronic Kuhlkorper Gmbh & Co Kg公司的发展小趣事

面对工业应用领域的特殊需求,ATP敏锐地捕捉到了市场机遇。公司成功推出了业界首款工业级SLC e.MMC产品E800Pi,这款产品以其高达6万次的单元擦写耐久性和出色的耐高温、交叉温度能力,受到了工业领域的广泛认可。E800Pi的推出,不仅拓宽了ATP的产品线,也进一步提升了公司在工业存储解决方案领域的市场地位。

Ferroxcube公司的发展小趣事

在全球经济一体化的背景下,Ferroxcube公司意识到拓展国际市场的重要性。为了进一步扩大业务范围,公司决定在欧洲、亚洲和北美等地设立分支机构,以更好地服务当地客户。

通过在各地设立销售和服务中心,Ferroxcube成功地打入了多个国际市场。公司的产品和服务得到了越来越多国际客户的认可和赞赏。同时,公司也积极与当地的研究机构和高校合作,共同推动磁性元件技术的创新和发展。

这些国际市场的成功拓展不仅为Ferroxcube带来了更多的业务机会和收入来源,还进一步提升了公司在全球电子行业中的地位和影响力。如今,Ferroxcube已经成为了全球知名的磁性元件供应商之一,为电子行业的发展做出了重要贡献。

智浦欣(Chipstar)公司的发展小趣事

在2010年4月的上海张江高科技园区,一群志同道合的工程师和创业者聚集在一起,共同创立了上海智浦欣微电子有限公司。他们怀揣着对模拟及数模混合IC技术的深厚理解和热爱,立志要在消费类电子市场占据一席之地。起初,公司面临着资金紧张、技术挑战和市场压力等多重困难,但团队成员凭借对技术的执着和对市场的敏锐洞察,逐步攻克难题,研发出了几款性能优越的音频放大器和电源管理产品,为公司赢得了初步的市场认可。

问答坊 | AI 解惑

安防的网站,倒掉一大堆啊~~

最近因为需要安防方面的资料,于是找了一些网站,之前一些去过一两次的网站,关门的关门,倒闭的倒闭。 呜呼哀哉!…

查看全部问答>

红外遥控器检测系统(毕业设计系列)

本帖最后由 paulhyde 于 2014-9-15 08:54 编辑  …

查看全部问答>

LM3S8962 之光电曲线测试仪原理图献给大家

使用LM3S8962芯片做的第一个项目,现在进行到制板阶段,特向坛坛共享自己的画的原理图,请大家多多指正!…

查看全部问答>

有折腾QEMU的高人吗,问一个中断的问题

我想模拟一个外部中断,然后执行中断处理程序,就像定时器或是UART子类的外部设备,但是不知道哪一个函数用来产生中断,另外中断处理程序有什么讲究吗,跟普通的386嵌入式系统应该一样吧。。。 我用的是0.10.5的源码。…

查看全部问答>

U 盘识别问题

WinCE5.0 插入U 盘后可以在Storage Manager中看到DSK1:USB Hard Disk Driver 但没有Hard Disk的盘符出现 但我Format插入的U盘,再New一个分区后就可以看到Hard Disk盘符了,此时查看分区的属性是 DOS4_FAT(0x06),而一般的U盘是DOS32(0xob)类 ...…

查看全部问答>

本人设计一个信号发生器遇到了困难,各位大侠帮帮小弟啊!急求!

本人现在设计一个基于80C51单片机的信号发生器,要求能够输出方波,正弦波及幅值可调,范围在(—10至+10)。我已经知道在单片机外接一个DA就可以输出波形,但如何使幅值的范围在(—10至+10)我就不知道了,希望大家帮帮偶!!!!!!!!…

查看全部问答>

程序编译不过,怎么回事,用以前的版本可以编译过的

程序编译不过,提示如下,怎么回事,用以前的版本可以编译过的,难道是编译器的差异??? Clean: Deleted file \"F:\\PIC\\zhubogonglvji\\startup.rlf\".Clean Warning: File \"F:\\PIC\\zhubogonglvji\\doprnt.p1\" doesn\'t exist.Clean Warni ...…

查看全部问答>

树莓派与HDMI转VGA推荐,以及黑屏无信号问题

自从树莓派论坛官方网店上线以后,每天都有5个以上的客户反应,显示器无信号、黑屏的问题。其实都是正常的,不必惊慌,简单处理下就会OK的。& [1 a& k4 n8 t\' D2 x\' u 下面说一下: HDMI转VGA本身需要吃掉300mA左右电流,这个一定要知道。& o: ...…

查看全部问答>

ina213 增益

打算使用ina213做电流监视,看资料中有一个增益 50V/V的参数 不知道具体是什么意思,是检测到的Vin*50=Vout吗?请路过的大侠指点一二!谢谢!…

查看全部问答>

sudo 环境变量传递

大家也许有时候配置环境变量后,明明可以直接用的命令,可是有时需要加权限,加了sudo之后用不了,这时候是因为环境变量没有传递到sudo命令去,如下修改即可: /usr/sbin/visudo ubuntu下为sudoers 在defaults env_keep里面增加你所需要的环境变 ...…

查看全部问答>