【Alientek STM32 实验2】--按键输入
在禁用了JTAG之后,我们再配置PA0、PA13、PA15为输入,其设置与3.1的输出配置差不多,这里不再介绍。
KEY_Scan函数,则是用来扫描这3个IO口是否有按键按下。这个KEY_Scan函数,扫描某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,而坏处就是在需要长按的时候比较不合适。同时还有一点要注意的就是,该函数的按键扫描是有优先级的,最优先的是KEY0,第二优先的是KEY1,最后是KEY2。该函数有返回值,如果有按键按下,则返回非0值,如果没有或者按键不正确,则返回0。具体怎么实现请参考KEY_Scan的代码。
保存key.c代码,然后我们按同样的方法,新建一个key.h文件,也保存在KEY文件夹下面。在key.h中输入如下代码:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
//Mini STM32开发板
//按键输入驱动代码
//正点原子@ALIENTEK
//2010/5/27
#define KEY0 PAin(13)//PA13
#define KEY1 PAin(15)//PA15
#define KEY2 PAin(0)//PA0WK_UP
void KEY_Init(void);//IO初始化
u8 KEY_Scan(void);//按键扫描函数
#endif
这段代码里面最关键就是3个宏定义:
#define KEY0 PAin(13)//PA13
#define KEY1 PAin(15)//PA15
#define KEY2 PAin(0)//PA0WK_UP
这里使用的是位带操作来实现读取某个IO口的1个位的。同输出一样,我们也有另外一种方法可以实现上面代码的功能,如下:
#defineKEY0 (1<<13)//KEY0PA13
#defineKEY1 (1<<15)//KEY1PA15
#defineKEY2 (1<<0)//KEY2PA0
#define KEY0_GET() ((GPIOA->IDR&(KEY0))?1:0)//读取按键0
#define KEY1_GET() ((GPIOA->IDR&(KEY1))?1:0)//读取按键1
#define KEY2_GET() ((GPIOA->IDR&(KEY2))?1:0)//读取按键2
通输出一样,我们使用第一种方法,比较简单,看起来也清晰明了,最重要的是修改起来比较方便,后续实例,我们一般都使用第一种方法来实现输入口的读取。而第二种方法则适合在不同编译器之间移植,因为他不依靠其他代码。具体选择哪种,大家可以根据自己的喜好来决定。
将key.h也保存一下。接着,我们把key.c加入到HARDWARE这个组里面,这一次我们通过双击的方式来增加新的.c文件,双击HARDWARE,找到key.c,加入到HARDWARE里面,如下图所示:,编译工程,得到结果如下图所示:
图3.2.3.4编译结果
可以看到没有错误,也没有警告。从编译信息可以看出,我们的代码占用FLASH大小为:1792字节(1524+268),所用的SRAM大小为:520个字节。
这里我们解释一下,编译结果里面的几个数据的意义:
Code:表示程序所占用FLASH的大小(FLASH)。
RO-data:表示程序定义的常量(FLASH)。
RW-data:表示已初始化的全局变量(SRAM)
ZI-data:表示未初始化的全局变量(SRAM)
有了这个就可以知道你当前使用的flash和sram大小了,所以,一定要注意的是程序的大小不是.hex文件的大小。
接下来,我们还是先进行软件仿真,验证一下是否有错误的地方,然后才下载到Mini STM32看看实际运行的结果。
评论