单片机 循环流水灯

下面分别用三种方法来控制实现循环流水灯。

// 杨玉祥  循环流水  2018/7/21

#include <reg51.h>
#define N 100
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);

/*void main()             //最简单,bite控制循环流水灯
{
    while (1)
    {
        P1 = 0xfe;
        DelayMs(N);
        P1 = 0xfd;
        DelayMs(N);
        P1 = 0xfb;
        DelayMs(N);
        P1 = 0xf7;
        DelayMs(N);
        P1 = 0xef;
        DelayMs(N);
        P1 = 0xdf;
        DelayMs(N);
        P1 = 0xbf;
        DelayMs(N);
        P1 = 0x7f;
        DelayMs(N);
    }    
}*/
/*void main()              //法2,查表法循环流水
{
    unsigned char code table[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};   //code,把table放在ROM里;否则,定义在RAM里
    int i;
    while(1)
    {
        for(i=0;i<8;i++)
        {
            P1 = table[i];
            DelayMs(N);
        }
    }    
}*/
void main()               //法3,位移循环流水
{
    int i,j;
    while(1)
    {
        P1 = j = 0xfe;    //j的存在,为P1提供了一个数据缓存的点
        DelayMs(N);
        for(i=0;i<8;i++)
        {
        
            j <<= 1;
            j = j|0x01;
            P1 = j;
            DelayMs(N);
        }
        P1 = j = 0x7f;
        DelayMs(N);
        for(i=0;i<8;i++)
        {
        
            j >>= 1;
            j = j|0x80;
            P1 = j;
            DelayMs(N);
        }
    }
    
}

void DelayUs2x(unsigned char t)  //延迟t = 2t+5/6/7 us
{
    while(--t);
}

void DelayMs(unsigned char t)    //延迟t = t ms
{
    while(t--)
    {
        DelayUs2x(245);
        DelayUs2x(245);
    }  
}

猜你喜欢

转载自blog.csdn.net/janmesyang/article/details/81143767