Files
checker_slave/source/interface/if_key.c

84 lines
1.1 KiB
C
Raw Normal View History

#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;
}