读取红外滴速传感器时如何保证数据只读取一次(--->扩展到按键)

//            瞬时值      下降沿触发   上升沿触发  前一个值
unsigned char RedDripVal,RedDripDown,RedDripUp,RedDripOld;


void RedDrip_Proc()
{
  RedDripVal = ReadReadDrip();
  RedDripDown = RedDripVal & (RedDripVal ^ RedDripOld);
  RedDripUp = ~RedDripVal & (RedDripVal ^ RedDripOld);
  RedDripOld = RedDripVal;

  switch(RedDripDown)
  {
    case 0:
      break;
    case 1:
      break;
  }
}

红外滴液传感器信号处理代码解析

1. 变量定义解析

unsigned char RedDripVal,   // 当前传感器瞬时值(实时状态)
             RedDripDown,   // 下降沿触发标志(1表示检测到下降沿)
             RedDripUp,     // 上升沿触发标志(1表示检测到上升沿)
             RedDripOld;    // 前一次采样的历史值


2. 核心算法逻辑

信号变化检测(重点)

// 异或运算找出变化位(相同为0,不同为1)
uint8_t changed_bits = RedDripVal ^ RedDripOld; 

// 下降沿检测:旧值为1且新值为0的位(修正后的正确逻辑)
RedDripDown = (~RedDripVal) & changed_bits;

// 上升沿检测:旧值为0且新值为1的位(修正后的正确逻辑)
RedDripUp = RedDripVal & changed_bits;
posted @ 2025-04-19 15:55  xuyng  阅读(45)  评论(0)    收藏  举报