按下模块上“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关闭。在定时器中断服务程序中,我们只是增加了计数器变量的值。