任务要求
选用一个Zigbee节点盒(蓝色),新建IAR工程文件,实现板上LED灯的控制,考核选手Zigbee单片机基础知识的掌握,要求如下:
1、程序开始运行,LED1、LED2灯亮。
2、按键SW1单击,LED1灭、LED2亮。
3、按键SW1双击,LED1亮、LED2灭。
4、按键SW1三连击、LED1、LED2进入互相切换亮、灭状态,亮灭间隔为1秒,
5、能重复实现以上步骤。
参考源码
#include "ioCC2530.h"
#define LED1 P1_1
#define LED2 P1_0
#define SW1 P1_2
unsigned char count_t = 0; //按键生命周期累计
unsigned char count_s = 0; //1秒间隔定时累计
unsigned char K_Num = 0; //按键连击状态记录
unsigned char F_LED = 0; //LED灯状态切换标志
/*=======================简单的延时函数========================*/
void Delay(unsigned int t)
{
while(t--); //用于按键去抖动
}
/*======================端口初始化函数========================*/
void Init_Port()
{
//LED灯的引脚初始化
P1SEL &= ~0x03; //P1_0、P1_1为通用I/O端口
P1DIR |= 0x03; //P1_0、P1_1为输出端口
P1 |= 0x03; //LED1和LED2点亮
//按键SW1的引脚初始化
P1SEL &= ~0x04; //P1_2作为通用I/O端口
P1DIR &= ~0x04; //P1_2端口输入
P1INP &= ~0x04; //P1_2设置为上拉/下拉模式
P2INP &= ~0x40; //P1_2设置为上拉
}
/*=======================定时器1初始化========================*/
void Init_Timer1()
{
T1CC0L = 0xd4;
T1CC0H = 0x30; //16MHz时钟,128分频,定时0.1秒
T1CCTL0 |= 0x04; //开启通道0的输出比较模式
T1IE = 1; //开启定时器中断
EA = 1; //开启总中断
T1CTL = 0x0e; //分频系数是128,模模式
}
/*====================定时器1服务函数========================*/
#pragma vector = T1_VECTOR
__interrupt void Service_Timer1()
{
T1STAT &= ~0x20; //清除定时器1的溢出中断标志位
if(K_Num != 0 && SW1 != 0)
{
count_t++; //计算按键的生命周期
}
if(F_LED == 1) //启动灯光相互切换
{
count_s++;
if(count_s >= 10)
{
count_s = 0;
LED1 = ~LED1;
LED2 = ~LED2;
}
}
}
/*====================按键扫描处理函数========================*/
void Scan_Keys()
{
if(SW1 == 0)
{
Delay(100); //去抖动处理
if(SW1 == 0)
{
while(SW1 == 0); //等待按键松开
count_t = 0; //重新开始计算按键的生命周期
K_Num++; //改变按键状态
}
}
if(count_t > 5) //按键生命周期结束
{
switch(K_Num)
{
case 1: //按键单击
F_LED = 0;
LED1 = 0;
LED2 = 1;
break;
case 2: //按键双击
F_LED = 0;
LED1 = 1;
LED2 = 0;
break;
case 3: //按键三连击
F_LED = 1;
LED1 = 0;
LED2 = 1;
break;
}
K_Num = 0; //每处理完一次按键,状态清零
count_t = 0; //计时清零
}
}
/*==========================主函数============================*/
void main()
{
Init_Port(); //初始化I/O端口
Init_Timer1(); //初始化定时器1
while(1)
{
Scan_Keys(); //按键扫描
}
}

源码呢?
以下是我对这个源程序的理解改得:
#include //引用cc2530头文件
#define LED1 (P1_0) //宏定义LED1
#define LED2 (P1_1) //宏定义LED2
#define SW1 (P1_2) //宏定义SW1
typedef unsigned char uchar; //自定义uchar数据类型
typedef unsigned int uint ; //自定义uint数据类型
uchar count_t = 0 ; //按键生命周期统计(超过0.5秒就判断)
uchar k_num = 0; //按键连击统计
uchar count_s =0 ;//累计1秒统计
uchar F_LED = 0; //LED灯切换标志
/*=======普通延时函数delay()约0.54毫秒默认为16MHZ RC振荡的话=======*/
void delay(uint time)
{
uint i;
uchar j;
for (i=0; i<time; i++)
{
for (j=0; j=10)
{
count_s =0;
LED1 = ~LED1;
LED2 = ~LED2;
}
}
}
/*===========按键扫描处理函数scanKeys()============*/
void scanKeys()
{
if (SW1 == 0 )
{
delay(100); //去抖处理
if( SW1 ==1)
{
while(!SW1);//等待按键松开
count_t = 0;
k_num++;
/*====注意:最好在0.5秒这内执行第二次按键操作,否则就要
执行下面的判断操作了============*/
}
}
if(count_t > 5) //按键生命周期结束(松开按键0.5秒到了,开始判断)
{
switch(k_num)
{
case 1: //按键单击
F_LED = 0;
LED1 = 0;
LED2 = 1;
break;
case 2: //按键双击
F_LED = 0;
LED1 = 1;
LED2 = 0;
break;
case 3: //招键三击
F_LED =1;
LED1 = 0;
LED2 = 1;
break;
}
k_num = 0 ;//每处理完一次按键,状态清零
count_t =0;//计时清零
}
}
/*========主函数========*/
void main()
{
initPort();
initTimer1();
while(1)
{
scanKeys();
}
}
程序写的非常好,看了两遍,并写了一遍,终于理解了,