这是核心板对应的管脚
通过原理图可以知道四个按键分别接到单片机的PA0、PE2、PE3、PE4。
每个按键对应一个LED。K1、K2、K3接地,当按键按下时,低电平就会通过单片机的管脚,只要读取单片机管脚是不是低电平就可以判断按键是否按下,所以这三个配置成上拉输入模式。而K_UP按键是接在3.3v上的,需要配置成下拉输入模式,当按键按下时,管脚为高电平,没有按下时为低电平。
2、程序
①按键消抖
在编写程序时需要注意的是,我们使用的开关为机械弹开关,在按键按下时不会马上形成稳定的电路,会伴随有一连串的抖动,一般时间为5ms到10ms,按键的抖动会引起按键被误读多次。为了确保CPU对按键的一次闭合只做一次处理,必须去除按键的抖动。
一般来说一个简单的按键消抖就是先读取一次按键的状态,如果得到按键按下之后,延时 10ms,再次读取一次按键的状态,如果按键还是按下状态,那么说明按键已经按下。
②函数输入
GPIO_ReadInputDataBit()函数:
这个函数是读取一个设置为输出模式时,一个 IO 口的状态值。当读取的 IO 口为 1 的时候,输出 1,当 IO 口输出为 0 的时候,输出 0。
1)
主函数:
/****************************************************************************
* Func
tion Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
****************************************************************************/
int main()
{
LED_Init(); //LED 初始化
key_init(); //按键端口初始化函数
GPIO_Write(GPIOC,(u16)(0xff)); //LED 灭
while(1)
{
key_pros(); //按键处理函数
}
}
这个主函数程序下载到板子上面得到的效果是:按 KEY_UP 键, D1 亮;按KEY_DOWN 键, D2 亮;按 KEY_LEFT 键, D3 亮;按 KEY_RIGHT 键, D4 亮。
2) 宏定义输入:
#define K_UP GPIO_Pin_0 //PA0
#define K_DOWN GPIO_Pin_3 //PE3
#define K_LEFT GPIO_Pin_2 //PE2
#define K_RIGHT GPIO_Pin_4 //PE4
#define k_up GPIO_ReadInputDataBit(GPIOA,K_UP) //获取按键的状态
#define k_down GPIO_ReadInputDataBit(GPIOE,K_DOWN)
#define k_left GPIO_ReadInputDataBit(GPIOE,K_LEFT)
#define k_right GPIO_ReadInputDataBit(GPIOE,K_RIGHT)
这 样 子 我 们 就 可 以 很 简 单 使 用 k_up 在 程 序 中 代 替GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)了。
3) 按键 IO口初始化函数(主要配置输入模式) :
/*******************************************************************************
* 函 数 名 : key_init
* 函数功能 : 按键端口初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************
/
void key_init() //
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化
GPIO_SystemInit();/* 开启 GPIO 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);/* 配置 GPIO 的模式和 IO 口 */
GPIO_InitStructure.GPIO_Pin=K_UP; //选择你要设置的 IO 口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化 GPIO */
GPIO_InitStructure.GPIO_Pin=K_DOWN|K_LEFT|K_RIGHT;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,K_UP); //对 K_UP 初始化输出 0
}
4)按键扫描函数
/*******************************************************************************
* 函 数 名 : key_pros
* 函数功能 : 按键处理函数,判断按键按下控制对应的 LED 灯
* 输 入 : 无
* 输 出 : 无
*******************************************************************************
/
void key_pros() //按键处理函数
{
if(k_up==1) //判断按键 k_up 是否按下
{
delay_ms(10); //消抖处理
if(k_up==1) //再次判断按键 k_up 是否按下
{
GPIO_Write(GPIOC,(u16)0xfe);
}
while(k_up); //等待按键松开
}
if(k_down==0)
{
delay_ms(10);
if(k_down==0)
{
GPIO_Write(GPIOC,(u16)(0xfd));
}
while(!k_down);
}
if(k_left==0)
{
delay_ms(10);
if(k_left==0)
{
GPIO_Write(GPIOC,(u16)(0xfb));
} w
hile(!k_left);
}
if(k_right==0)
{
delay_ms(10);
if(k_right==0)
{
GPIO_Write(GPIOC,(u16)(0xf7));
}
while(!k_right);
}
}