Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1592328
  • 博文数量: 354
  • 博客积分: 8137
  • 博客等级: 中将
  • 技术积分: 5137
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-26 15:40
文章分类

全部博文(354)

文章存档

2010年(300)

2009年(54)

分类: 嵌入式

2010-06-22 16:37:45

文件:test.zip
大小:33KB
下载:下载

/*
** RTX-51的移植
** 此程序是循环花样显示LED灯
** 有三个显示样式,分别对应下面的三个进程
** 下面的算法中用到了“时间到空间”的转换,使得算法简化不少
** 此程序我已在Cepark 51开发板上试验通过。
** P0口接8个LED灯,低电平点亮!
*/

#include <reg51.h>
#include <rtx51tny.h>
const unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0xFF,0x00};

/*时间到空间的转换,如果table是:
const unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
则算法和代码会多出一倍来。table数组虽然增加了一倍,算法也随之减少了一半,
好处当然不止在这里体现,下面的进程2也减少了一半*/


 
//进程0 左->右->左


void LED0 (void) _task_ 0

{
     int i;
     os_create_task(1);//创建进程1

     os_create_task(2);//创建进程2

     while(1)
     {
            for (i = 0; i < 15; i++)
            {
                      P0 = table[i];
                   os_wait(K_TMO,30,0);//等待30*10000微妙 = 0.3秒

            }
            os_send_signal(1); //发送Signal信号,激活进程1

            os_wait(K_SIG,0,0); //等待信号

     }

}

 

//进程1 全亮->全灭->全亮


void LED1 (void) _task_ 1

{
     int i;
     while(1)
     {
            os_wait(K_SIG,0,0);
            for (i = 0; i < 3; i++)
            {
                      P0 = table[15]; //全亮

                   os_wait(K_TMO,30,0);
                   P0 = table[16]; //全灭

                   os_wait(K_TMO,30,0);
            }
         os_send_signal(2);
     }

}

 

//进程2 两边->中间中间->两边


void LED2 (void) _task_ 2

{
     int i;
     while(1)
     {
            os_wait(K_SIG,0,0);
            for (i = 0; i < 8; i++)
            {
                   P0 = table[i] | table[i+7]; //由于table长度多一倍,省去了一个循环,而且算法也简化了。

                   os_wait(K_TMO,30,0);
            }
           os_send_signal(0);

     }

}


阅读(1871) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~