gpio_readinputdata和gpio_readinputdatabit区别
时间: 2023-05-28 19:05:45 浏览: 464
gpio_readinputdata函数是用于读取整个GPIO端口的输入数据寄存器的值,它返回一个uint16_t类型的值,每个位表示一个GPIO引脚的状态。而gpio_readinputdatabit函数则是用于读取单个GPIO引脚的状态,它接受两个参数,第一个参数是GPIO端口的指针,第二个参数是要读取的GPIO引脚的编号。它返回一个uint8_t类型的值,表示该GPIO引脚的状态(0或1)。因此,这两个函数的主要区别在于它们读取的数据范围不同。
相关问题
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; } } }这些代码分别为什么意思
这些代码是针对按键扫描的程序,具体解释如下:
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`,表示没有按键被按下。
#define KEY1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) #define KEY2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); }解读
这段代码定义了两个宏KEY1和KEY2,分别表示GPIOB的8号和9号引脚的输入状态。然后定义了一个函数KEY_Init,用于初始化GPIOB的8号和9号引脚为上拉输入模式。具体实现过程是:首先使能GPIOB和AFIO的时钟,然后禁用JTAG接口以释放这两个引脚的控制权,接着配置GPIOB的8号和9号引脚为上拉输入模式。
阅读全文