• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

想做一个流水灯,但是就是出不来效果,代码写的不对吗?

想做一个流水灯,但是就是出不来要的那个效果,这样写代码对吗?

全部回复(36)
正序查看
倒序查看
backin
LV.4
2
2014-02-24 15:24

0
回复
backin
LV.4
3
2014-02-24 15:24
@backin
[图片]

介个是我想要的结果

0
回复
daylight
LV.4
4
2014-02-24 15:26
@backin
介个是我想要的结果[图片]
你这个稍微费劲啊
0
回复
backin
LV.4
5
2014-02-24 15:28
@daylight
你这个稍微费劲啊
求指导!!
0
回复
daylight
LV.4
6
2014-02-24 15:28
@backin
求指导!![图片]
帮你你写一个你试试,端口你自己修改
0
回复
stony_s
LV.3
7
2014-02-24 15:30
@backin
介个是我想要的结果[图片]
有那么难吗?
0
回复
daylight
LV.4
8
2014-02-24 15:31
@daylight
帮你你写一个你试试,端口你自己修改

#include

unsigned int i;

unsigned int j;

void main()

{

P1=~(1<

for(j=0;j<10000;j++);

if(i=8)

{

i=0;

}

}

你自己在试试看看行吗?我就是随手想了一个

 

0
回复
elio
LV.2
9
2014-02-24 15:32
@backin
介个是我想要的结果[图片]
把你想要的弄成一个数组,直接调用数组!简单,方便!
0
回复
daylight
LV.4
10
2014-02-24 15:33
@daylight
#includeunsignedinti;unsignedintj;voidmain(){P1=~(1
别用啊,刚试了一下不行,我写错了
0
回复
backin
LV.4
11
2014-02-24 15:34
@daylight
别用啊,刚试了一下不行,我写错了
没关系啊,谢谢那么热心
0
回复
backin
LV.4
12
2014-02-24 15:34
@elio
把你想要的弄成一个数组,直接调用数组!简单,方便!
数组?这个还不知道怎么调用啊,C语言中的数组我知道,可是怎么应用到这个上面来呢?
0
回复
daylight
LV.4
13
2014-02-24 15:35
@backin
没关系啊,谢谢那么热心

重新改了一下

#include

void delay50ms(unsigned int t)

{

unsigned char a,b;

while(t--)

{

for(b=165;b>0;b--)

for(a=150;a>0;a--);

}

}

void main(void)

{

char i,j;

char a=0x80,b;

while(1)

{

b=0x01;

P2=b;

delay50ms(10);

for(i=7;i>0;i--)

{

P2=a|b;

delay50ms(10);

for(j=i-1;j>0;j--)

{

a=(a>>1)&0x7f;

P2=a|b;

delay50ms(10);

}

b=a|b;

a=0x80;

}

}

}

0
回复
backin
LV.4
14
2014-02-24 15:36
@daylight
重新改了一下#includevoiddelay50ms(unsignedintt){unsignedchara,b;while(t--){for(b=165;b>0;b--)for(a=150;a>0;a--);}}voidmain(void){chari,j;chara=0x80,b;while(1){b=0x01;P2=b;delay50ms(10);for(i=7;i>0;i--){P2=a|b;delay50ms(10);for(j=i-1;j>0;j--){a=(a>>1)&0x7f;P2=a|b;delay50ms(10);}b=a|b;a=0x80;}}}
程序看懂了,就是有一个问题,感觉a=(a>>1)&0x7F跟a=(a>>1)应该是相等吧?可是把位或去掉为什么数码管逐个亮起,然后一直亮了呢?
0
回复
backin
LV.4
15
2014-02-24 16:00
@backin
程序看懂了,就是有一个问题,感觉a=(a>>1)&0x7F跟a=(a>>1)应该是相等吧?可是把位或去掉为什么数码管逐个亮起,然后一直亮了呢?

还是没搞明白这个点啊

0
回复
金鱼1
LV.3
16
2014-02-24 16:01
@backin
还是没搞明白这个点啊
我知道了,这是一个有符号和无符号的区别,看看a的定义,加上unsigned
0
回复
金鱼1
LV.3
17
2014-02-24 16:01
@金鱼1
我知道了,这是一个有符号和无符号的区别,看看a的定义,加上unsigned
因为在有符号数右移时,低位移出,各个位依次右移,最高位(符号位)保持不变
0
回复
backin
LV.4
18
2014-02-24 16:02
@金鱼1
我知道了,这是一个有符号和无符号的区别,看看a的定义,加上unsigned
原来是这样啊,懂了~谢谢

 

0
回复
金鱼1
LV.3
19
2014-02-24 16:03
@backin
原来是这样啊,懂了~谢谢 
把你的程序改成这样 void main(void){ char i,j; while(1) for(i=0,P2=1;i<7;i++) for(j=0,P2|=0x80;j<6-i;j++,P2=(0x80>>j)|(0xff>>(7-i))) delay50ms(10);}
0
回复
backin
LV.4
20
2014-02-24 16:04
@金鱼1
把你的程序改成这样voidmain(void){chari,j;while(1)for(i=0,P2=1;ij)|(0xff>>(7-i)))delay50ms(10);}
又想了了想还是不对啊,比如一开始a=0x80经a=(a>>1)&0x7f,后a应该是0x40,下一次循环应该是0x20,要是最高位保留就应该是a=0x80,a=0xc0,a=0xa0
0
回复
金鱼1
LV.3
21
2014-02-24 16:05
@backin
又想了了想还是不对啊,比如一开始a=0x80经a=(a>>1)&0x7f,后a应该是0x40,下一次循环应该是0x20,要是最高位保留就应该是a=0x80,a=0xc0,a=0xa0
的目的就是去除最高位啊,如果不加&,那么就是0xc0,0xe0,0xf0

 

