C语言C51单片机花样流水灯程序分析注释

#include<reg52.h>
#define uint unsigned int
void delay(uint);
main()
{
uint fre=0x04;
uint fre1,fre2;
uint comp1=0xfe,comp2=0x80;
while(1)
{
/*--------------------------------------------------------------------
模块1:循环单向闪烁,只有一个灯亮灭
执行3次,转入下一种闪烁
--------------------------------------------------------------------------*/
P1=0xfe;
while(1!=fre--)
{
fre1=0x08;
while(1!=fre1--)
{
delay(3000000);
P1<<=1;
P1|=0x01;
if(P1==0x7f)
{
delay(3000000);
P1=0xfe;
}
}
}
/*-------------------------------------------------------------------
模块2:循环单向闪烁,只有两个灯亮或者灭
执行3次,转入下一种闪烁
--------------------------------------------------------------------*/
P1=0xfc;
while(3!=fre++)
{
fre2=0x04;
while(1!=fre2--)
{
delay(3000000);
P1<<=2;
P1|=0x03;
if(P1==0x3f)
{
delay(3000000);
P1=0xfc;
}
}
}
}
}
void delay(uint cnt)
{
while(cnt--);
}
帮忙给每句标一下注释,解释下什么意思,初学者

第1个回答  推荐于2017-11-21
和你说一句关键的(别告我你整个程序一句都看不懂):
P1=0xfe;

0xfe是十六进制表示的数,二进制就是1111 1110,通过你的程序和相关注释可以看出,硬件上你有8个led灯连接P1口,且这些led是低电平亮。P1=0xfe(1111 1110)也就是表示七个灯灭,一个灯亮。接下来的代码就是让P1数据0xfe左移且低位补1,移一次就是1111 1101,、两次就是1111 1011,三次是1111 0111。。。以此类推,可以看出它是0由最低位到最高位依次移过去的,而刚说了0表示led亮,这也就是led从一边到另一边依次点亮的效果。
后面的代码按我上面说的自己理解,完全对你解释太麻烦,对你也没多大好处,只有你自己理解了才能学好单片机追问

{
delay(3000000);
P1<<=1;
P1|=0x01;
if(P1==0x7f)
{
delay(3000000);
P1=0xfe;
}
P1后面的那根丨什么意思啊

追答

或运算,那一句也就是相当于P1=P1|0x01,也就是把最低位置1

或运算,那一句也就是相当于P1=P1|0x01,也就是把最低位置1

本回答被提问者和网友采纳