找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 22007|回复: 17
打印 上一主题 下一主题
收起左侧

51单片机学习板的8个LED灯,想从中间往两边流水亮怎么用程序实现?请高手帮下

  [复制链接]
跳转到指定楼层
楼主
ID:321920 发表于 2018-5-13 12:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用一个LED变量是可实现流水灯的,但用两个怎么实现?我用上面的方法,显示是只亮一个灯,请高手指点

单片机源程序:
  1. #include "reg52.h"                         
  2. #include<intrins.h>                 

  3. typedef unsigned int u16;           
  4. typedef unsigned char u8;

  5. #define led1 P2    
  6. #define led2 P2   

  7. void delay(u16 i)
  8. {
  9.         while(i--);        
  10. }


  11. void main()
  12. {
  13.         u8 i;
  14.         while(1)
  15.         {
  16.          led1=0xef;
  17.                 led2=0xf7;
  18.         delay(50000);  
  19.         
  20.                
  21.                 for(i=0;i<3;i++)         
  22.                 {
  23.                          led1=_crol_(led1,1);
  24.                         led2=_cror_(led2,1);
  25.                         delay(50000);  
  26.                 }
  27.                 for(i=0;i<3;i++)         
  28.                 {
  29.                          led1=_cror_(led1,1);
  30.                         led2=_crol_(led2,1);
  31.                         delay(50000);  
  32.                 }        
  33.                         
  34. }
  35. }
复制代码



评分

参与人数 1黑币 +8 收起 理由
cciejs12345 + 8 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 4#
ID:47286 发表于 2018-5-13 15:23 | 只看该作者
没编译 用记事本随便写的 不保证全对 你试试看吧 如果问题 自己想想怎么改 能改好也是进步啊 如果没问题 最好也读一下 好歹算是一种思路

#include "reg52.h"

#define unsigned char uchar
#define unsigned int uint

uchar i=0;        //定义循环变量 并赋值

uchar code a[]={0x00,0x18,0x24,0x42,0x81};        //定义循环数组
//循环数组说明 如果led共阳 上电后全亮 然后从中间两个开始灭 如果led共阴 上电后全灭 从中心两个开始亮
/*
0000 0000        0x00
0001 1000        0x18
0010 0100        0x24
0100 0010        0x42
1000 0001        0x81
*/
void delay(uint i)        //延时函数
{
        while(i--);        
}

