cc2530按下模块上“sw1”键按下时间不超过一秒松开后实现LED2灯亮两秒后熄灭

按下模块上“sw1”键按下时间不超过一秒松开后实现LED2灯亮两秒后熄灭(有中断和定时器)

以下是基于CC2530单片机的代码实现:

#include "ioCC2530.h"

#define LED2 P1_1
#define SW1 P0_1

#define TIMER_PRESCALER 128
#define TIMER_CLOCK_FREQ 32000000
#define TIMER_TICKS_PER_MS (TIMER_CLOCK_FREQ / TIMER_PRESCALER / 1000)

volatile unsigned int timerCount = 0;

void initTimer(void)
{
    T2CTL = 0x00; // stop timer
    T2CTL |= 0x0C; // set prescaler to 128
    T2IE = 1; // enable timer interrupt
    EA = 1; // enable global interrupts
}

void startTimer(unsigned int ms)
{
    unsigned int ticks = ms * TIMER_TICKS_PER_MS;
    T2CTL &= ~0x04; // clear timer overflow flag
    T2OVFIM = 0; // disable overflow interrupt
    T2OVFIF = 0; // clear overflow interrupt flag
    T2 = 0xFFFF - ticks + 1; // set timer count
    T2CTL |= 0x80; // start timer
    T2OVFIM = 1; // enable overflow interrupt
}

#pragma vector=T2_VECTOR
__interrupt void timer2_isr(void)
{
    T2CTL &= ~0x04; // clear timer overflow flag
    timerCount++;
}

void initIO(void)
{
    P1SEL &= ~0x02; // configure P1_1 as GPIO
    P1DIR |= 0x02; // configure P1_1 as output
    P0DIR &= ~0x02; // configure P0_1 as input
    P0INP |= 0x02; // enable pull-up resistor on P0_1
}

void initInterrupt(void)
{
    PICTL |= 0x01; // enable falling edge interrupt on P0_1
    IEN1 |= 0x08; // enable port 0 interrupt
}

#pragma vector=P0INT_VECTOR
__interrupt void port0_isr(void)
{
    if (SW1 == 0) // check if SW1 is pressed
    {
        startTimer(1000); // start timer for 1 second
    }
    else // SW1 is released
    {
        if (timerCount < 1000) // check if timer count is less than 1 second
        {
            LED2 = 1; // turn on LED2
            startTimer(2000); // start timer for 2 seconds
        }
        else // timer count is greater than or equal to 1 second
        {
            // do nothing
        }
        timerCount = 0; // reset timer count
    }
    P0IFG &= ~0x02; // clear interrupt flag on P0_1
}

void main(void)
{
    initIO();
    initInterrupt();
    initTimer();
    while (1)
    {
        // do nothing
    }
}

在上述代码中,我们使用了定时器2和外部中断来实现按下“sw1”键按下时间不超过一秒松开后实现LED2灯亮两秒后熄灭的功能。在初始化函数中,我们配置了LED2和SW1的IO口,并启用了外部中断和定时器2。在端口0的中断服务程序中,我们检查SW1是否被按下,并在按下时间不超过1秒的情况下启动一个1秒的定时器。在SW1松开后,我们检查定时器计数是否小于1秒,并在LED2上设置一个高电平以使其亮起。然后,我们启动一个2秒的定时器,在2秒后将LED2关闭。在定时器中断服务程序中,我们只是增加了计数器变量的值。