2. 按键控制LED

任务说明

本案例基于TI CC2530开发板,实现按键控制LED的基本输入输出功能:当按键按下时LED点亮,松开时LED熄灭。通过该案例掌握CC2530的GPIO方向寄存器(PxDIR)、端口输入寄存器(PxIN)和端口输出寄存器(PxOUT)的配置与使用方法。

硬件连接

本案例使用开发板上的独立按键S1和LED1,连接关系如下:

  • LED1正极经限流电阻接P1_0引脚,负极接地——P1_0配置为输出模式,输出高电平点亮LED。
  • 按键S1一端接P0_0引脚,另一端接地——P0_0配置为输入模式,内部上拉,按键按下时引脚读到低电平。
CC2530 P0_0 (按键输入) P1_0 (LED输出) S1 GND R1 VCC(3.3V) LED1 R2 GND P0_0 P1_0

代码实现

创建文件 key_led.c,代码如下:


#include <ioCC2530.h>

#define LED1 P1_0
#define KEY  P0_0

void delay(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 535; j++);
}

void main(void)
{
    // 配置P1_0为输出模式
    P1SEL &= ~0x01;   // P1_0作为通用IO
    P1DIR |= 0x01;    // P1_0方向为输出
    
    // 配置P0_0为输入模式,带上拉
    P0SEL &= ~0x01;   // P0_0作为通用IO
    P0DIR &= ~0x01;   // P0_0方向为输入
    P0INP &= ~0x01;   // P0_0为上拉/下拉模式(由P2INP决定)
    P2INP &= ~0x20;   // P0组选择上拉
    
    LED1 = 0;         // 初始熄灭LED
    
    while (1) {
        if (KEY == 0) {      // 按键按下(低电平有效)
            delay(10);       // 软件消抖
            if (KEY == 0) {  // 确认按下
                LED1 = 1;    // 点亮LED
            }
        } else {
            LED1 = 0;        // 松开熄灭
        }
    }
}

代码说明

  • 引脚功能选择:P0SEL和P1SEL的对应位清零,将P0_0和P1_0配置为通用GPIO模式,而非外设功能。
  • 方向配置:P1DIR第0位置1使P1_0为输出;P0DIR第0位清零使P0_0为输入。
  • 上拉配置:P0INP第0位清零使P0_0受P2INP控制,P2INP第5位清零选择P0组上拉模式,保证按键未按下时读到高电平。
  • 消抖处理:检测到按键按下后延时10ms再次确认,避免机械抖动导致的误触发。

编译与烧录

使用IAR Embedded Workbench for 8051创建工程,将上述代码加入工程,编译生成HEX文件。通过CC Debugger或SmartRF04EB仿真器连接开发板,使用SmartRF Flash Programmer将HEX文件烧录到CC2530芯片中。

验证方法

烧录完成后,开发板上电运行,按以下步骤验证:

  1. 观察LED1初始状态应为熄灭。
  2. 按下按键S1,LED1应立即点亮。
  3. 松开按键S1,LED1应立即熄灭。
  4. 快速连续按动按键,LED1应跟随按键状态同步亮灭,无异常闪烁。

判定标准:按键按下时LED点亮、松开时熄灭,且状态切换无延迟卡顿,即判定本案例功能实现正确。