打印

LED全彩驱动芯片TM1804 事例程序

[复制链接]
8377|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
528618581|  楼主 | 2017-5-5 17:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       TM1804是三通道LED(发光二极管)驱动控制专用电路,内部集成有MCU数字接口、数据锁存器、 LED
高压驱动等电路, VDD内带5V稳压管。通过外围MCU控制实现该芯片的单独辉度、级联控制实现户外大屏
的彩色点阵发光控制。本产品性能优良, 质量可靠 。程序:
/******************************************************************************
//*版权信息:深圳市天微电子有限公司
//*文 件 名:TM1804-V1.0
//*当前版本:V1.0
//*MCU 型号:STC15W104
//*开发环境:Keil uVision4
//*晶震频率:33MHZ(内部时钟)      
//*完成日期:2015-07-10
//*程序功能:1.该程序可实现5片TM1804幻彩变化。
//                   2.修改变量IC可修改TM1804数量。
//*免责声明:1.此程序为TM1804驱动LED点亮演示程序,仅作参考之用。
//           2.如有直接使用本例程程序造成经济损失的,本公司不承担任何责任。            
/*******************************************************************************/
#include <reg52.h>                            //MCU头文件
#include "intrins.h"                            //包含nop指令头文件

#define nop  _nop_();   
                   //宏定义
/********************************定义控制端口***********************************/
sbit DO=P3^3;                                    //定义信号输出DO
/**********************************定义变量*************************************/
unsigned int IC=5;                          //控制TM1804个数
unsigned int LED_PX;                        //像素点数
unsigned char PWM=255;                      //TM1804灰度数据
unsigned char Rda,Gda,Bda;                  //R、G、B灰度数据
unsigned char bdata LED_data;               //可位操作的数据发送暂存变量声明
sbit bit0=LED_data^0;                            //被发送的数据各位定义
sbit bit1=LED_data^1;
sbit bit2=LED_data^2;
sbit bit3=LED_data^3;
sbit bit4=LED_data^4;
sbit bit5=LED_data^5;
sbit bit6=LED_data^6;
sbit bit7=LED_data^7;
bit flag=0;                                 //定义一个标志位

/**********************************延时函数*************************************/
void delay(unsigned int n)                  //n=1,延时500us
{
  unsigned int i;
  while(n--)
    for(i=0;i<860;i++);
}

/********************发送0码函数,高电平400ns,周期1.25us************************/
void send_data_0()   
{
         DO=1;
         nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;          
         DO=0;
         nop;nop;nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;nop;nop;
}

/*******************发送1码函数,高电平800ns,周期1.25us*************************/
void send_data_1()   
{
         DO=1;
         nop;nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;
         DO=0;   
}

/***********************发送1个字节数据,高位先发*******************************/
void send_data(unsigned char DATA)               
{
        LED_data=DATA;                          
        if(bit7)        send_data_1();        else send_data_0();
        if(bit6)        send_data_1();        else send_data_0();
        if(bit5)        send_data_1();        else send_data_0();
        if(bit4)        send_data_1();        else send_data_0();
        if(bit3)        send_data_1();  else send_data_0();
        if(bit2)        send_data_1();  else send_data_0();
        if(bit1)        send_data_1();  else send_data_0();
        if(bit0)        send_data_1();        else send_data_0();
}
/******************************发送1帧数据*************************************/
void send_px()
{
        unsigned int i;
        for(i=0;i<LED_PX;i++)
        {
                send_data(Rda);             //发送R灰度数据
                send_data(Gda);             //发送G灰度数据
                send_data(Bda);             //发送B灰度数据
        }
}
/*===============================主函数=======================================*/
void main()
{
        unsigned char i;
        LED_PX=IC;                          //像素点数等于TM1804个数
        Rda=Gda=Bda=0;                      //R、G、B灰度数据复位清零
        while(1)
        {
                for(i=0;i<PWM;i++)          //红色渐亮  
                {
                        Rda=i;              //灰度计算
                        send_px();          //发送灰度数据
                        delay(50);          //复位延时
                }
                flag=1;                     //标志位置位
                while(flag)                 //标志位置位后循环函数
                {
                        for(i=0;i<PWM;i++)  //红色渐灭,绿色渐亮
                        {
                                Gda=i;
                                Rda=PWM-i;  //灰度计算
                                send_px();  //发送灰度数据
                                delay(50);  //复位延时
                        }
                        for(i=0;i<PWM;i++)  //绿色渐灭,蓝色渐亮
                        {
                                Bda=i;           
                                Gda=PWM-i;  //灰度计算
                                send_px();  //发送灰度数据
                                delay(50);  //复位延时
                        }
                        for(i=0;i<PWM;i++)  //蓝色渐灭,红色渐亮
                        {
                                Rda=i;
                                Bda=PWM-i;  //灰度计算
                                send_px();  //发送灰度数据
                                delay(50);  //复位延时
                        }
                }
        }
}
/*================================结束==========================================*/

