下面分别用三种方法来控制实现循环流水灯。
// 杨玉祥 循环流水 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);
}
}