1. GPIO输入相关API
1) 引脚配置为输入模式
void GPIO{
x}_ModeCfg(uint32_t pin, GPIOModeTypeDef mode);
GPIO{x}_ModeCfg 函数用于完成GPIO{x}端口引脚模式配置,其中:
{x}为端口选择,如A\B\C等;
pin:引脚编号,如GPIO_Pin_0、GPIO_Pin_1等
mode:引脚模式,包括
GPIO_ModeIN_Floating浮空输入、
GPIO_ModeIN_PU上拉输入、
GPIO_ModeIN_PD下拉输入、
GPIO_ModeOut_PP_5mA推挽输出最大5ma、
GPIO_ModeOut_PP_20mA推挽输出最大20ma
示例:
GPIOA_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU);// GPIO_Pin_22上拉输入
2) 读取引脚电平状态
GPIO{
x}_ReadPortPin(pin) ;
读取引脚电平状态,0-引脚低电平,(!0)-引脚高电平
示例:
u_char key1_v=GPIOA_ReadPortPin(KEY1_PIN);
2. 创建工程
1) 拷贝led工程
将上一讲的LED工程复制粘贴
2) 设置名称
粘贴后重命名为“CH573_02_key”
3) 编译检查无错误无警告
3. 按键工程
1) 新建key.h
在上一讲创建的个人驱动文件夹“MyDriver”中右键“NEW/Header File”,并命名为“key.h”
2) 新建key.c
在上一讲创建的个人驱动文件夹“MyDriver”中右键“NEW/Scource File”,并命名为“key.c”
3) 补充代码
a) key.h
/*
* key.h
*
* Created on: Mar 7, 2023
* Author: WeChat official accounts "IOT趣制作"
* -------------------------------------------
* ch573 按键
* PB22 KEY1
* PB23 KEY2
* -------------------------------------------
*/
#ifndef MYDRIVER_KEY_H_
#define MYDRIVER_KEY_H_
//头文件包含区
/***************************************************/
//宏定义区
#define KEY1_PIN GPIO_Pin_22
#define KEY2_PIN GPIO_Pin_23
//端口修改请在KEY_init()实体区进行调整
#define KEY_NOPressed 0
#define KEY1_Pressed 1
#define KEY2_Pressed 2
/***************************************************/
//变量声明区
/***************************************************/
//函数声明区
void KEY_init(void);
u_char KEY_SCANN(void);
/***************************************************/
#endif /* MYDRIVER_KEY_H_ */
b) key.c
/*
* led.c
*
* Created on: Mar 7, 2023
* Author: WeChat official accounts "IOT趣制作"
*/
//头文件包含区
#include "CH57x_common.h"
#include "key.h"
/***************************************************/
//宏定义区
/***************************************************/
//变量声明区
/***************************************************/
//函数声明区
/***************************************************/
//函数实体区
/*
* 函数名:KEY_init
* 参数:无
* 返回值:无
* 功能说明:按键初始化
*/
void KEY_init(void)
{
GPIOB_ModeCfg(KEY1_PIN, GPIO_ModeIN_PU);//KEY1_PIN上拉输入
GPIOB_ModeCfg(KEY2_PIN, GPIO_ModeIN_PU);//KEY2_PIN上拉输入
}
/*
* 函数名:KEY_SCANN
* 参数:无
* 返回值:KEY1_Pressed/KEY2_Pressed/KEY_NOPressed
* 功能说明:按键扫描
*/
u_char KEY_SCANN(void)
{
if(GPIOA_ReadPortPin(KEY1_PIN)==0)
{
DelayMs(10);
if(GPIOA_ReadPortPin(KEY1_PIN)==0)
return KEY1_Pressed;
}
else if(GPIOA_ReadPortPin(KEY2_PIN)==0)
{
DelayMs(10);
if(GPIOA_ReadPortPin(KEY2_PIN)==0)
return KEY2_Pressed;
}
return KEY_NOPressed;
}
/***************************************************/
c) main.c
/********************************** (C) COPYRIGHT *******************************
* File Name : Main.c
* Author : FUNIOT.XYZ
* Version : V1.0
* Date : 2023/05/06
* Description : 实验02-按键控制LED
* Copyright : WeChat official accounts "IOT趣制作"
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************/
#include "CH57x_common.h"
#include "led.h"
#include "key.h"
/*********************************************************************
* @fn main
*
* @brief 主函数
*
* @return none
*/
int main()
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
LED_init();//LED初始化
KEY_init();//按键初始化
while(1)
{
if(KEY_SCANN()==KEY1_Pressed)
{
LED_turnon();
}
else if(KEY_SCANN()==KEY2_Pressed)
{
LED_turnoff();
}
DelayMs(50);
}
}
4. 编译烧录运行
1) 编译烧录
2) 运行
这里我们使用一个杜邦线连接按键引脚与GND引脚,来回插拔模拟按键,运行结果:按键KEY1按下LED点亮,按键KEY2按下LED熄灭。
如果串按键控制LED正常,即达到本实验的目的,如果异常(按键消抖的问题属正常现象),请检查源代码,如有疑问,可关注公众号 “IOT趣制作”,将您遇到的问题描述出来,平台收到您的留言后会第一时间进行解决。