一.按键原理
当按键按下的时候会有一个电平变化,如果按之前是高电平的话,我们只需要检测是否为低电平就可以知道是否按下了。
二.原理图介绍
在这里我们只用key0和key1,通过原理图我们可以知道,当我们按下的时候为低电平,我们只需检测低电平就可以知道按键是否按下了。
三.程序设计
char ScanCnt;
void key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
char Key_scanf(void)
{
if(key0 == 0)
{
ScanCnt++;
if(ScanCnt>=3)
{
ScanCnt=0;
}
else
{
ScanCnt=0;
}
return 1;
}
else if(key1 == 0)
{
ScanCnt++;
if(ScanCnt>=3)
{
ScanCnt=0;
}
else
{
ScanCnt=0;
}
return 2;
}
return 0;
}
首先没有初始化io口,这里需要配置成上拉输入,这样的话当我们没有按下是按键是高电平,按下是低电平。接着是写扫描函数,我已经在.h文件中宏定义了读取函数。做了一个消抖,当连续检测到3次低电平后,我们返回1,同理读取到3次key1为0后,我们返回2,什么都没有读取到返回0.
int main(void)
{
LED_Init();
BEEP_Init();
delay_init();
key_Init();
while(1)
{
num = Key_scanf();
if(num == 2)
{
GPIO_SetBits(GPIOB,GPIO_Pin_8);
//delay_ms(200);
}
else if(num == 1)
{
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
}
}
接着我们回到主函数,将读取的值赋值给num,如果num为2,我们就让蜂鸣器响。如果num为1,我们就让灯亮,反之都不是我们将灯和蜂鸣器全都关掉。