版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/M_N_N/article/details/82224462
底板按键原理图:
三个按键,按下是引脚为低电平;
使用K1,K2来分别控制LED1,LED2;
按键引脚要配置为输入模式;
查看用户手册对GPIO输入模式的说明:
GPIOxALTFN
寄存器选择GPIO功能;GPIOxOUTENB
相应位设置为0,表示输入模式;GPIOxPAD
查询引脚高低电平;- 轮询模式配置上面三个寄存器就好,
GPIOxINTENB,GPIOxDETMODE,GPIOxDET
和中断有关,暂时不需要;
代码:
/* key.c
* 按键初始化及按键扫描
* K1 GPIOB28 AE25;
* K2 GPIOB29 AE24;
* K3 GPIOB30 AD24;
*/
#include "key.h"
void key_init(){
GPIOBALTFN1 &= ~((3 << 24) | (3 << 26) | (3 << 28)); // 交替函数功能选择
GPIOBALTFN1 |= ((1 << 24) | (1 << 26) | (1 << 28));
GPIOBOUTENB &= ~((1 << 24) | (1 << 26) | (1 << 28)); // 输入模式
}
int get_key_status(int num){
switch(num){
case 1:
return !((GPIOBPAD >> 28) & 1);
case 2:
return !((GPIOBPAD >> 29) & 1);
case 3:
return !((GPIOBPAD >> 30) & 1);
}
return 0;
}
//main.c
int main(){
int key = 0;
led_init();
key_init();
while(1){
if(KEY1) led1_on();
else led1_off();
if(KEY2) led2_on();
else led2_off();
}
return 0;
}
裸机程序的编译下载参考前一篇;
文件下载:
码云_key_led