开发者学堂课程【嵌入式之 RFID 开发与应用2020版:GPIO 输入之按键轮询】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11153
GPIO 输入之按键轮询
接一个按键,假设这个按键是接在了 PA1 一和 PA0 上面。按键的工作原理:把开关一个引脚接在 PA1,另一个引脚接在 PA0。如果开关没有按下去,PA1 和 PA0 没有关系,但一旦这个按键按下去了,PA1 和 PA0 的电平就是一样的了。
可以让 PA0 工作在一个输出状态,输出 1 输出 0 都可以。输出 0 的话,PA1 默认情况下给其一个上拉电阻,就保证了 PA0 和 PA1 这两个引脚在没有按下按键的情况下是不一样的。如果当这个按键按下去的时候,由于 PA0 是 0,才使得 PA1 也跟着成了 0。所以只需要判断 PA1 有没有从 1 变成 0 来判断有没有按下按键。
将下程序输入,叫作键盘的初始化:
Void led-int(void)
{
GPIO-InitTypeDef GPIO-InitStructure;
RCC-APB2PeriphclockCmd(RCC-XXX-LED, ENABLE);
GPIO-InitStructure,GPIO-Pin=GPIO-XXX-LED;
GPIO-InitStructure,GPIO-Mode=GPIO-Mode-Out-PP;
GPIO-InitStructure,GPIO-Speed=GPIO-Speed-2MHZ;
GPIO-Init(GPIO-XXX-LED-PORT,& GPIO-InitStructure);
GPIO-XXX-LED-OFF():
}
现在用到 GPIOA,用的是 A0 和 A1 引脚,如果引脚有多个,没有必要重复去写,只需要扩上另一个就可以了。这里还不能用或,因为这两个引脚的工作方式不一样,一个输入一个输出所以这还是要分开写,这里的 io 口当然就是 GPIOA。
接下来再复制上面的代码做成两个 io,A0 的 iO 做成输出,输出低电平,GPIOA,A0 引脚。A1 的 iO 做成输入,ipu 上拉输入,频率不变。一个是输入,一个是输出,然后这个时钟都是 A。
按键的初始化做完之后,直接判断 io 口的值是多少。resetbits 是在设置电平的状态,是清零的,现在不是要至零了,要输入就要去读取输入的 io,参数就是 gpioa除去 a 的几个广角,0 是用作输出,1 是输入。读取的值如果等于 0 就表示这个按键被按下,按下了让灯和蜂鸣器都响起来,否则就关掉,具体代码修改完成后如下:
Int main(void)
{
Led-int();
Beep-init();
Key-init();
Whie(1){
If(GPIO-ReadInputDataBit(GPIOA,GPIO-Pin-1)==0){
LED-XXX-ON();
BEEP-XXX-ON();
delay-ms(300);
}else{
LED-XXX-OFF();
BEEP-XXX-OFF();
delay-ms(300);
}
编译,复位,出现问题蜂鸣器反了,修改为
#define BEEP_XXX_ON() GPIO_SetBits(GPIO_XXX_BEEP_PORT,GPIO_XXX_BEEP)
#define BEEP_XXX_OFF() GPIO_ResetBits(GPIO_XXX_BEEP_PORT,GPIO_XXX_BEEP)
之前接反了,重新复位,运行正常,A0A1 上接了两个按键,
如图所示为之前接的蜂鸣器,还有按键接到 A0A1 上面,按动按键,灯也会随着闪烁,
这就是输入输出通过 IO 口蜂鸣器 LED 和按键的演示。但是还是存在一些问题,按键的主循环里做了一件事情判断按键,学习中断时就不要判断放到主循环中。