看用户手册,板上已有两个按键,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。 |