0
回复
金鱼1
LV.3
22
2014-02-24 16:06
@backin
介个是我想要的结果[图片]
因为每次右移后都把值赋给了a。这段代码实际上也就等同于a=((a>>1)+0x80)&0x7f
0
回复
backin
LV.4
23
2014-02-24 16:07
@金鱼1
因为每次右移后都把值赋给了a。这段代码实际上也就等同于a=((a>>1)+0x80)&0x7f
也就是说,这一句其实可以把a一开始定义为unsigned char 型,然后就可以把后面的位或去掉?
0
回复
金鱼1
LV.3
24
2014-02-24 16:08
@backin
也就是说,这一句其实可以把a一开始定义为unsignedchar型,然后就可以把后面的位或去掉?
没错
0
回复
backin
LV.4
25
2014-02-24 16:09
@金鱼1
没错

懂了,谢谢

0
回复
Vurtne
LV.2
26
2014-02-24 16:09
你这样写程序  太繁琐了  你自己写的时候可能知道   别人在来读或以后你自己读的时候就会很麻烦  把想实现的功能写成函数  然后在主函数里面调用  
0
回复
candyman
LV.2
27
2014-02-24 16:10
@backin
也就是说,这一句其实可以把a一开始定义为unsignedchar型,然后就可以把后面的位或去掉?
卤煮,你代码太乱了啊
0
回复
matou
LV.3
28
2014-02-24 16:12
不是有个循环位右移么 unsigned char LED , LED = 0xfe; P1 = LED; LED = _crol_(LED,1)这样就渐变多了
0
回复
Vurtne
LV.2
29
2014-02-24 16:12
@Vurtne
你这样写程序 太繁琐了 你自己写的时候可能知道 别人在来读或以后你自己读的时候就会很麻烦 把想实现的功能写成函数 然后在主函数里面调用  

    函数 rightrot(x,n) 返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后得到的值。

unsigned rightrot(unsigned x, unsigned n)

{

      while (n > 0)

      {

            if ((x & 1) == 1)

                  x = (x >> 1) | ~(~0U >> 1);

            else

                  x = (x >> 1);n--;

        }

        return x;

}

这是我给你的函数 你可以输入X初值 然后 想移动几位就改变n的值就可以了

0
回复
backin
LV.4
30
2014-02-24 16:13
@Vurtne
你这样写程序 太繁琐了 你自己写的时候可能知道 别人在来读或以后你自己读的时候就会很麻烦 把想实现的功能写成函数 然后在主函数里面调用  

初挑战啊,见谅

0
回复
backin
LV.4
31
2014-02-24 16:14
@matou
不是有个循环位右移么unsignedcharLED,LED=0xfe;P1=LED;LED=_crol_(LED,1)这样就渐变多了
这就是一个流水灯啊
0
回复