#include "board.h" #include "stm32f10x.h" #include "if_key.h" #include "core_delay.h" #define GPIO_Initer() {.GPIO_Speed=GPIO_Speed_50MHz,\ .GPIO_Mode=GPIO_Mode_IPU,\ } typedef struct{ int key_old; }self_def; static self_def g_self; static int init(void) { GPIO_InitTypeDef init2=GPIO_Initer(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); init2.GPIO_Pin=(1<<0); GPIO_Init(GPIOB,&init2); } static int scan(void) { self_def *s=&g_self; int key=0,key2=0; key=PININ(B,0); if(key!=s->key_old) { //连续采集5次,都为相反电平时才输出此电平 for(int i=0;i<2;i++) { delay_ms(20); key2=PININ(B,0); if(key!=key2) { return key2; } } return key; } return s->key_old; } // 读取按键,1按下,0未按下 static int read(void) { self_def *s=&g_self; int key=scan(); int key_ret=0; if(key!=s->key_old) { if(key==0){ key_ret=1; }else{ key_ret=0; } s->key_old=key; } return key_ret; } static key_def g_key={ .init=init, .read=read, }; key_def *key(void) { return &g_key; }