大连林海 发表于 2016-5-1 08:15:21

arduino宏的应用实例4--用宏实现边沿检测(转)

取自前面帖子中的按键检测:
直接上代码://逻辑量的四种状态:低,上升,高,下降
enum edgeSta {low, trg, high, pop};
//宏名:edge。 返回值:逻辑量状态。输入参数:bool值 用途:检测逻辑量的边沿。
#define edge(ReadData) ({\
    static bool Trg = false;\
    static bool Cont = false;\
    static bool Pop = false;\
    Trg = ReadData & (ReadData ^ Cont); \
    Pop = Cont != ReadData & !Trg; \
    Cont = ReadData; \
    enum edgeSta sta = low;\
    if (Cont) {\
      sta = high;\
    } else {\
      sta = low;\
    }\
    if (Trg) {\
      sta = trg;\
    }\
    if (Pop) {\
      sta = pop;\
    }\
    sta;\
})

//宏名: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;\
})
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(8, INPUT_PULLUP);
}
//检测8号端口按键的状态
void fun1() {
enum edgeSta a = edge(!digitalRead(8));
switch (a)
{
    case low:
      //Serial.println("low");
      break;
    case trg:
      Serial.println("trg");
      break;
    case high:
      //Serial.println("high");
      break;
    default:
      Serial.println("pop");
}
}
void loop() {
// put your main code here, to run repeatedly:
//联合使用定时器和边沿检测处理按键状态。
timer(true, 0, 20, fun1());
}


dsweiliang 发表于 2016-5-4 09:36:41

学习学习
页: [1]
查看完整版本: arduino宏的应用实例4--用宏实现边沿检测(转)