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 15:32:19 浏览: 18
这段代码是一个按键扫描函数。它的作用是检测按键的状态并返回对应的按键值。
首先,函数声明了两个静态变量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。
总的来说,这段代码的作用是实现按键的扫描和去抖动,并返回对应的按键值。
相关问题
uint8_t intFlag = 0;
根据引用和引用中的内容,可以看出uint8_t并不是一个新的数据类型,而是使用typedef给类型起的别名。它实际上是一个8位无符号整型。所以,当我们声明一个变量uint8_t intFlag = 0;时,我们实际上是声明了一个8位无符号整型的变量intFlag,并将其初始化为0。<em>1</em><em>2</em><em>3</em>
#### 引用[.reference_title]
- *1* *2* [【转】uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了](https://blog.csdn.net/winniezheng/article/details/8663683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item]
- *3* [关于uint8_t等类型的定义](https://blog.csdn.net/magic_show_time/article/details/121489424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item]
[ .reference_list ]
uint8_t数组转uint16_t
将uint8_t数组转换为uint16_t数组可以通过以下步骤实现:
1. 创建一个新的uint16_t数组,长度为原始uint8_t数组的一半。因为每个uint16_t元素占用2个字节,而每个uint8_t元素只占用1个字节。
2. 使用循环遍历原始uint8_t数组,每次迭代处理两个连续的uint8_t元素。
3. 将两个uint8_t元素合并成一个uint16_t元素。可以使用位运算符和移位操作来实现。例如,将第一个uint8_t元素左移8位,然后与第二个uint8_t元素进行按位或操作。
4. 将合并后的uint16_t元素存储到新的uint16_t数组中。
下面是一个示例代码片段,展示了如何将uint8_t数组转换为uint16_t数组:
```cpp
#include <cstdint>
void convertUint8ArrayToUint16Array(const uint8_t* uint8Array, uint16_t* uint16Array, size_t length)
{
for (size_t i = 0; i < length; i += 2)
{
uint16Array[i / 2] = (static_cast<uint16_t>(uint8Array[i]) << 8) | uint8Array[i + 1];
}
}
```
使用上述函数,您可以将一个uint8_t数组转换为一个uint16_t数组。请确保传递正确的数组长度,以避免访问超出数组边界的内存。