使用C语言中的左移/右移控制流水灯,有两种方法:
- 给的初值不变,移的位数变;
00000001 把1移动0位(把这个值作为基准行)
00000010 把1移动1位
00000100 把1移动2位
00001000 把1移动3位
00010000 把1移动4位
00100000 把1移动5位
01000000 把1移动6位
10000000 把1移动7位
代码实现
void Delay()
{
unsigned char i,j;
for(i=0; i<200; i++)
{
for(j=0; j<200; j++);
}
}
void main()
{
//变量值不变,移位的次数变化
unsigned char LedIntValue = 0x01, k;
while(1)
{
for(k=0; k<8; k++)
{
P0 = ~(LedIntValue << k);
Delay();
}
}
}
- 移的位数不变,让初值变;
00000001第0次把这个值作为基准行,然后移动1位,成下一行,
00000010 第1次把这一行作为基准行,然后移动1位
00000100 第2次把这一行作为基准行,然后移动1位
00001000 第3次把这一行作为基准行,然后移动1位
00010000 第4次把这一行作为基准行,然后移动1位
00100000 第5次把这一行作为基准行,然后移动1位
01000000 第6次把这一行作为基准行,然后移动1位
10000000 第7次把这一行作为基准行,然后移动1位
代码实现
void Delay()
{
unsigned char i,j;
for(i=0; i<200; i++)
{
for(j=0; j<200; j++);
}
}
void main()
{
//变量值变化,移位的次数不变
unsigned char LedIntValue = 0x01, k;
while(1)
{
unsigned char LedIntValue = 0x01; // 走完一圈for循环之后,LedIntValue变为了0x00,所以要重新赋值
for(k=0; k<8; k++)
{
P0 = ~LedIntValue;
Delay();
LedIntValue = LedIntValue << 1;
}
}
}
从逻辑关系来看,第一种更为简单也更合乎逻辑——只要把1挪动即可。