相关帖子

沙发
xzb16432| | 2017-11-15 10:06 | 只看该作者
/********************发送0码函数,高电平400ns,周期1.25us************************/
void send_data_0()   
{
         DO=1;
         nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;           
         DO=0;
         nop;nop;nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;nop;nop;
}

/*******************发送1码函数,高电平800ns,周期1.25us*************************/
void send_data_1()   
{
         DO=1;
         nop;nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;nop;
         nop;nop;nop;nop;nop;
         DO=0;   
}

请问这个程序里的一个nop多长时间如何计算的,我在网上查的是12M1us那33M不就是33/12us吗?那么多个不就超过了1.25us?还有为什么下面那个发送1码时不写低电平时间?

使用特权

评论回复
板凳
528618581|  楼主 | 2017-11-15 12:05 | 只看该作者
xzb16432 发表于 2017-11-15 10:06
/********************发送0码函数,高电平400ns,周期1.25us************************/
void send_data_0()  ...

那个nop;是单片机的空指令,就是一条指令的时间,最好测一下。

使用特权

评论回复
地板
xzb16432| | 2017-11-19 17:48 | 只看该作者
528618581 发表于 2017-11-15 12:05
那个nop;是单片机的空指令,就是一条指令的时间,最好测一下。

你的程序是几T的为啥我算不出,还有就是你的输入0码和1码的高电平是一倍的关系但用的nop函数不是成倍关系这是为什么?能给讲解下吗

使用特权

评论回复
5
528618581|  楼主 | 2017-11-21 10:51 | 只看该作者
xzb16432 发表于 2017-11-19 17:48
你的程序是几T的为啥我算不出,还有就是你的输入0码和1码的高电平是一倍的关系但用的nop函数不是成倍关系 ...

算的和实际上是有差别的,因为nop完后是去调用其它函数取了,那个都是要时间的。所以后面没有加nop

使用特权

评论回复
6
haibao1213| | 2017-11-21 15:21 | 只看该作者
你这个芯片多少钱可以出,市场上好像很便宜啊,5050尺寸的才0.23左右,正好我们有用GA8P206,23-6的芯片推动这个灯,如果你们的有优势,也可以试下你们的。欢迎联系沟通手机微信13632818095 Q67229740

使用特权

评论回复
7
deddesee| | 2020-5-26 07:59 | 只看该作者
xzb16432 发表于 2017-11-19 17:48
你的程序是几T的为啥我算不出,还有就是你的输入0码和1码的高电平是一倍的关系但用的nop函数不是成倍关系 ...

这个单片机是1T的,所及经过计算发送0码NOP的时间大概300ns,没有问题的。最好用示波器或者逻辑分析仪测试一下。我测试过来,时间和频率较为接近规格书上说的。

使用特权

评论回复
8
deddesee| | 2020-5-26 08:01 | 只看该作者
楼主,如果按照这个程序要做成跑马灯,流水灯,改哪里呀?

使用特权

评论回复
9
528618581|  楼主 | 2020-10-24 11:33 | 只看该作者
deddesee 发表于 2020-5-26 08:01
楼主,如果按照这个程序要做成跑马灯,流水灯,改哪里呀?

改while里面的

使用特权

评论回复
10
528618581|  楼主 | 2020-10-24 11:37 | 只看该作者
haibao1213 发表于 2017-11-21 15:21
你这个芯片多少钱可以出,市场上好像很便宜啊,5050尺寸的才0.23左右,正好我们有用GA8P206,23-6的芯片推 ...

你的那个是灯芯一体的,这个还是有区别的

使用特权

评论回复
11
ahui1105| | 2020-10-30 17:01 | 只看该作者
我们有灯带的控制MCU,可以控制驱动IC

使用特权

评论回复
12
CIDK| | 2022-10-22 11:20 | 只看该作者
楼主,我用示波器测发送的数据是对的,然后再测第二个芯片的数据脚也能读到正常的数据,但就是没有PWM输出,是复位信号的问题吗?复位信号保持低电平时间都有500MS了,还是没PWM输出

使用特权

评论回复
13
zero115| | 2024-3-21 17:30 | 只看该作者
CIDK 发表于 2022-10-22 11:20
楼主,我用示波器测发送的数据是对的,然后再测第二个芯片的数据脚也能读到正常的数据,但就是没有PWM输出 ...

你好,请问你这个解决了吗

使用特权

评论回复
14
阔砸| | 2024-7-24 14:34 | 只看该作者
楼主我用的单片机16mhz是不是不好实现

使用特权

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

本版积分规则

10

主题

376

帖子

5

粉丝