[NUCLEO-F412ZG试用体验] 五、按键实验
看用户手册,板上已有两个按键,1个用于系统复位——固定了,不能用于实验;另一个可以用于实验。目的:按一下按键,led亮,再按一下,led灭;之后:按一下led轮流亮,循环往复。先将mainLed.cpp复制一个,改名为mainKey.cpp。打开此文档。按键操作实际上也是IO操作,只不过变成IO输入判别了,一般按键都有延时函数,判别是否真按键,因此需要用到延时函数。思路是:按一下键-延时20mS,在判断是否键还是按下,是则执行一次键操作,等待下一次按键。常规判断按键抬起,我们也这样操作。打开DigitalIn.h文档,例子如下:* Example:
* @code
* // Flash an LED while a DigitalIn is true
*
* #include "mbed.h"
*
DigitalIn enable(p5);//定义按键对象enable——key1
* DigitalOut led(LED1);//定义led
*
int main() {
* while(1) {
* if(enable) {//如果按下键
* led = !led;//led取反
* }
* wait(0.25);//延时0.25秒
* }
* }
* @endcode
这次我们先照抄,将源代码除了include "mbed.h"之外的语句用/* */包围注释,见这段语句去掉前边的*号拷贝过去,注意PinNames.h中user按键是PC_13,上边的p5改成PC_13,由于这个按键没有延时,整体延时的结果是:按键时间短,按一下亮,再一下灭;一直按着就变成0.25秒亮或灭一次了。
下边我们改程序:
增加一个整形变量keyDel,其值只有1,0;按下为1,松开为0;初始设为0;当按键按下后值为不变,延时20mS后改为1,当按键松开后,按键的值与keyDel都为1,执按键,同时将键值改为0;重复以往。见图51,图52,代码为:
#include "mbed.h"
//Define GPIOs
DigitalOut led1(PB_0);DigitalOut led2(PB_7);DigitalOut led3(PB_14);
DigitalIn key1(PC_13);//定义按键对象enable——key1
//Define variable
int keyDel;
//IO Initial
void ioInit(void){
led1=0;led2=1;led1=0;
keyDel=0;
}
// main() runs in its own thread in the OS// (note the calls to Thread::wait below for delays)
int main() {
ioInit();
while (true) {
if(key1 && !keyDel){
wait(0.02);
if(key1) keyDel=1;
if(keyDel && key1){
led1=!led1;led2=!led2;led3=!led3;
}
}
wait(0.2f);
}
}
上述程序没有问题,按键小于0.2秒,响应LED翻转一次,当按键超过0.2秒不松手,LED按照0.2秒交替闪烁。此外,由于C语言对结构化的模块程序有更好的优化,由此改为单独的键盘处理程序,改动如下:
#include "mbed.h"
//Define GPIOs
DigitalOut led1(PB_0);DigitalOut led2(PB_7);DigitalOut led3(PB_14);
DigitalIn key1(PC_13);//定义按键对象enable——key1
//Define variable
int keyDel;
//IO Initial
void ioInit(void){
led1=0;led2=1;led1=0;
keyDel=0;
}
//key Test
void keyTest(void){
wait(0.02);
if(key1) keyDel=1;
if(keyDel && key1){led1=!led1;led2=!led2;led3=!led3;}
}
// main() runs in its own thread in the OS// (note the calls to Thread::wait below for delays)
int main() {
ioInit();
while (true) {
if(key1 && !keyDel){keyTest();}
if(!key1) keyDel=0;//保证按键响应1次,去掉此句,按键不松就成为延时交替闪烁
}
}
程序运行结果是:每次按键LED改变显示结果一次。结果见图53,图54。
页:
[1]