搜索
bottom↓
回复: 17

流水灯的一点儿困惑

[复制链接]

出0入0汤圆

发表于 2012-12-15 09:22:14 | 显示全部楼层 |阅读模式
如何用较为精悍的代码实现这个功能呢?

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

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

如果用右移的办法不太合适,因为会冲掉右端显示的LED,如果用采用最笨的办法,代码量又很大,有没有较为简单的办法呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入85汤圆

发表于 2012-12-15 09:33:53 | 显示全部楼层
查表

出0入0汤圆

发表于 2012-12-15 09:36:24 来自手机 | 显示全部楼层
一般都是查表

出0入0汤圆

发表于 2012-12-15 09:40:55 | 显示全部楼层
查表比较直接

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

出0入0汤圆

 楼主| 发表于 2012-12-15 09:42:18 | 显示全部楼层
wsy2012 发表于 2012-12-15 09:36
一般都是查表

查表,我算了一下,很浪费空间的,比如,我有16个灯,那么就有(1+16)*16/2*2=272个字节,这太浪费空间了吧,难道有更好的查表方法吗?

出0入0汤圆

 楼主| 发表于 2012-12-15 09:45:36 | 显示全部楼层
zb05022005 发表于 2012-12-15 09:40
查表比较直接

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

针对这个题,查表要耗费多少字节啊?

出0入0汤圆

发表于 2012-12-15 10:37:59 | 显示全部楼层
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. }
复制代码

出0入0汤圆

发表于 2012-12-15 10:45:27 来自手机 | 显示全部楼层
4楼的方法可行。当前面8次直接使用右移指令即可。后面8次采用4楼说的用sum+1<<i

出0入0汤圆

发表于 2012-12-15 10:47:18 来自手机 | 显示全部楼层
看错了,是sum+0x80>>i

出0入0汤圆

 楼主| 发表于 2012-12-15 12:57:24 | 显示全部楼层
Tliang 发表于 2012-12-15 10:37
int main(void)
{
        unsigned char i, j, value;

这是一个不错的思路,用C语言实现起来就是简单啊……

出0入0汤圆

发表于 2012-12-15 13:32:13 | 显示全部楼层
zysblog 发表于 2012-12-15 12:57
这是一个不错的思路,用C语言实现起来就是简单啊……

汇编一样简单

出0入0汤圆

发表于 2012-12-15 13:42:28 来自手机 | 显示全部楼层
用c实现,可以有一个专门的函数

出0入0汤圆

发表于 2012-12-15 13:54:46 | 显示全部楼层
无所谓浪费不浪费、单片机里面几 K 的空间不用白不用、除非你程序写满 ROM 了、我至今写过的程序没哪个是完全占完 ROM 的、最多快把 RAM 占完了、

如果你怕占多了可以做一下表的压缩、提取出相同的数值写入一个表、再用第二个表表示位置信息、或者其它方法、

出0入0汤圆

发表于 2012-12-15 14:23:44 | 显示全部楼层
本帖最后由 Tliang 于 2012-12-15 14:57 编辑
  1.                 ORG 00H
  2.                 LJMP MAIN
  3.                 ORG 30H

  4. MAIN:        MOV R0,#8    ;第一个循环初值
  5.                 MOV R2,#00H         ;保留的值

  6. LOOP1:  MOV A, R0         ;第二个循环初值
  7.                 MOV R1,A         ;没有MOV Rn,Rn指令用两条指令
  8.                 MOV R3,#1         ;移位变量

  9. LOOP2:  MOV A,R3         ;先将数据移位.
  10.                 RL  A                 
  11.                 MOV R3,A         ;保存移位数据
  12.                 RR  A                 ;原来数据
  13.         ORL A,R2         ;将保留的值或上将显示的值
  14.                 MOV P1,A         ;显示
  15.                 LCALL DELAY         ;延时
  16.                 DJNZ R1,LOOP2;继续移位
  17.                                
  18.                 MOV A,R2         ;移位完成进行保留值计算
  19.                 RR  A                 ;右移一位或80H得到保留值
  20.                 ORL A,#80H
  21.                 MOV R2,A         ;保存保留值
  22.                 DJNZ R0,LOOP1;显示

  23.                 LJMP MAIN         ;大循环

  24.                 END                         ;结束
复制代码
好久没用汇编了,其实主要是思路。
什么语言无所谓

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-12-15 15:34:11 | 显示全部楼层
这个还是用汇编简便~~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-12-15 16:09:52 | 显示全部楼层
c用的比较习惯。

出0入0汤圆

发表于 2012-12-16 19:43:25 | 显示全部楼层
michaelwang333 发表于 2012-12-15 16:09
c用的比较习惯。

你看这样行不,循环次数每次减1,用右移函数,另外把每次循环的初始状态(上次循环结束时)事先存入数组,并调用。。。我,,新手

出0入0汤圆

 楼主| 发表于 2012-12-17 10:45:39 | 显示全部楼层
Tliang 发表于 2012-12-15 14:23
好久没用汇编了,其实主要是思路。
什么语言无所谓

说的不错,主要是思路,我用的是PIC的汇编。你的答案给了我较大的帮助,多谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表