流水灯的一点儿困惑

2020-02-01 16:31发布

如何用较为精悍的代码实现这个功能呢?

共有8颗LED,编号依次是1、2……8

实现目标:1流到8再1流到7再1流到6依次到全亮(10000000 、01000000……00000001、10000001、01000001……00000011、10000011、01000011……00000111依次到11111111)

如果用右移的办法不太合适,因为会冲掉右端显示的LED,如果用采用最笨的办法,代码量又很大,有没有较为简单的办法呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
CK345
1楼-- · 2020-02-01 21:52
查表
wsy2012
2楼-- · 2020-02-02 03:40
一般都是查表
zb05022005
3楼-- · 2020-02-02 08:30
 精彩回答 2  元偷偷看……
zysblog
4楼-- · 2020-02-02 11:09
wsy2012 发表于 2012-12-15 09:36
一般都是查表

查表,我算了一下,很浪费空间的,比如,我有16个灯,那么就有(1+16)*16/2*2=272个字节,这太浪费空间了吧,难道有更好的查表方法吗?
zysblog
5楼-- · 2020-02-02 13:18
zb05022005 发表于 2012-12-15 09:40
查表比较直接

用移位的话也行,把每一轮最后的值保存一下,然后下一轮移一次位后与该值相加就可以了,就保 ...

针对这个题,查表要耗费多少字节啊?
Tliang
6楼-- · 2020-02-02 18:48
int main(void)
{
        unsigned char i, j, value;
        while(1)
        {
                for(i = 0;i < 8;i++)
                {
                        value = ~(0xff >> i);
                        for(j = 0;j < 8 - i;j++)
                        {
                                P1 = (1 << j) | value;
                                delay(200);                               
                        }
                       
                }
        }
        return 0;
}
  1. int main(void)
  2. {
  3.         unsigned char i, j, value;
  4.         while(1)
  5.         {
  6.                 for(i = 0;i < 8;i++)
  7.                 {
  8.                         value = ~(0xff >> i);
  9.                         for(j = 0;j < 8 - i;j++)
  10.                         {
  11.                                 P1 = (1 << j) | value;
  12.                                 delay(200);                               
  13.                         }
  14.                        
  15.                 }
  16.         }
  17.         return 0;
  18. }
复制代码

一周热门 更多>