【例1】利用定时器计数实现5中彩灯的变化形式,基于模模式的。两个标志位,一个是定时器计数,一个是彩灯的状态。
1 #include "ioCC2530.h" 2 3 #define D3 P1_0 4 #define D4 P1_1 5 #define D5 P1_3 6 #define D6 P1_4 7 8 unsigned char count = 0; //长定时累计变量 9 unsigned char led_stat = 0; //彩灯状态标志 10 11 /*=======================简单的延时函数========================*/ 12 void Delay(unsigned int t) 13 { 14 while(t--); 15 } 16 17 /*======================端口初始化函数========================*/ 18 void Init_Port() 19 { 20 P1SEL &= ~0x1b; //P1_0、P1_1、P1_3和P1_4作为通用I/O端口 21 P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口输出 22 23 D3 = 0; 24 D4 = 0; 25 D5 = 0; 26 D6 = 0; //P1 &= ~0x1b 0001 1011->1110 0100 或者P1 &= 0xe4 27 } 28 29 /*=====================定时器1初始化函数======================*/ 30 void Init_Timer1() 31 { 32 T1CC0L = 0xd4; //16MHz时钟128分频定时100ms 33 T1CC0H = 0x30; //设先填低8位,再填高8位 34 T1CCTL0 |= 0x04; //开启通道0的输出比较模式 35 T1IE = 1; //使能定时器1中断 36 T1OVFIM = 1; //使能定时器1溢出中断 37 EA = 1; //使能总中断 38 T1CTL = 0x0e; //分频系数是128,模模式 39 } 40 41 /*====================定时器1中断服务函数=====================*/ 42 #pragma vector = T1_VECTOR 43 __interrupt void Timer1_Sevice() 44 { 45 T1STAT &= ~0x01; //清除定时器1通道0中断标志 46 count++; //累加定时周期 定时器计数 47 48 if(count == 50) //定时5秒时间到 49 { 50 count = 0; 51 led_stat++; 52 if(led_stat == 5) //设置了5种(0-4)彩灯变化方式 53 { 54 led_stat = 0; 55 } 56 } 57 } 58 59 /*=====================彩灯变换控制函数=======================*/ 60 void LED_Control() 61 { 62 switch(led_stat) 63 { 64 case 0: //彩灯花式1 LED3闪烁 65 D3 = ~D3; 66 Delay(60000); 67 break; 68 case 1: //彩灯花式2 1010—>0101 69 D3 = 1; 70 D4 = 0; 71 D5 = 1; 72 D6 = 0; 73 Delay(60000); 74 D3 = 0; 75 D4 = 1; 76 D5 = 0; 77 D6 = 1; 78 Delay(60000); 79 break; 80 case 2: //彩灯花式3 依次点亮依次熄灭 81 D3 = 1; 82 Delay(60000); 83 D4 = 1; 84 Delay(60000); 85 D5 = 1; 86 Delay(60000); 87 D6 = 1; 88 Delay(60000); 89 D3 = 0; 90 Delay(60000); 91 D4 = 0; 92 Delay(60000); 93 D5 = 0; 94 Delay(60000); 95 D6 = 0; 96 Delay(60000); 97 break; 98 case 3: //彩灯花式4 LED6闪烁 99 D6 = ~D6; 100 Delay(60000); 101 break; 102 case 4: //彩灯花式5 依次点亮反向熄灭 103 D3 = 1; 104 Delay(60000); 105 D4 = 1; 106 Delay(60000); 107 D5 = 1; 108 Delay(60000); 109 D6 = 1; 110 Delay(60000); 111 D6 = 0; 112 Delay(60000); 113 D5 = 0; 114 Delay(60000); 115 D4 = 0; 116 Delay(60000); 117 D3 = 0; 118 Delay(60000); 119 break; 120 } 121 } 122 123 /*==========================主函数============================*/ 124 void main() 125 { 126 Init_Port(); //端口初始化 127 Init_Timer1(); //初始化定时器1 128 while(1) 129 { 130 LED_Control(); 131 } 132 }
【例2】利用定时器实现按键的长按与短按,分别显示不同的效果。同样需要两个标志位。一个是按键按下的标志,一个是记录按下的时间的变量。
1 #include "ioCC2530.h" 2 3 #define D3 P1_0 4 #define D4 P1_1 5 #define D5 P1_3 6 #define D6 P1_4 7 #define SW1 P1_2 8 9 unsigned char count_t = 0; //长定时累计变量 10 unsigned char K_Press = 0; //按键按下标志 11 /*=======================简单的延时函数========================*/ 12 void Delay(unsigned int t) 13 { 14 while(t--); 15 } 16 /*======================端口初始化函数========================*/ 17 void Init_Port() 18 { 19 //初始化LED灯的I/O端口 20 P1SEL &= ~0x1b; //P1_0、P1_1、P1_3和P1_4作为通用I/O端口 21 P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口输出 22 //关闭所有的LED灯 23 P1 &= ~0x1b; 24 //初始化按键 25 P1SEL &= ~0x04; //P1_2作为通用I/O端口 26 P1DIR &= ~0x04; //P1_2端口输入 27 P1INP &= ~0x04; //P1_2设置为上拉/下拉模式 28 P2INP &= ~0x40; //P1_2设置为上拉 29 } 30 31 /*=====================定时器1初始化函数======================*/ 32 void Init_Timer1() 33 { 34 T1CC0L = 0xd4; //16MHz时钟128分频定时100ms 35 T1CC0H = 0x30; //设先填低8位,再填高8位 36 T1CCTL0 |= 0x04; //开启通道0的输出比较模式 37 T1IE = 1; //使能定时器1中断 38 T1OVFIM = 1; //使能定时器1溢出中断 39 EA = 1; //使能总中断 40 T1CTL = 0x0e; //分频系数是128,模模式 41 } 42 43 /*====================定时器1中断服务函数=====================*/ 44 #pragma vector = T1_VECTOR 45 __interrupt void Timer1_Sevice() 46 { 47 T1STAT &= ~0x01; //清除定时器1通道0中断标志 48 if(K_Press != 0) //按键按下 49 { 50 count_t++; //计算按下按下的时间值 51 } 52 } 53 54 /*====================按键扫描处理函数========================*/ 55 56 void Scan_Keys() 57 58 { 59 if(SW1 == 0) 60 { 61 Delay(100); //去抖动处理 62 if(SW1 == 0) 63 { 64 K_Press = 1; //标志按键正在按下 65 while(SW1 == 0); //等待按键松开 66 K_Press = 0; //标志按键已经松开 67 68 if(count_t > 10) //按键长按 69 { 70 D6 = ~D6; 71 } 72 else //按键短按 73 { 74 D4 = ~D4; 75 } 76 count_t = 0; //按键计数值清零 77 } 78 } 79 } 80 81 /*==========================主函数============================*/ 82 void main() 83 { 84 Init_Port(); //端口初始化 85 Init_Timer1(); //初始化定时器1 86 while(1) 87 { 88 Scan_Keys(); //扫描按键 89 } 90 }
原文地址:https://www.cnblogs.com/yuling520/p/12694256.html
时间: 2024-11-01 21:50:56