void main()        //主程序
{
        while(1)        //主循环
        {
                P2=a[i];                //led端口=数组值i 初始值0 即 P2=a[0];
                delay(50000);        //延时
                i++;                        //循环变量自加
                if(i==4)                //如果 循环变量=4 即 循环完一次 a[]用到a[4]
                {
                        i=0;                        //清零 循环变量
                }
        }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

沙发
ID:307591 发表于 2018-5-13 13:56 | 只看该作者
一个IO口只能定义一次,你在前面定义了两次没有用。
回复

使用道具 举报

板凳
ID:160834 发表于 2018-5-13 14:06 | 只看该作者
你上面这样的定义
#define led1 P2    
#define led2 P2
这不是等于重复定义了吗?
另外,一个变量就可以实现8位流水灯的移动,为什么要分成2个部分?
如果你真要分开,那就单独定义每个IO口,再写个子程序,但是这样不是把程序复杂化了吗?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:195836 发表于 2018-5-13 15:29 | 只看该作者
我认为是你没有搞清楚最基本的8个灯一起闪烁,还有八个灯流水(就最原始的从左往右,一次亮一个的那种)
把这两个真正搞清楚了,也就会了吧
回复

使用道具 举报

6#
ID:328907 发表于 2018-5-13 15:35 | 只看该作者
for 循环就行
回复

使用道具 举报

7#
ID:321920 发表于 2018-5-13 20:10 | 只看该作者
dzbj 发表于 2018-5-13 15:23
没编译 用记事本随便写的 不保证全对 你试试看吧 如果问题 自己想想怎么改 能改好也是进步啊 如果没问题 最 ...

感谢,学习了
回复

使用道具 举报

8#
ID:321920 发表于 2018-5-13 20:15 | 只看该作者
奎尔塞拉 发表于 2018-5-13 15:29
我认为是你没有搞清楚最基本的8个灯一起闪烁,还有八个灯流水(就最原始的从左往右,一次亮一个的那种)
...

8个灯的流水我搞清楚了 ,我想设计一个从中间向两边流水,如果8个灯分别是1,2,3,4,5,6,7,8,  我的意思是  左边的4个按 4 3 2 1 同时右边的4个是 5678的顺序,也就是说,同时亮两个的流水效果
回复

使用道具 举报

9#
ID:321920 发表于 2018-5-13 20:15 | 只看该作者
8个灯的流水我搞清楚了 ,我想设计一个从中间向两边流水,如果8个灯分别是1,2,3,4,5,6,7,8,  我的意思是  左边的4个按 4 3 2 1 同时右边的4个是 5678的顺序,也就是说,同时亮两个的流水效果 ,
回复

使用道具 举报

10#
ID:321920 发表于 2018-5-13 20:59 | 只看该作者
dzbj 发表于 2018-5-13 15:23
没编译 用记事本随便写的 不保证全对 你试试看吧 如果问题 自己想想怎么改 能改好也是进步啊 如果没问题 最 ...

感谢调试成功,学习了这个思路
  1. #include "reg52.h"        
  2. typedef unsigned char uchar;

  3. typedef unsigned int uint;
  4. typedef unsigned int u16;         
  5. typedef unsigned char u8;

  6. void delay(u16 i)
  7. {
  8.         while(i--);        
  9. }


  10. uchar i=0;     

  11. uchar code a[]={0x18,0x24,0x42,0x81};      
  12. /*
  13. 0000 0000        0x00
  14. 0001 1000        0x18
  15. 0010 0100        0x24
  16. 0100 0010        0x42
  17. 1000 0001        0x81
  18. */


  19. void main()      
  20. {
  21.         while(1)   
  22.         {
  23.                 P2=a[i];              
  24.                 delay(50000);      
  25.                 i++;                 
  26.                 if(i==4)              
  27.                 {
  28.                   i=0;            
  29.                 }
  30.         }
  31. }
复制代码
[/code]
回复

使用道具 举报

11#
ID:47286 发表于 2018-5-14 00:08 | 只看该作者
epaysh 发表于 2018-5-13 20:15
8个灯的流水我搞清楚了 ,我想设计一个从中间向两边流水,如果8个灯分别是1,2,3,4,5,6,7 ...

用我写的那种数组的方式 你想怎么亮都可以 数组的内容实际上就是P2端口的状态 你只要根据你需要的逻辑定义数组每位的值就可以显示不同效果 也可以增加数组内容和改变i值花插着来 做其它效果 反正核心就是控制端口状态 这个思路的核心是把要改变的部分写在一个地方 不必为其它花样又单独写程序
回复

使用道具 举报

12#
ID:321920 发表于 2018-5-14 05:23 来自手机 | 只看该作者
dzbj 发表于 2018-5-14 00:08
用我写的那种数组的方式 你想怎么亮都可以 数组的内容实际上就是P2端口的状态 你只要根据你需要的逻辑定 ...

是的,这个思路很直观,通用性也强,感谢
回复

使用道具 举报

13#
ID:329253 发表于 2018-5-14 08:20 来自手机 | 只看该作者
我也学习到了
回复

使用道具 举报

14#
ID:321920 发表于 2018-5-18 09:12 | 只看该作者
#include "reg52.h"        
typedef unsigned char uchar;

typedef unsigned int uint;
typedef unsigned int u16;         
typedef unsigned char u8;

void delay(u16 i)
{
        while(i--);        
}


uchar i=0;     

uchar code a[]={0xe7,0xdb,0xbd,0x7e};      
/*
0000 0000        0x00
0001 1000        0x18
0010 0100        0x24
0100 0010        0x42
1000 0001        0x81
*/


void main()      
{
        while(1)   
        {
                P2=a[i];              
                delay(50000);      
                i++;                 
                if(i==4)              
                {
                  i=0;            
                }
        }
}
回复

使用道具 举报

15#
ID:328200 发表于 2018-5-18 10:02 | 只看该作者
用数组最简单,将0xe7,0xdb,0xbd,0x7f放进去,再用for循环就可以。
回复

使用道具 举报

16#
ID:328200 发表于 2018-5-21 08:32 | 只看该作者
hfj2011 发表于 2018-5-18 10:02
用数组最简单,将0xe7,0xdb,0xbd,0x7f放进去,再用for循环就可以。

最后一个写错了,应该是0x7e  ,粗心了哈。
回复

使用道具 举报

17#
ID:921275 发表于 2021-5-14 16:12 来自手机 | 只看该作者
hfj2011 发表于 2018-5-18 10:02
用数组最简单,将0xe7,0xdb,0xbd,0x7f放进去,再用for循环就可以。

怎么用呢,我已经用if语句去弄三个流水灯三个方向了,最后一个我想弄从中间向两边流动,弄不出来
回复

使用道具 举报

18#
ID:921288 发表于 2021-5-14 16:42 | 只看该作者
先输出为0,再定义一个数组{00011000,00100100,01000010,10000001},遍历相或
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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