历史上的今天
今天是: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和蜂鸣器的翻转。
史海拾趣
|
我想模拟一个外部中断,然后执行中断处理程序,就像定时器或是UART子类的外部设备,但是不知道哪一个函数用来产生中断,另外中断处理程序有什么讲究吗,跟普通的386嵌入式系统应该一样吧。。。 我用的是0.10.5的源码。… 查看全部问答> |
|
本人设计一个信号发生器遇到了困难,各位大侠帮帮小弟啊!急求! 本人现在设计一个基于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 ...… 查看全部问答> |
|
自从树莓派论坛官方网店上线以后,每天都有5个以上的客户反应,显示器无信号、黑屏的问题。其实都是正常的,不必惊慌,简单处理下就会OK的。& [1 a& k4 n8 t\' D2 x\' u 下面说一下: HDMI转VGA本身需要吃掉300mA左右电流,这个一定要知道。& o: ...… 查看全部问答> |
|
大家也许有时候配置环境变量后,明明可以直接用的命令,可是有时需要加权限,加了sudo之后用不了,这时候是因为环境变量没有传递到sudo命令去,如下修改即可: /usr/sbin/visudo ubuntu下为sudoers 在defaults env_keep里面增加你所需要的环境变 ...… 查看全部问答> |




