winnie 发表于 2009-3-24 14:09:38

如何有效的实时控制LED闪烁。

在很多设计中需要有精彩而实用的LED闪烁来表示设备工作正常与否和工作状态。
在一些实时性要求不高的设计中可以用插入延时来控制LED闪烁。
它的缺点现而易见:1:LED闪烁方式反映慢。2:在延时过程不能干其它工作(中断除外),浪费了资源。3:代码雍长,真正控制LED就几个个指令,其它的延时代码占了99%的空间。
如果用TMR1或TMR2来做一个时钟,上面的种种缺点就可以避免,使得你可以腾出大量的时间做更有效的工作。
下面是用TMR1作时钟的C代码(RB1、RB2、RB3控制LED)示例:
void set_tmr1(){
TMR1L=0xdc;
TMR1H=0xb;       /*设定初值3036*/
T1CON=0B10001;             /*设定TMR1   0.125s溢出一次*/
}
void interrupt time(){
         if(TMR1IF){
                         T1CON=0B10000;            /*关闭TMR1*/
                         TMR1L=0xdc;                  
                         TMR1H=0xb;                   /*TMR1设初值*/
                         T1CON=0B10001;            /*从新设分频比,打开TMR1*/
                        if(s++>8){      /*每S清0*/
                                        s=0;
                                        if(ss++>60)/*每分钟清0*/
                                                   ss=0;
             }
            TMR1IF=0;
            return;
          }
}

unsigned char s;                  /*每0.125S累加1*/
unsigned char ss;                  /*每1秒累加1*/
void main(){
               set_tmr1();
........;                           /*设定I/O口,开TMR1中断*/
            while(1){
                  if(...)                              /*判断闪烁方式语句,下同*/
                  RB1=(bit)(s>4);            /*每1s闪烁一次,占空比50%(调节>后面值可以改变)*/
                   if(...)
                     RB2=(bit)(!ss);             /*每1分钟闪烁一次,亮1秒,熄59秒*/
                   if(...)
                  RB3=(bit)(s==0 || s==2 || s== 4 || s== 6);      /*每0.25S闪烁一次*/
                      .........;                            /*其它工作*/
                  }
}
这样的框架对于基于要求实时性高的软件查询的程序是很有效的。
页: [1]
查看完整版本: 如何有效的实时控制LED闪烁。