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