时间有点仓促,写的比较粗糙 先写点上去吧
前面讲过了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函数的说明