GPIO引脚图及相关配置
图1 由原理图,可以看出各按键的GPIO接口如下表。 | WK_UP | KEY0 | KEY1 | |:-----------:|:-----------:|:-----------:| | PA0| PC5 | PA15 | 而GPIO电平的读取代码为;GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
使用如下代码,将按键名与读取电平函数绑定。由于,当按键按下时,与之相连的GPIO电平会发生变化,因此,使用该函数可以检测按键是否按下。
#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
按键初始化函数
图2
图3 由图1,我们看到KEY0和KEY1按键外接地,再看图2,由于设置上拉输入,及上拉电阻以上的开关打开:在按键未按下时,使得输入电压为高电平;当按键按下时,有电流流过上拉电阻,由于I/O口外接地,因此,输入低电平。而且,由于硬件设计,只能这样设置,不可改变设置。
那么同理,如图1,WK_UP按键外接3.3V的稳压电源,因此只能设置为下拉输入,内置下拉电路如图3。
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC端口时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PC5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //同样设置上拉输入(由于,结构体中的值已经在初始化GPIOA15时,定义过了,因此,此处可以省略)
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置输入模式为下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0
}
按键扫描函数
在key.h的头文件中,使用如下代码,将KEY0_PRES等与数字绑定。以简单区分按下了哪一个按键。
#define KEY0_PRES 1 //KEY0
#define KEY1_PRES 2 //KEY1
#define WKUP_PRES 3 //WK_UP
// 不支持连按的模式下,一直按住按键,只有一次响应
// 支持连按的模式下,一直按着按键将一直响应按键
u8 KEY_Scan(u8 mode)//mode为是否支持连按的标志
{
static u8 key_up=1;
if(mode)key_up=1; //按键未按下的标志
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);//延时10毫秒以防按键抖动而按下按键
key_up=0;
if(KEY0==0)return KEY0_PRES;//确认按下的按键为KEY0
else if(KEY1==0)return KEY1_PRES;//确认按下的按键为KEY1
else if(WK_UP==1)return WKUP_PRES;//确认按下的按键为WKUP_PRES
}
else if(KEY0==1&&KEY1==1&&WK_UP==0)//若检测按键一直按着,则不置位特征位。
key_up=1;
return 0;// 无按键按下
}
按下按键给出对应响应
t=KEY_Scan(0); //得到按键扫描所按下的按键
switch(t)
{
case KEY0_PRES:
LED0=!LED0;
break;
case KEY1_PRES:
LED1=!LED1;
break;
case WKUP_PRES:
LED0=!LED0;
LED1=!LED1;
break;
default:
delay_ms(10);
}
GPIO引脚图及相关配置
图1 由原理图,可以看出各按键的GPIO接口如下表。 | WK_UP | KEY0 | KEY1 | |:-----------:|:-----------:|:-----------:| | PA0| PC5 | PA15 | 而GPIO电平的读取代码为;GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
使用如下代码,将按键名与读取电平函数绑定。由于,当按键按下时,与之相连的GPIO电平会发生变化,因此,使用该函数可以检测按键是否按下。
#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
按键初始化函数
图2
图3 由图1,我们看到KEY0和KEY1按键外接地,再看图2,由于设置上拉输入,及上拉电阻以上的开关打开:在按键未按下时,使得输入电压为高电平;当按键按下时,有电流流过上拉电阻,由于I/O口外接地,因此,输入低电平。而且,由于硬件设计,只能这样设置,不可改变设置。
那么同理,如图1,WK_UP按键外接3.3V的稳压电源,因此只能设置为下拉输入,内置下拉电路如图3。
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC端口时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PC5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //同样设置上拉输入(由于,结构体中的值已经在初始化GPIOA15时,定义过了,因此,此处可以省略)
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置输入模式为下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0
}
按键扫描函数
在key.h的头文件中,使用如下代码,将KEY0_PRES等与数字绑定。以简单区分按下了哪一个按键。
#define KEY0_PRES 1 //KEY0
#define KEY1_PRES 2 //KEY1
#define WKUP_PRES 3 //WK_UP
// 不支持连按的模式下,一直按住按键,只有一次响应
// 支持连按的模式下,一直按着按键将一直响应按键
u8 KEY_Scan(u8 mode)//mode为是否支持连按的标志
{
static u8 key_up=1;
if(mode)key_up=1; //按键未按下的标志
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);//延时10毫秒以防按键抖动而按下按键
key_up=0;
if(KEY0==0)return KEY0_PRES;//确认按下的按键为KEY0
else if(KEY1==0)return KEY1_PRES;//确认按下的按键为KEY1
else if(WK_UP==1)return WKUP_PRES;//确认按下的按键为WKUP_PRES
}
else if(KEY0==1&&KEY1==1&&WK_UP==0)//若检测按键一直按着,则不置位特征位。
key_up=1;
return 0;// 无按键按下
}
按下按键给出对应响应
t=KEY_Scan(0); //得到按键扫描所按下的按键
switch(t)
{
case KEY0_PRES:
LED0=!LED0;
break;
case KEY1_PRES:
LED1=!LED1;
break;
case WKUP_PRES:
LED0=!LED0;
LED1=!LED1;
break;
default:
delay_ms(10);
}
举报