第一次写,有不对的地方还望大家多多指正。
任务要求:
1. 程序通电,节点盒的 LED1 、 LED2 灯都不亮。
2. 长按 SW1 键不松开, LED1 灯亮, LED2 灯熄灭。
3. 松开 SW1 键, LED1 、 LED2 亮灯都常亮。
4. 将编写好的程序发布到蓝色 ZigBee 节点盒中。
代码部分:
#include <iocc2530.h>
// 定义LED和开关对应的端口位
#define LED1 P1_0
#define LED2 P1_1
#define SW1 P1_2
#define OUT1 P1_5
#define OUT0 P1_6
// 定义无符号字符类型别名
#define unsigned char uchar
// 全局标志变量和计数器
int flag=0;
int count=0;
/**
* @brief 初始化GPIO端口
* 配置P1.2~P1.3为普通I/O,设置P1.0和P1.1为输出,P1.2为输入并上拉。
*/
void init_gpio()
{
P1SEL &= ~0x0C;
P1DIR |= 0x03;
P1INP |= 0x04;
}
/**
* @brief 延迟函数
* 通过循环计数实现延迟,时间取决于参数t。
* @param t 延迟时间,单位为循环次数。
*/
void delay(long t)
{
while(t--);
}
/**
* @brief 初始化中断
* 配置P1口中断,使能P1.2口的外部中断功能,并设置为上升沿触发。
*/
void initial_interrupt()
{
IEN2|=0x10; // 打开P1口中断的使能位
P1IEN|=0x04; // 使能P1.2口的外部中断功能
PICTL|=0x02; // 配置P1.3-P1.0的中断为上升沿触发
EA=1; // 打开全局中断使能
}
// P1口中断服务程序
#pragma vector=P1INT_VECTOR
__interrupt void P1_ISR()
{
// 如果按键SW1被按下且LED2为亮态,则关闭两个LED并重置相关变量
if (SW1==0&&LED2==1)
{
LED1=LED2=0;
flag=count=0;
}
flag=0; // 重置标志位
P1IF=0x00; // 清除P1口的中断标志
P1IFG=0x00; // 清除P1口的中断标志待触发状态
}
/**
* @brief 定期扫描按键状态并处理按键事件
* 检测按键SW1的状态,当按键被