KEYDef KEY_Scan(void) { static uint8_t con2=0; static uint8_t con1=0; Keybuffer[9]=HAL_GPIO_ReadPin(RLY1_GPIO_Port,RLY1_Pin); if(Timing_Function(Key_MatrixRecordTiming) >= ScanInterval_Timing) //检测到没到扫描按键的时间 { Key_MatrixRecordTiming = Get_Time(); //z在计时器打个点 KEYDef KEY_Value = KEYERROR;//0 无效值 static KEYDef back_up = KEYERROR;//0 无效值 Keybuffer[5]=GPIO_ReadInputData(GPIOA); Keybuffer[6]=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3); Keybuffer[7]=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4); Keybuffer[3]=~(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)); Keybuffer[3]= Keybuffer[3]&(0x01); Keybuffer[0]=~GPIO_ReadInputData(GPIOB); Keybuffer[1]=((Keybuffer[0])&(0x0018))<<8; Keybuffer[2]=(Keybuffer[3]<<8); Keybuffer[4]=(~Keybuffer[1]); Keybuffer[5]=(Keybuffer[3]|=Keybuffer[1]); WhichKey=0; WhichKey=Keybuffer[5];switch (WhichKey) { case 0x1000: KEY_Value =KEYDOWN; //下键 break; case 0x0800: KEY_Value = KEYCONFIRM; //确定键 break; case 0x0001: KEY_Value =KEYSWICHCOVER;////切换 break; case 0x1800: KEY_Value =KEYHIDE;/// /DOWM+ENTER 进入隐藏菜单键 break; case 0x0801: KEY_Value =KEYJUMPVULED;////切换 break; default : KEY_Value = KEYERROR; break; } if(back_up != KEY_Value) { back_up = KEY_Value;//0 1 2 3 4 5都有可能 KeyFlg1 = RESET; //FlagStatus KeyFlg1 = RESET; //RESET:弹起 SET:按下 KeyFlg2 = RESET; Key_cnt = 0; return KEYERROR; } if(KEY_Value == KEYERROR) { KeyFlg1 = RESET;//0 KeyFlg2 = RESET;//0 Key_cnt = 0; return KEYERROR; } switch(KeyFlg1) { case RESET: KeyFlg1 = SET; KeyFlg2 = SET; Key_cnt = 0; return KEYERROR; break; case SET: if(++Key_cnt >= Key_WipeShakeCount)//按键去抖动次数,此值增大抗干扰培增强但灵敏度降低 { Key_cnt = 0; if(KeyFlg2 == SET) { KeyFlg2 = RESET; return KEY_Value; } else { return KEYERROR; } } break; } } return KEYERROR; }解释这段代码
时间: 2024-04-11 11:32:19 浏览: 144
这段代码是一个按键扫描函数。它的作用是检测按键的状态并返回对应的按键值。
首先,函数声明了两个静态变量con2和con1,用来记录按键的状态。然后,将一个引脚(RLY1_Pin)的输入电平读取到Keybuffer[9]中。
接下来,通过判断计时器是否达到了扫描按键的时间间隔,确定是否进行按键扫描。如果满足条件,则记录当前的时间点。
然后,通过读取不同的引脚输入电平,并将其保存在Keybuffer数组中的相应位置。
然后,根据读取到的按键状态进行判断,根据不同的按键状态,将对应的按键值赋给KEY_Value变量。
接着,通过与之前记录的按键值进行比较,判断按键是否发生变化。如果发生变化,则重置一些变量,并返回KEYERROR。
如果按键值为KEYERROR,则重置一些变量,并返回KEYERROR。
接下来,根据KeyFlg1的状态进行判断。如果为RESET,则将KeyFlg1和KeyFlg2都设置为SET,并重置Key_cnt,并返回KEYERROR。如果为SET,则根据Key_cnt的值判断是否达到了按键去抖动次数。如果达到了去抖动次数,则重置Key_cnt,并根据KeyFlg2的状态返回对应的按键值(KEY_Value)或者KEYERROR。
最后,如果以上条件都不满足,则返回KEYERROR。
总的来说,这段代码的作用是实现按键的扫描和去抖动,并返回对应的按键值。
阅读全文
相关推荐














