时间有点仓促,写的比较粗糙 先写点上去吧
前面讲过了io口的设置,按键不过是把io口设置成其他的模式,如果按键接的vcc就将相应io口设置成下拉输入模式,接地就上拉输入模式(没按下的时候就要默认高电平)
然后就和51的时候一样处理抖动,读取状态就行了,我也改成没使用商家给的函数,只使用库函数了
以下为key驱动
#include "key.h"
#include "delay.h"
u8 k_past=0,k_now=0;
void KEY_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//PA15是JTAG用到的引脚,此函数可以关闭JTAG功能把此引脚当成普通引脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//PA15为key1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
GPIO_Init(GPIOA,&GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
// GPIO_Init(GPIOC,&GPIO_InitStructure);
//
// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
// GPIO_Init(GPIOA,&GPIO_InitStructure);
}
u8 KEY_Scan()
{
u8 temp;
temp=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15);
if(temp==1)
{
k_past=k_now;
k_now=0;
}
else if(!(k_past==1&&k_now==1))
{
delay_ms(20);
temp=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15);
if(temp==0)
{
k_past=k_now;
k_now=1;
return 1;//1代表按键按下
}
else
{
k_past=k_now;
k_now=0;
}
}
return 0;
}
以下为main,led和上次一样
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
//ALIENTEK Mini STM32开发板范例代码2
//按键输入实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
while(1)
{
if(KEY_Scan()&&k_past==0&&k_now==1)
{
LED0=!LED0;
}
}
}
以下为
GPIO_PinRemapConfig函数的说明