void TimerIORun(void) { mTimerCnt++; /* ADC检测 */ for( int i=0;i<ADC_CHANNEL_MAX-2;i++) { if( AdcIsChange(i) ) { WinMessageSend(MSG_TYPE_ADC, i, 0, AdcGet(i)); mTimerLcdOff = 0; } } // 100ms if( mTimerCnt%10 == 0 ) { /* 旋钮检测 */ for( int i=0;i<4;i++) { int val = EncoderPositionDiffGet(i); if( val!=0) { WinMessageSend(MSG_TYPE_ENC, i, 0, val); mTimerLcdOff = 0; } } /* Tuner 检测 */ TunerCheck(); // 1000ms if( mTimerCnt >= 100 ) { mTimerCnt = 0; // 显示屏关闭 uint16_t displayTime = DataDisplayTime(); bool sw = true; if( displayTime ) { if( mTimerLcdOff++ >= displayTime ) { mTimerLcdOff = displayTime; sw = false; } } if( mLcdOffEn != sw ) { mLcdOffEn = sw; DevLcdPwrEn(sw); } } } /* LED闪烁 */ DevLedTask(10); /* 更新IO状态 */ CtrlPinUpdate(); /* 按键检测 */ uint32_t keyVal = ~( (CtrlPinReadPort(0)<<0) | \ (CtrlPinReadPort(1)<<8) | \ (CtrlPinReadPort(2)<<16) | \ (CtrlPinReadPort(3)<<24) | \ KEY_MASK_VAL ); KeyRun(keyVal, 0); }
时间: 2024-02-10 19:29:51 浏览: 53
这段代码是一个定时器的回调函数,名为TimerIORun。函数内部有一些逻辑,我来逐步解析一下:
1. `mTimerCnt++`:计数器自增。
2. ADC检测:通过循环遍历ADC通道,检测每个通道的值是否发生变化。如果有变化,通过WinMessageSend函数发送一个ADC类型的消息,并携带通道号和值。同时,将mTimerLcdOff置为0。
3. 当计数器mTimerCnt是10的倍数时,执行以下逻辑:
- 旋钮检测:通过循环遍历4个旋钮,检测每个旋钮的位置变化。如果有变化,通过WinMessageSend函数发送一个ENC类型的消息,并携带旋钮编号和位置变化值。同时,将mTimerLcdOff置为0。
- Tuner检测:执行TunerCheck函数。
- 当计数器mTimerCnt达到100时,执行以下逻辑:
- 将mTimerCnt重置为0。
- 显示屏关闭逻辑:获取显示屏关闭时间,并将sw变量初始化为true。
- 如果显示屏关闭时间不为0,则判断mTimerLcdOff是否大于等于显示屏关闭时间。如果是,则将mTimerLcdOff置为显示屏关闭时间,并将sw置为false。
如果mLcdOffEn与sw不相等,则将mLcdOffEn设置为sw,并通过DevLcdPwrEn函数控制显示屏的电源开关。
4. LED闪烁:调用DevLedTask函数,执行LED闪烁任务。
5. 更新IO状态:调用CtrlPinUpdate函数,更新IO状态。
6. 按键检测:通过CtrlPinReadPort函数读取4个端口的值,并通过位运算和取反操作得到按键值。将按键值传递给KeyRun函数进行处理。
这就是这段代码的大致逻辑,它主要是用于定时执行一些IO相关的操作,包括ADC检测、旋钮检测、Tuner检测、LED闪烁、IO状态更新和按键检测等。
阅读全文