你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 980|回复: 0

[STM32F412] [NUCLEO-F412ZG试用体验] 五、按键实验

[复制链接]

82

主题

636

回帖

121

蝴蝶豆

版主

最后登录
2020-7-12
发表于 2017-3-30 18:00:00 | 显示全部楼层 |阅读模式
看用户手册,板上已有两个按键,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。

51-例子拷贝的结果图1.jpg
52-例子拷贝的结果图2.jpg
53-修改后的结果图1.jpg
54-修改后的结果图2.jpg
回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版