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

查看: 952|回复: 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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版