volatile unsigned char KEY_Value = KEY_NOP; unsigned char KEY_Read(void) { unsigned char a; a = (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) <<4) + (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15) <<3) + + (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) <<2)+ (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13) <<1)+ (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) );//(GPIO_ReadInputData( GPIOA)&0xC0) + return (~a)&0x1F; } void KEY_Scan(void) { static volatile unsigned char Trg = 0; static volatile unsigned char Cnt = 0; unsigned char KeyRead = 0; KeyRead = KEY_Read(); Trg = KeyRead ^ (KeyRead & Cnt); Cnt = KeyRead; if(Trg) { switch(Trg) { case 0x10:KEY_Value = KEY_E; break; case 0x08:KEY_Value = KEY_D; break; case 0x01:KEY_Value = KEY_A; break; case 0x02:KEY_Value = KEY_B; break; case 0x04:KEY_Value = KEY_C; break; default: KEY_Value = KEY_NOP;break; } } }这些代码分别为什么意思
时间: 2024-01-08 07:04:54 浏览: 162
这些代码是针对按键扫描的程序,具体解释如下:
1. `volatile unsigned char KEY_Value = KEY_NOP;`:定义了一个 `volatile` 类型的全局变量 `KEY_Value`,其初值为 `KEY_NOP`。
2. `unsigned char KEY_Read(void)`:这是一个函数,用于读取按键的状态。通过读取 GPIOA 和 GPIOB 的状态,将其转换成一个 5 位的二进制数,然后返回这个数的补码。
3. `void KEY_Scan(void)`:这是一个函数,用于扫描按键。它会调用 `KEY_Read()` 函数读取按键的状态,然后根据按键状态的变化,更新 `KEY_Value` 变量的值。
4. `static volatile unsigned char Trg = 0;`:定义了一个静态的、 `volatile` 类型的变量 `Trg`,其初值为 0。
5. `static volatile unsigned char Cnt = 0;`:定义了一个静态的、 `volatile` 类型的变量 `Cnt`,其初值为 0。
6. `unsigned char KeyRead = 0;`:定义了一个局部变量 `KeyRead`,其初值为 0。
7. `KeyRead = KEY_Read();`:调用 `KEY_Read()` 函数读取按键状态,并将其赋值给 `KeyRead` 变量。
8. `Trg = KeyRead ^ (KeyRead & Cnt);`:计算出按键状态的变化,将其保存在 `Trg` 变量中。具体来说,这个表达式会将 `KeyRead` 和 `Cnt` 取按位与,然后将结果异或 `KeyRead`,最终得到的就是按键状态的变化。
9. `Cnt = KeyRead;`:将当前的按键状态保存在 `Cnt` 变量中,以备下一次扫描时使用。
10. `if(Trg)`:判断按键状态是否有变化。
11. `switch(Trg)`:根据按键状态的变化,执行相应的操作。
12. `case 0x10:KEY_Value = KEY_E; break;`:如果按键状态变化为 0x10,即按键 E 被按下,则将 `KEY_Value` 设置为 `KEY_E`。
13. `case 0x08:KEY_Value = KEY_D; break;`:如果按键状态变化为 0x08,即按键 D 被按下,则将 `KEY_Value` 设置为 `KEY_D`。
14. `case 0x01:KEY_Value = KEY_A; break;`:如果按键状态变化为 0x01,即按键 A 被按下,则将 `KEY_Value` 设置为 `KEY_A`。
15. `case 0x02:KEY_Value = KEY_B; break;`:如果按键状态变化为 0x02,即按键 B 被按下,则将 `KEY_Value` 设置为 `KEY_B`。
16. `case 0x04:KEY_Value = KEY_C; break;`:如果按键状态变化为 0x04,即按键 C 被按下,则将 `KEY_Value` 设置为 `KEY_C`。
17. `default:KEY_Value = KEY_NOP;break;`:如果按键状态变化不是上述几种情况,则将 `KEY_Value` 设置为 `KEY_NOP`,表示没有按键被按下。
阅读全文