找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机矩阵LED不能实现的效果

[复制链接]
跳转到指定楼层
楼主
ID:466499 发表于 2019-1-17 22:00 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
前几天在论坛得到许多大佬的指导成功驱动了36个LED灯。目前还是很懵逼,12列全部高电平也就是LED1-12为全为1,y=0xfff;  第一行L1置低,第二第三行L2-L3置高x=0x6;第一行的绿灯全亮。如何实现,第一行的绿灯从1号灯开始一个一个灭到12号灯,在1号绿灯灭的同时第三行的从25号灯一个一个亮到36号,1灭,25亮。2灭,26亮。3灭,27亮。4灭,28亮。5灭29亮…。貌似静态显示和动态显示都不能实现

IMG_20190111_112752.jpg (981.41 KB, 下载次数: 17)

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

使用道具 举报

沙发
ID:21069 发表于 2019-1-18 02:39 | 只看该作者
貌似?当时谁提出来点亮几十个LED时我说用点阵做,但是,你却没有按点阵的思路来操作!如果是按点阵方式来做应该是8个I/O取纵,其于取横!这样你要点一个灯时用取模软件直接取模就得到数组值就OK的,也不用复杂的计算。这就同点阵点一个灯是一样的。

评分

参与人数 1黑币 +15 收起 理由
#include51.h + 15 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:123289 发表于 2019-1-18 08:20 | 只看该作者
你的空间想力不够啊。
建议:
每6ms切换一行显示,一直永远循环。试试吧。
回复

使用道具 举报

地板
ID:213173 发表于 2019-1-18 11:28 | 只看该作者
给你写一个示例程序,因为用LED仿真视觉不好,用LED点阵屏代替演示。


#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit code0 =P2^0;//列
sbit code1 =P2^1;
sbit code2 =P2^2;
sbit code3 =P2^3;
sbit code4 =P2^4;
sbit code5 =P2^5;
sbit code6 =P2^6;
sbit code7 =P2^7;
sbit code8 =P0^0;
sbit code9 =P0^1;
sbit code10=P0^2;
sbit code11=P0^3;

sbit Column0=P1^0;//行
sbit Column1=P1^1;
sbit Column2=P1^2;       

uint  code table[]={0x001,0x002,0x004,0x008,0x010,0x020,0x040,0x080,0x100,0x200,0x400,0x800,0x0fff};
uint num=0x0000;
uchar i,j,k;
bit a;
void PX(uint i)                                        //写入12位数据
{   
    code0 =i&0x01;i>>=1;       
    code1 =i&0x01;i>>=1;
    code2 =i&0x01;i>>=1;
    code3 =i&0x01;i>>=1;
    code4 =i&0x01;i>>=1;
    code5 =i&0x01;i>>=1;
    code6 =i&0x01;i>>=1;
    code7 =i&0x01;i>>=1;       
    code8 =i&0x01;i>>=1;
    code9 =i&0x01;i>>=1;
    code10=i&0x01;i>>=1;
    code11=i&0x01;
}
void Timer0Init(void)                //1毫秒@12.000MHz
{
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA=1;                        //开总中断
        ET0=1;                        //开T0中断
}

void main()
{        
        Timer0Init();
        PX(0x0000);
        while(1)               
        {
                if(a==1)
                {
                        a=0;
                        switch(j)//动态逐行显示
                        {
                                case 0:
                                        P1&=0xf8;//P1低3位清0
                                        P1|=0x01;//P1低3位赋值
                                        num&=0xf000;//num低12位清0
                                        num|=table;//num低12位赋值
                                        PX(num);j++;//num值写入列端口
                                break;

                                case 1:
                                        P1&=0xf8;
                                        P1|=0x02;
                                        num&=0xf000;
                                        num|=table;
                                        PX(num);j++;
                                break;

                                case 2:
                                        P1&=0xf8;
                                        P1|=0x04;
                                        num&=0xf000;
                                        num|=table;
                                        PX(num);j=0;
                                break;
                        }
                        if(++k==3)//流水灯
                        {               
                                k=0;
                                i++;
                                if(i==12) i=0;
                        }
                }
        }                                                                               
}
void timer0() interrupt        1
{
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        a=1;
}

回复

使用道具 举报

5#
ID:466499 发表于 2019-1-18 12:41 来自手机 | 只看该作者
yzwzfyz 发表于 2019-1-18 08:20
你的空间想力不够啊。
建议:
每6ms切换一行显示,一直永远循环。试试吧。

动态显示确实让我很懵逼,6ms切换一行一直循环人眼看到的就是全亮了啊。1号灯灭的同时25号灯亮,逐个移位过去,静态和动态都不能实现
回复

使用道具 举报

6#
ID:466499 发表于 2019-1-18 12:43 来自手机 | 只看该作者
weidoit 发表于 2019-1-18 12:05

谢谢大神!我试试
回复

使用道具 举报

7#
ID:466499 发表于 2019-1-18 12:44 来自手机 | 只看该作者
真心感谢你们
回复

使用道具 举报

8#
ID:149389 发表于 2019-1-18 12:48 | 只看该作者

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit Green_En=P1^0;
  5. sbit Blue_En=P1^1;
  6. sbit Red_En=P1^2;
  7. uchar index;
  8. uchar num;

  9. //绿色逐个熄灭
  10. uint code Green[]=
  11. {
  12.   0x0fff,0x07ff,0x03ff,0x01ff,0x00ff,0x007f,0x003f,0x001f,0x000F,0x0007,0x0003,0x0001,0x0000,
  13. };
  14. //蓝色拉幕效果
  15. uint code Blue[]=
  16. {
  17.   0x0801,0x0402,0x0204,0x0108,0x0108,0x0090,0x0060,0x00f0,0x01F8,0x03FC,0x7FE,0x0FFF,0x0000,
  18. };
  19. //红色逐个点亮
  20. uint code Red[]=
  21. {
  22.   0x0000,0x0001,0x0003,0x0007, 0x000F,0x001f,0x003f,0x007f,0x00ff,0x01ff,0x03ff,0x07ff,0x0fff,
  23. };
  24. //延时
  25. void delay5ms(void)   //误差 0us
  26. {
  27.     unsigned char a,b;
  28.     for(b=185;b>0;b--)
  29.         for(a=12;a>0;a--);
  30. }
  31. //主程序
  32. void main()
  33. {
  34.   while(1)
  35.   { //从数组中读取数据送至 P3 和 P2 口显示
  36.     for (index=0;index<60;index++)                //累计xx次,换下一帧效果。
  37.     {
  38.       P3=Green[num]/256;
  39.       P2=Green[num]%256;
  40.       Green_En=0;
  41.       delay5ms();
  42.       Green_En=1;

  43.       P3=Blue[num]/256;
  44.       P2=Blue[num]%256;
  45.       Blue_En=0;
  46.       delay5ms();
  47.       Blue_En=1;

  48.       P3=Red[num]/256;
  49.       P2=Red[num]%256;
  50.       Red_En=0;
  51.       delay5ms();
  52.       Red_En=1;
  53.     }
  54.     num++;
  55.     num=num%13; //到达帧数,从新开始。
  56.   }
  57. }



复制代码
附上Proteus仿真结果。






回复

使用道具 举报

9#
ID:466499 发表于 2019-1-18 12:48 来自手机 | 只看该作者
wulin 发表于 2019-1-18 11:28
给你写一个示例程序,因为用LED仿真视觉不好,用LED点阵屏代替演示。



非常感谢!无以言表我试试,虽然现在还不是很理解
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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