打印

LED驱动IC时序问题

[复制链接]
1576|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 followme001 于 2014-9-14 20:28 编辑

不知道大家有没有用过LED方面的驱动IC,我在写一款LED驱动IC(HD5056)的程序时遇到一个问题,发现时序比较难做到准确,不知道有什么好的办法,特来论坛求教,谢谢指点。以下是我的程序(这个程序是为了练习版主的数据驱动程序思想搞的,还没做到分离那一步:P)

#include "STC12C5608AD.h"
#include <intrins.h>

sbit DAT = P1^3;

typedef unsigned char uint8;
typedef unsigned int  uint16;

void reset(void)
{
        uint8 i;
        DAT = 0;

        for (i = 0; i < 255; i++)  //76us
        {
                ;
        }
}

void send_data(uint8 r, uint8 g, uint8 b)
{
        uint8 i;

        for (i = 8; i > 0; i--)
        {
                if ((r & 0x80) != 0)      //"1"
                {
                        DAT = 1;           
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();  //860ns
                        DAT = 0;  //890ns
                }
                else                                          //"0"
                {
                        DAT = 1;
                        _nop_();
                        _nop_();  //270ns
                        DAT = 0;
                        _nop_();
                        _nop_();  //850ns
                }

                r <<= 1;
        }

        for (i = 8; i > 0; i--)
        {
                if ((g & 0x80) != 0)
                {
                        DAT = 1;
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        DAT = 0;
                }
                else
                {
                        DAT = 1;
                        _nop_();
                        _nop_();
                        DAT = 0;
                        _nop_();
                        _nop_();
                }

                g <<= 1;
        }

        for (i = 8; i > 0; i--)
        {
                if ((b & 0x80) != 0)
                {
                        DAT = 1;
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        DAT = 0;
                }
                else
                {
                        DAT = 1;
                        _nop_();
                        _nop_();
                        DAT = 0;
                        _nop_();
                        _nop_();
                }

                one.dat <<= 1;
        }
}

void delay(void)
{
        uint16 i,j;
        for (i = 0; i < 255; i++)
        {
                for (j = 0; j < 255; j++)
                {
                        ;
                }
        }
}

void main(void)
{
        while (1)
        {                 
                reset();
                send_data(1,0,0);        
                send_data(0,3,0);        
                send_data(0,0,255);               
        }
}



















相关帖子

沙发
followme001|  楼主 | 2014-9-14 11:10 | 只看该作者
按照时序,"0"码是先一个0.3us的高电平然后一个0.9us的低电平,这个可以做到。"1"码是一个0.9us的高电平和一个0.3us的低电平,在DAT置"0"后,可能是for循环和判断为"1"或者为"0"的语句 if ((r & 0x80) != 0)   把低电平拉长了,做不了时序上典型的0.3us吧,有什么写法可以改进这个问题?

使用特权

评论回复
板凳
followme001|  楼主 | 2014-9-14 19:46 | 只看该作者
那现在它aColor.b[i]就是三合一的数据了。

使用特权

评论回复
地板
followme001|  楼主 | 2014-9-14 19:49 | 只看该作者
热烈欢迎大家改写以上的烂程序,哈哈。

使用特权

评论回复
5
followme001|  楼主 | 2014-9-14 20:25 | 只看该作者
本帖最后由 followme001 于 2014-9-14 20:26 编辑
yyy71cj 发表于 2014-9-14 19:51
如果要实现数码分离,一定要制作出与数据类型无关的播放器,所以对于发码的播放器来说,它只认数据,不论 ...


还是不太能理解,我试着改了一下,是这样的意思么?

#include "STC12C5608AD.h"
#include <intrins.h>

sbit DAT = P1^3;

typedef unsigned char uint8;
typedef unsigned int  uint16;

typedef union _color
{
        uint8 dat[3];

        struct
        {
                uint8 r;
                uint8 g;
                uint8 b;
        }rgb;
         
}color;

color one;

void reset(void)
{
        uint8 i;
        DAT = 0;

        for (i = 0; i < 255; i++)  //76us
        {
                ;
        }
}

void send_data()
{
        uint8 i,j;

        for (i = 0; i < 3; i++)
        {
                for (j = 0; j < 8; j++)
                {
                        if ((one.dat & 0x80) != 0)
                        {
                                DAT = 1;
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();
                                _nop_();  //860ns
                                DAT = 0;  //890ns                               
                        }
                        else
                        {
                                DAT = 1;
                                _nop_();
                                _nop_();  //270ns
                                DAT = 0;
                                _nop_();
                                _nop_();  //850ns
                        }

                        one.dat <<= 1;
                }

        }
}

//void delay(void)
//{
//        uint16 i,j;
//        for (i = 0; i < 255; i++)
//        {
//                for (j = 0; j < 255; j++)
//                {
//                        ;
//                }
//        }
//}

void main(void)
{
        one.rgb.r = 255;
        one.rgb.g = 0;
        one.rgb.b = 0;       

        while (1)
        {                
                reset();
                send_data();                                                       
        }
}

使用特权

评论回复
6
followme001|  楼主 | 2014-9-14 20:29 | 只看该作者
one.dat[i] <<= 1这个回贴没显示出来。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

154

帖子

1

粉丝