4. 按键控制LED亮灭

任务说明

本案例使用寄存器操作方式,完成按键控制LED亮灭的功能。按下按键时LED点亮,松开按键时LED熄灭。通过本案例掌握GPIO引脚的输入模式配置方法、按键状态读取方法以及基于按键状态控制输出的基本逻辑。

硬件连接

  • LED正极经限流电阻(约330Ω)接至单片机P1.0引脚,LED负极接GND
  • 按键一端接P1.1引脚,另一端接GND(低电平有效)
  • P1.1引脚需配置为输入模式,并启用内部上拉电阻,确保按键未按下时引脚为高电平

寄存器配置说明

本案例基于8051单片机(以STC89C52为例)。P1口为准双向I/O口,默认状态下即可作为输入读取。当按键未按下时,内部上拉使P1.1为高电平;按下后P1.1被拉低。因此只需将P1.1设为输入(写入1),然后循环读取P1.1的状态即可。LED控制引脚P1.0设为推挽输出(写入0),输出低电平时LED点亮。

代码实现


#include <reg52.h>

// 定义按键与LED对应的引脚位
sbit KEY = P1^1;    // 按键输入引脚
sbit LED = P1^0;    // LED输出引脚

void main(void)
{
    // 配置P1.0为输出模式(推挽),P1.1为输入模式(高阻带上拉)
    // 准双向口模式下,写1即为输入,写0为输出
    P1 = 0x02;      // P1.1=1(输入),P1.0=0(输出)
    
    while(1)
    {
        if(KEY == 0)    // 检测按键是否按下(低电平有效)
        {
            LED = 0;    // 点亮LED(输出低电平)
        }
        else
        {
            LED = 1;    // 熄灭LED(输出高电平)
        }
    }
}

代码说明

程序首先将P1口整体赋值为0x02,即二进制0000_0010,使P1.1为高电平(输入状态),P1.0为低电平(输出状态)。主循环中持续读取KEY引脚电平:当按键按下时KEY为0,LED输出低电平点亮;松开时KEY为1,LED输出高电平熄灭。由于按键存在机械抖动,本案例为演示基础功能未加入消抖处理,实际工程中可增加延时消抖或定时扫描机制。

编译与烧录

  1. 使用Keil C51创建工程,选择对应单片机型号(如STC89C52)
  2. 将上述代码保存为main.c并加入工程
  3. 编译生成HEX文件
  4. 使用STC-ISP烧录软件将HEX文件下载至单片机

验证方法

将程序烧录至单片机后,观察以下现象:

  • 初始状态(未按键):LED处于熄灭状态
  • 按下按键不放:LED应持续点亮
  • 松开按键:LED立即熄灭

若上述现象与预期一致,则说明GPIO输入模式配置正确,按键状态读取与LED控制逻辑工作正常。若按键按下时LED无反应,可检查按键接线是否接触良好、P1.1是否确实被拉低;若LED常亮不灭,则检查P1.0输出配置是否正确。

按键控制LED电路连接与信号流向 8051 单片机 P1.0 P1.1 LED 330Ω GND 按键 GND 内部上拉 电阻(约50kΩ) 读P1.1 写P1.0 按键按下 → P1.1=0 → LED点亮(P1.0=0) 按键松开 → P1.1=1 → LED熄灭(P1.0=1)

判定标准

完成烧录后,通过实际操作按键验证:按下按键LED立即点亮,松开后LED立即熄灭,循环操作均能正确响应,即可判定本案例实现成功。若需进一步验证输入模式配置的正确性,可在按键未按下时测量P1.1引脚电压应为高电平(约3.3V或5V),按下时应为低电平(接近0V)。