3. GPIO输入检测按键
任务说明
本案例基于瑞萨RH850/F1L系列MCU(以R7F7015873为例),实现一个最小按键输入检测系统:将P7组GPIO的P70配置为输入模式并连接外部按键,将P8组GPIO的P80配置为输出模式并连接LED。当按键按下时(输入低电平),LED点亮;按键释放时,LED熄灭。通过该案例掌握RH850 GPIO输入模式配置、端口电平读取及基于轮询方式的输入处理逻辑。
硬件连接
- 按键一端接P70引脚,另一端接GND(按下为低电平)
- LED正极经限流电阻接P80引脚,负极接GND(输出高电平点亮)
- P70内部需启用上拉电阻,确保按键释放时引脚为确定高电平
软件实现
RH850的GPIO配置涉及端口模式寄存器(PM)、端口方向寄存器(P)和端口数据寄存器(PD)。P70需配置为输入模式(PM7.0=1),并使能内部上拉(PU7.0=1);P80需配置为输出模式(PM8.0=0)。读取按键状态通过端口数据寄存器PD7.0实现,控制LED通过PD8.0实现。
#include "r_cg_macrodriver.h"
#include "r_cg_port.h"
#include "r_cg_timer.h"
#include "r_cg_int.h"
#include "r_cg_cgc.h"
/* 按键与LED引脚定义 */
#define KEY_PIN P70
#define LED_PIN P80
#define KEY_PRESSED 0u /* 按键按下为低电平 */
void R_MAIN_Init(void)
{
/* 配置P70为输入模式,启用内部上拉 */
PM7 &= 0xFE; /* PM7.0 = 0,设为输入模式 */
PU7 |= 0x01; /* PU7.0 = 1,使能内部上拉 */
/* 配置P80为输出模式,初始输出低电平 */
PM8 &= 0xFE; /* PM8.0 = 0,设为输出模式 */
P8 &= 0xFE; /* P8.0 = 0,初始LED熄灭 */
}
void main(void)
{
R_MAIN_Init();
while(1)
{
/* 读取按键状态并控制LED */
if((P7 & 0x01) == KEY_PRESSED)
{
P8 |= 0x01; /* 按键按下,点亮LED */
}
else
{
P8 &= 0xFE; /* 按键释放,熄灭LED */
}
}
}
代码说明
初始化函数中,通过操作PM7寄存器将P70设为输入模式,PU7寄存器使能内部上拉电阻。P80通过PM8寄存器设为输出模式。主循环中持续读取P7寄存器bit0的状态,当检测到低电平时将P8寄存器bit0置1点亮LED,否则清零熄灭LED。该轮询方式无需中断,逻辑简单直观,适合理解GPIO输入处理的基本流程。
验证方法
将代码编译后烧录至RH850开发板,按以下步骤验证:
- 上电后观察LED应为熄灭状态(P80输出低电平)
- 按下按键(P70接地),LED应立即点亮
- 释放按键,LED应立即熄灭
- 重复按下/释放操作,LED状态应始终与按键状态一致
判定标准:按键按下时LED点亮、释放时LED熄灭,且响应无延迟、无抖动误触发,即表示GPIO输入检测功能正常。
注意事项:若按键未按下时LED闪烁或状态不稳定,需检查P70上拉电阻是否已正确使能;若按下无反应,请确认按键连接引脚是否为P70且接地正确。