关于单片机流水灯0x7e的控制问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 05:53:03
程序如下:
#include"reg51.h"
void delay()
{unsigned char i,l,j;
for(i=200;i>0;i--)
for(l=20;l>0;l--)
for(j=246;j>0;j--);
}
void main()
{while(1)
{unsigned char temp,a;
temp=0x7e;
for(a=8;a>0;a--)
{P1=temp;
delay();
temp>>=1;

}
}
}
在进行循环的时候,应该是一八灯一直亮,为什么第一次循环一结束第一灯就不亮了。

C语言里没有循环移位的指令。所以楼主的程序经过移位后,就变成全0了。
在头文件里加这个:intrins.h。
在主程序里调用这个_cror_(x,i)(右移)或者_crol_(x,i)(左移)。x是被移位的字符,i是移动的位数。

我看你这程序,怎么不像“流水灯”呢?

将此句temp=0x7e;
改为temp=0x7f;

>>是移位操作,在被操作数是无符号数时,每移动一位,最高位就会被置零,所以当移动8次以后,temp就等于零了,然后是temp再次赋值0x7e,依次循环。
如果你想实现的是带进位的循环,可以自己写一个函数,也可以使用库函数_cror_(x,i)(右移)或者_crol_(x,i)(左移),但是如果使用这两个库函数必须加上头文件,即#include<intrins.h>
x是你希望的操作数,相当于你的temp,i是每次移动的位数。