谢谢各位指点。 |
#include <reg52.h> #include<intrins.h> unsigned int j,temp,temp1; void delay(t) { while(t--); } void main() { temp=0xfe; temp1=0x7f; while(1) { for(j=0;j<8;j++) { P1=temp; delay(10000); temp=_crol_(temp,1); //左移 } for(j=0;j<16;j++) //循环右移点亮16次,即两轮,改次数即可改轮数 { P1=temp1; temp1=_cror_(temp1,1); //右移 delay(10000); } } } |
左右往复,一般这么写: #include <reg52.h> #include <INTRINS.H> bit way; void main() { unsigned int i; P2 = 0xfe; while(1) { if(P2 == 0xfe) way = 1; //在右端,进入左移模式 if(P2 == 0x7f) way = 0; //在左端,进入右移模式 if(way) P2 = _crol_(P2,1); //左移 else P2 = _cror_(P2,1); //右移 for(i=0;i<30000;i++); 延时 } } |
本帖最后由 188610329 于 2022-5-28 18:21 编辑 ccczzzyy 发表于 2022-5-28 17:43 左右往复,一般这么写: #include <reg52.h> #include <INTRINS.H> bit way; void main() { unsigned int i; P2 = 0xfe; while(1) { if(P2 == 0xfe) way = 1; //在右端,进入左移模式 if(P2 == 0x7f) way = 0;//在左端,进入右移模式 if(way) P2 = _crol_(P2,1); //左移 else P2 = _cror_(P2,1); //右移 for(i=0;i<30000;i++); 延时 } } |
188610329 发表于 2022-5-28 11:52 谢谢您的帮助,也验证了程序。用库函数很简洁,我想将他改成从右移到左,然后从左往右移动,但总是解决不了,要么不动,要么就一个方向移动。应该如何写。谢谢。 |
流水灯,一般这么写: #include <reg52.h> #include <INTRINS.H> void main() { unsigned int i; P2 = 0xfe; while(1) { P2 = _crol_(P2,1); //左移 // P2 = _cror_(P2,1); //右移 for(i=0;i<30000;i++); 延时 } } |
<< 左移 高位丢弃,低位补0 >> 右移低位丢弃。对正数左补0,负数左补1 两个符号定义是不一样,不能换一符号就能达到你想要的效果 还是用“_crol_” 与“_cror_”实现左右循环吧 |
左和右是相对于你板子上的LED排列而言的,默认是从左到右依次P20~P27 |
谢谢各位的指点,也谢谢版主对主题的编辑,“关于单片机流水灯程序的流动方向修改”,使其更有可读性,目的更明确。 |
这个么其实也不用改的只需改变板的方位上下左右移不就变了嘛,又不是显示文字数字区别明显 |
P2口的排列顺序是反着的,与其它的三个口不一样 |
你这两个程序写的不错,关键就在第 26 行语句,要想实现你的想法只要将这条语句相互交换一下即可实现你的想法了。再或是把两段程序里的第 26 条语句里的【 << 和 >> 】相互交换也可以! |