极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8964|回复: 2

arduino宏的应用实例3--用宏实现定时调用

[复制链接]
发表于 2016-4-26 23:21:59 | 显示全部楼层 |阅读模式
本帖最后由 wwwymq 于 2016-4-27 01:26 编辑

这个只是从前几个帖子中提取出的一部分。完成常见的定时执行程序执行程序。
直接上代码:
[pre lang="arduino" line="1" file="Timer"]//宏名:timer。返回值:bool 时间到返回真。参数:enable使能,startTime第一次执行时间,delayTime执行间隔时间,doSomeThing任意表达式到时间执行的任务。
#define timer(enable,startTime,delayTime,doSomeThing) ({\
    static unsigned long timsta = millis();\
    static unsigned long tim = startTime;\
    bool ret = false;\
    if(!enable){timsta = millis();tim = startTime;}else{\
      if (millis() - timsta>= tim){\
        doSomeThing;\
        ret = true;\
        timsta = millis(); \
        tim = delayTime;\
      }\
    }\
    ret;\
  })
//7号端口led闪烁程序
void flash() {
  static bool b = true;
  (b = !b ) ? pinMode(7, OUTPUT) : pinMode(7, INPUT);
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(8, INPUT_PULLUP);//8号端口接按键
}
void loop() {
  // put your main code here, to run repeatedly:
  //定时器调用方式1:通过按键使能led每500ms翻转一次。
  timer(!digitalRead(8), 0, 500, flash());
  //定时器调用方式2:通过内嵌的语句执行,0ms执行第一次,然后每2000ms执行一次。
  timer(true, 0, 2000, Serial.println("Timer2 trig!"));
  //定时器调用方式3:通过timer的返回值触发语句(时间到达时触发一次),从3000ms开始,每2000ms执行一次。
  if (timer(true, 3000, 2000, void())) {
    Serial.println("Timer3 trig!");
  }
}
[/code]
程序中分别启动了3个定时执行的程序段;
程序段1,定时器调用方式1:通过按键使能led每500ms翻转一次。
程序段2,定时器调用方式2:通过内嵌的语句执行,0ms执行第一次,然后每2000ms执行一次,打印输出"Timer2 trig!"。
程序段3,定时器调用方式3:通过timer的返回值触发语句(时间到达时触发一次),从3000ms开始,每2000ms执行一次,打印输出"Timer3 trig!"。
回复

使用道具 举报

 楼主| 发表于 2016-4-26 23:29:58 | 显示全部楼层
沙发自己坐
回复 支持 反对

使用道具 举报

发表于 2016-4-27 16:40:05 | 显示全部楼层
好帖,谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 03:21 , Processed in 0.044417 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表