单片机AT89C51单片机流水灯修改成先亮一个后亮两个一直循环到亮八个怎么改?

应该如何修改我的程序语句?请说详细点,或者直接帮我写出结果,多谢🙏

根据你的格式那就这样改吧:
主函数while(1)里面改成

P2=(P2<<1)|0x01;
delay500ms();
if(P2==0xFF)
P2=0x00;追问

请问怎么写才能让它从八灯齐亮再一个一个灭到一个灯亮?这样就可以跟一个一个亮呈完美循环了

追答

这样啊,那你搞个标志位也可以
char flag=0;
P2=0x00;
while(1)
{
if(flag == 0)
{
P2=(P2>1;
if(P2==0x01)
flag=0;
delay500ms();
}
}

追问

啊,这是把原来while那删掉再加进去吗吗?还有P2=(P21;那边是不是)错打成1了?

追答

哪里有P21,你那里显示跟我的不一样?

追问

真的谢谢!!

我现在上单片机实训,之前没好好上c语言的课,现在补的头都要秃了TT

我已经采纳了吧?

追答

不是吧,还真的显示变得不一样了,真的是奇了怪了

追问

大哥,能否再帮我写一下你帮我改的那个函数的程序流程图?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-11
封箱胶带质量
第2个回答  2019-12-11
很简单,把I/O口的驱动状态与循环变量相关联就OK。追问

???

追答

比较简单的做法是:定义一个数组,并把驱动码0x01、0x03、0x07、0x1F、0x3F、0x7F、0xFF赋值数组,然后,在你的流水驱动代码外面套一个for循环,以循环变量为数组下标,每外循环一次把数组的驱动码赋值给P2就行了。

第3个回答  2019-12-11
左移一位之后,要再+1;
直接左移,0000 0001左移会变成0000 0010,只亮一个,再+1才会变成0000 0011,亮两个。追问

<<1后面再加+1?

追答

对,循环左移会把最高位的0移动到最低位,用+1把它变成1;所以初始化之后那句if可以不用了,即使初始化之后0000 0000,因为+1也会把它点亮。
然后要考虑的问题是八个全亮之后1111 1111再+1会溢出。

第4个回答  2019-12-11
MCS-51单片机内部有四个并行I/O口:P0、P1、P2、P3 看你后边怎么接追问

只需要改c语言就可以了 不需要再接

第5个回答  2019-12-11
...每次循环则是第一个灯亮这样就追问

详细点吧,写结果也行求求了