【例1】利用定时器计数实现5中彩灯的变化形式,基于模模式的。两个标志位,一个是定时器计数,一个是彩灯的状态。

 #include "ioCC2530.h"

 #define D3  P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4 unsigned char count = ; //长定时累计变量
unsigned char led_stat = ; //彩灯状态标志 /*=======================简单的延时函数========================*/
void Delay(unsigned int t)
{
while(t--);
} /*======================端口初始化函数========================*/
void Init_Port()
{
P1SEL &= ~0x1b; //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口输出 D3 = ;
D4 = ;
D5 = ;
D6 = ; //P1 &= ~0x1b 0001 1011->1110 0100 或者P1 &= 0xe4
} /*=====================定时器1初始化函数======================*/
void Init_Timer1()
{
T1CC0L = 0xd4; //16MHz时钟128分频定时100ms
T1CC0H = 0x30; //设先填低8位,再填高8位
T1CCTL0 |= 0x04; //开启通道0的输出比较模式
T1IE = ; //使能定时器1中断
T1OVFIM = ; //使能定时器1溢出中断
EA = ; //使能总中断
T1CTL = 0x0e; //分频系数是128,模模式
} /*====================定时器1中断服务函数=====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
T1STAT &= ~0x01; //清除定时器1通道0中断标志
count++; //累加定时周期 定时器计数 if(count == ) //定时5秒时间到
{
count = ;
led_stat++;
if(led_stat == ) //设置了5种(0-4)彩灯变化方式
{
led_stat = ;
}
}
} /*=====================彩灯变换控制函数=======================*/
void LED_Control()
{
switch(led_stat)
{
case : //彩灯花式1 LED3闪烁
D3 = ~D3;
Delay();
break;
case : //彩灯花式2 1010—>0101
D3 = ;
D4 = ;
D5 = ;
D6 = ;
Delay();
D3 = ;
D4 = ;
D5 = ;
D6 = ;
Delay();
break;
case : //彩灯花式3 依次点亮依次熄灭
D3 = ;
Delay();
D4 = ;
Delay();
D5 = ;
Delay();
D6 = ;
Delay();
D3 = ;
Delay();
D4 = ;
Delay();
D5 = ;
Delay();
D6 = ;
Delay();
break;
case : //彩灯花式4 LED6闪烁
D6 = ~D6;
Delay();
break;
case : //彩灯花式5 依次点亮反向熄灭
D3 = ;
Delay();
D4 = ;
Delay();
D5 = ;
Delay();
D6 = ;
Delay();
D6 = ;
Delay();
D5 = ;
Delay();
D4 = ;
Delay();
D3 = ;
Delay();
break;
}
} /*==========================主函数============================*/
void main()
{
Init_Port(); //端口初始化
Init_Timer1(); //初始化定时器1
while()
{
LED_Control();
}
}

【例2】利用定时器实现按键的长按与短按,分别显示不同的效果。同样需要两个标志位。一个是按键按下的标志,一个是记录按下的时间的变量。

 #include "ioCC2530.h"

 #define D3  P1_0
#define D4 P1_1
#define D5 P1_3
#define D6 P1_4
#define SW1 P1_2 unsigned char count_t = ; //长定时累计变量
unsigned char K_Press = ; //按键按下标志
/*=======================简单的延时函数========================*/
void Delay(unsigned int t)
{
while(t--);
}
/*======================端口初始化函数========================*/
void Init_Port()
{
//初始化LED灯的I/O端口
P1SEL &= ~0x1b; //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口输出
//关闭所有的LED灯
P1 &= ~0x1b;
//初始化按键
P1SEL &= ~0x04; //P1_2作为通用I/O端口
P1DIR &= ~0x04; //P1_2端口输入
P1INP &= ~0x04; //P1_2设置为上拉/下拉模式
P2INP &= ~0x40; //P1_2设置为上拉
} /*=====================定时器1初始化函数======================*/
void Init_Timer1()
{
T1CC0L = 0xd4; //16MHz时钟128分频定时100ms
T1CC0H = 0x30; //设先填低8位,再填高8位
T1CCTL0 |= 0x04; //开启通道0的输出比较模式
T1IE = ; //使能定时器1中断
T1OVFIM = ; //使能定时器1溢出中断
EA = ; //使能总中断
T1CTL = 0x0e; //分频系数是128,模模式
} /*====================定时器1中断服务函数=====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
T1STAT &= ~0x01; //清除定时器1通道0中断标志
if(K_Press != ) //按键按下
{
count_t++; //计算按下按下的时间值
}
} /*====================按键扫描处理函数========================*/ void Scan_Keys() {
if(SW1 == )
{
Delay(); //去抖动处理
if(SW1 == )
{
K_Press = ; //标志按键正在按下
while(SW1 == ); //等待按键松开
K_Press = ; //标志按键已经松开 if(count_t > ) //按键长按
{
D6 = ~D6;
}
else //按键短按
{
D4 = ~D4;
}
count_t = ; //按键计数值清零
}
}
} /*==========================主函数============================*/
void main()
{
Init_Port(); //端口初始化
Init_Timer1(); //初始化定时器1
while()
{
Scan_Keys(); //扫描按键
}
}
05-22 12:51