原理图:
按键的四个引脚:
创建key.c和key.h文件
- 使能 GPIO 端口时钟;
- 初始化 GPIO 目标引脚为输入模式 (引脚默认电平受按键电路影响,浮空/上拉/下拉均没有区别);
- 编写简单测试程序,检测按键的状态,实现按键控制 LED 灯。
参考正点原子和野火
部分源代码
main.c
#include "sys.h" #include "delay.h" #include "led.h" #include "key.h" int main(void) { u8 key; Stm32_Clock_Init(360,25,2,8);//ÉèÖÃʱÖÓ,180Mhz delay_init(180); //³õʼ»¯ÑÓʱº¯Êý LED_Init(); //³õʼ»¯LEDʱÖÓ KEY_Init(); //³õʼ»¯Óë°´¼üÁ¬½ÓµÄÓ²¼þ½Ó¿Ú LED0=0; //ÏȵãÁÁºìµÆ while(1) { key=KEY_Scan(0); //µÃµ½¼üÖµ if(key) { switch(key) { case WKUP_PRES: //¿ØÖÆLED0,LED1»¥³âµãÁÁ LED1=!LED1; LED0=!LED1; break; case KEY2_PRES: //¿ØÖÆLED0·×ª LED0=!LED0; break; case KEY1_PRES: //¿ØÖÆLED1·×ª LED1=!LED1; break; case KEY0_PRES: //ͬʱ¿ØÖÆLED0,LED1·×ª LED0=!LED0; LED1=!LED1; break; } }else delay_ms(10); } }
key.c
#include "key.h" #include "delay.h" //°´¼ü³õʼ»¯º¯Êý void KEY_Init(void) { RCC->AHB1ENR|=1<<0; RCC->AHB1ENR|=1<<2; RCC->AHB1ENR|=1<<7; GPIO_Set(GPIOA,PIN0,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); GPIO_Set(GPIOC,PIN13,GPIO_MODE_IN,0,0,GPIO_PUPD_PU); GPIO_Set(GPIOH,PIN2|PIN3,GPIO_MODE_IN,0,0,GPIO_PUPD_PU); } u8 KEY_Scan(u8 mode) { static u8 key_up=1; if(mode)key_up=1; if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)) { delay_ms(10);//È¥¶¶¶¯ key_up=0; if(KEY0==0)return 1; else if(KEY1==0)return 2; else if(KEY2==0)return 3; else if(WK_UP==1)return 4; }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; return 0; }
key.h
#ifndef __KEY_H #define __KEY_H #include "sys.h" #define KEY0 PHin(3) //PH3 #define KEY1 PHin(2) //PH2 #define KEY2 PCin(13) //PC13 #define WK_UP PAin(0) //PA0 #define KEY0_PRES 1 //KEY0 #define KEY1_PRES 2 //KEY1 #define KEY2_PRES 3 //KEY2 #define WKUP_PRES 4 //KEY_UP void KEY_Init(void); //IO u8 KEY_Scan(u8); #endif