原理图:
按键的四个引脚:
创建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
复制代码
|