84 lines
1.1 KiB
C
84 lines
1.1 KiB
C
|
||
#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;
|
||
}
|
||
|