LED 驱动控制专用电路 TM1628 AVR 测试程序源代码

发布者:HarmonySpirit最新更新时间:2019-12-04 来源: eefocus关键字:LED  驱动控制  TM1628  AVR 手机看文章 扫描二维码
随时随地手机看文章

#include

#include


#define TM1628_DIO_PORTNAME     B

#define TM1628_DIO_BIT          5

#define TM1628_CLK_PORTNAME     B

#define TM1628_CLK_BIT          7

#define TM1628_STB_PORTNAME     B

#define TM1628_STB_BIT          4


#ifndef _CONCAT_

#define _CONCAT_

#define CONCAT(a, b)            a ## b

#define CONCAT_DDR(portname)    CONCAT(DDR, portname)

#define CONCAT_PORT(portname)   CONCAT(PORT, portname)

#define CONCAT_PIN(portname)    CONCAT(PIN, portname)

#endif /* CONCAT */


#define TM1628_DIO_DDR          CONCAT_DDR(TM1628_DIO_PORTNAME)

#define TM1628_DIO_PORT         CONCAT_PORT(TM1628_DIO_PORTNAME)

#define TM1628_DIO_PIN          CONCAT_PIN(TM1628_DIO_PORTNAME)

#define TM1628_DIO_0            TM1628_DIO_PORT &= ~(1 << TM1628_DIO_BIT)

#define TM1628_DIO_1            TM1628_DIO_PORT |= (1 << TM1628_DIO_BIT)

#define TM1628_DIO_VALUE        (TM1628_DIO_PIN & (1 << TM1628_DIO_BIT))


#define TM1628_CLK_DDR          CONCAT_DDR(TM1628_CLK_PORTNAME)

#define TM1628_CLK_PORT         CONCAT_PORT(TM1628_CLK_PORTNAME)

#define TM1628_CLK_PIN          CONCAT_PIN(TM1628_CLK_PORTNAME)

#define TM1628_CLK_0            TM1628_CLK_PORT &= ~(1 << TM1628_CLK_BIT)

#define TM1628_CLK_1            TM1628_CLK_PORT |= (1 << TM1628_CLK_BIT)


#define TM1628_STB_DDR          CONCAT_DDR(TM1628_STB_PORTNAME)

#define TM1628_STB_PORT         CONCAT_PORT(TM1628_STB_PORTNAME)

#define TM1628_STB_PIN          CONCAT_PIN(TM1628_STB_PORTNAME)

#define TM1628_STB_0            TM1628_STB_PORT &= ~(1 << TM1628_STB_BIT)

#define TM1628_STB_1            TM1628_STB_PORT |= (1 << TM1628_STB_BIT)


#define SEG_NULL      0x00

#define SEG_P         0x73

#define SEG_N         0x37

#define SEG_U         0x3e

#define SEG_L         0x38

#define SEG_H         0x76

#define SEG_NEG       0x40


#define LEFT          0

#define RIGHT         1


unsigned char _data[10], brightness = 0;

long n = 0;


unsigned char number[] =

{

    0x3f,0x06,0x5b,0x4f,

    0x66,0x6d,0x7d,0x07,

    0x7f,0x6f,0x77,0x7c,

    0x39,0x5e,0x79,0x71

};


void TM1628_TxByte(unsigned char _data)

{

    unsigned char i = 0;


    TM1628_CLK_1;

    TM1628_DIO_DDR |= (1 << TM1628_DIO_BIT);

    for (i = 0; i < 8; i++)

    {        

        TM1628_CLK_0;

        if (_data & 0x01)

        {

            TM1628_DIO_1;

        }

        else

        {

            TM1628_DIO_0;

        }

        TM1628_CLK_1;

        _data >>= 1;

    }

    _delay_us(2);

}


unsigned char TM1628_RxByte(void)

{

    unsigned char _data = 0, i = 0;


    TM1628_CLK_1;

    TM1628_DIO_DDR &= ~(1 << TM1628_DIO_BIT);

    TM1628_DIO_1;

    for (i = 0; i < 8; i++)

    {

        TM1628_CLK_0;

        _data >>= 1;

        TM1628_CLK_1;

        _delay_us(1);

        if (TM1628_DIO_VALUE)

        {

            _data |= 0x80;

        }

    }


    return _data;

}


void TM1628_WriteCommand(unsigned char command)

{

    TM1628_STB_0;

    TM1628_TxByte(command);

    TM1628_STB_1;

}


void TM1628_Display(unsigned char *p_data, unsigned char brightness)

{

    unsigned char i = 0, j = 0, temp = 0;

    unsigned char dis_arr[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    for (i = 0; i < 7; i++)

    {

        temp = 0;

        for (j = 0; j < 8; j++)

        {

            if(p_data[j] & (1 << i))

            {

                temp |= (1 << j);

            }

        }

        dis_arr[i << 1] = temp;

    }

    for (i = 0; i < 7; i++)

    {

        temp = 0;

        for (j = 0; j < 2; j++)

        {

            if(p_data[j + 8] & (1 << i))

            {

                temp |= (1 << j);

            }

        }

        dis_arr[(i << 1) + 1] = temp;

    }

    TM1628_WriteCommand(0x03);

    TM1628_WriteCommand(0x40);

    TM1628_STB_0;

    TM1628_TxByte(0xc0);

    _delay_us(1);

    for (i = 0; i < 14; i++)

    {

        TM1628_TxByte(dis_arr[i]);

    }

    TM1628_STB_1;

    if (brightness > 7)

    {

        brightness = 7;

    }

    TM1628_WriteCommand(0x88 + brightness);

}

//数据,进制,起始位置,占用位数,对齐方式,亮度

void TM1628_DisplayNumber(long n, unsigned char ary, unsigned char start, unsigned char size, unsigned char left_right, unsigned char brightness)

{

    unsigned char i = 0, temp[size], neg_flag = 0, length = 0;

    if (-n > 0)

    {

        n = -n;

        neg_flag = 1;

    }

    for (i = 0; ((i < size) && (n > 0)); i++)

    {

        temp[i] = number[n % ary];

        n /= ary;

    }

    if (i == 0)

    {

        temp[i] = number[0];

        i = 1;

    }

    if (neg_flag && (i < size))

    {

        temp[i] = SEG_NEG;

        i++;

    }

    length = i;

    if (left_right == LEFT)

    {

        for (i = 0; i < length; i++)

        {

            _data[start + i] = temp[length - i - 1];

        }

        for (i = length; i < size; i++)

        {

            _data[start + i] = SEG_NULL;

        }

    }

    else if (left_right == RIGHT)

    {

        for (i = 0; i < size - length; i++)

        {

            _data[start + i] = SEG_NULL;

        }

        for (i = size - length; i < size; i++)

        {

            _data[start + i] = temp[size - i - 1];

        }

    }

    TM1628_Display(_data, brightness);

}


unsigned char TM1628_ReadKey(void)

{

    unsigned char i = 0, temp = 0;

    

    TM1628_STB_0;

    TM1628_TxByte(0x42);

    _delay_us(100);

    for (i = 0; i < 5; i++)

    {

        _delay_us(2);

        temp = TM1628_RxByte();

        if (temp)

        {

            break;

        }

    }

    TM1628_STB_1;

    if (temp & 0x03)

    {

        temp = (2 * i + 1) + ((temp & 0x03) - 1) * 10;

    }

    else if (temp & 0x18)

    {

        temp = (2 * (i + 1)) + (((temp & 0x18) >> 3) - 1) * 10;

    }

    return temp;

}


void key_process(unsigned char key)

{

    if (key != 0)

    {

        TM1628_DisplayNumber(key, 10, 2, 2, LEFT, brightness);

    }

    if (key == 1 && brightness < 7)

    {

        brightness++;

        TM1628_DisplayNumber(brightness, 10, 0, 1, LEFT, brightness);

    }

    else if (key == 11 && brightness > 0)

    {

        brightness--;

        TM1628_DisplayNumber(brightness, 10, 0, 1, LEFT, brightness);

    }

    else if (key == 10)

    {

        n++;

        TM1628_DisplayNumber(n, 10, 5, 5, RIGHT, brightness);

    }

    else if (key ==20)

    {

        n--;

        TM1628_DisplayNumber(n, 10, 5, 5, RIGHT, brightness);

    }

}


int main(void)

{

    unsigned char i = 0, key = 0, now = 0, repeat_flag = 0;

    unsigned int repeat_count = 0;


    _delay_ms(100);

    TM1628_STB_1;

    TM1628_STB_DDR |= (1 << TM1628_STB_BIT);

    TM1628_CLK_1;

    TM1628_CLK_DDR |= (1 << TM1628_CLK_BIT);

[1] [2]
关键字:LED  驱动控制  TM1628  AVR 引用地址:LED 驱动控制专用电路 TM1628 AVR 测试程序源代码

上一篇:AVR/Arduino定时/计数器、中断入门
下一篇:Arduino+Avr libc制作Badusb原理及示例讲解

推荐阅读最新更新时间:2024-11-06 16:28

LED照明驱动芯片技术的创新设计
       随着白炽灯、荧光灯、节能灯陆续退出照明市场,LED照明光源和LED照明灯具迅速发展,以迅雷不及掩耳之势席 卷世界照明市场,LED产业链因此蓬勃发展。LED灯珠的亮 度不断提高,价格逐步下降;HVLEDs和倒装LED开拓LED 照明新的应用技术;LED驱动电源芯片不断推陈出新,集成 功能更多,性价比更好,应用更方便;塑包铝和高导热塑料 散热器为新一代LED光源和灯具提供了创新设计新空间。   室内LED光源和灯具必然是量大面广的消费电子产品,一定会海量生产,拥有蓝海市场。由于传统照明光源和灯具 预留给LED驱动电源的空间十分狭小,因此LED照明光源和 灯具的驱动电源必须做得十分小巧,驱动电源芯片要求性能 高度集成,以单
[电源管理]
基于AVR的4*4矩阵键盘扫描与LED显示程序
/************** 此程序在别人的基础上进行了一些修改,能应用到我的开发板中, 并与我自制的外接按键和LED灯配合使用,在此感谢原创者!!! 硬件:M16 作用:当按下按键时显示相对应的按键控制的LED灯 频率:8.000000MHZ 开发板:EasyAVR M16 v12 编译软件:ICCAVR6.31A 下载软件:AVRstudio4.14 编写人:伍建忠 编写日期:2011.10.14 修改日期: ************/ #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int uint
[单片机]
比传统高5~10倍输出亮度的LED照明产品
威宝公司在照明市场上所推出的高性能LED灯产品组合不断增加。为了满足LED灯的市场需求,从而更接近卤素照明的特点,威宝公司将基于首尔半导体(SSC)的“nPola”技术推出一系列新的LED产品。 “nPola”使用来自威宝母公司三菱化学株式会社的专用氮化镓(GaN)衬底用于氮化镓的外延生长,从而取代蓝宝石或碳化硅衬底。首尔半导体的专利“nPola”结构最大限度地减少活跃层中的缺陷,使得LED芯片的电流密度比传统芯片高5到10倍。因此,以相同的芯片尺寸可以实现多于5到10倍的亮度输出。 威宝公司(Verbatim)最先推出的nPola LED灯将侧重MR16设计,主要目标是替换50W的MR16卤素灯。凭借高亮度输出和极似卤素灯
[电源管理]
比传统高5~10倍输出亮度的<font color='red'>LED</font>照明产品
“网购”将成为新生代LED灯具消费的主要市场
随着80后、90后因特网一代逐渐成为消费主体,网络媒体的迅速发展。52%的消费者表示通过网络获得灯具品牌资讯,足够说明问题。网络购物的快速增长同样也为整个行业的销售管道提供一种新的可能。 据同方股份照明事业部副总经理刘彤介绍,2011年,他们网上销售的led灯月销售业绩可以达到1万只以上,占其总销售量的15%左右。 纵观其他传统家居类消费品网购市场,有调查资料显示,大陆在家居建材、家俱等领域的网购销量占企业总销量比重不超过5%。 目前大多数家庭的灯饰消费约占装修费用的10%,且比例还在不断上升。网购市场也正在快速成为全新的led照明产品零售销售模式之一。 传统零售管道受限 对于现阶段的LED照明企业来说,让le
[电源管理]
利用温度调节实现热管理的LED驱动
不可否认,如果将 led 技术与节能灯或荧光灯相比的话,节省的能量成本并不显著。但换个角度看,如果考虑到维护成本,例如更换仓库高高的天花板、繁忙的工厂大厅、购物中心或者难以接近的信号系统等所使用的照明灯所产生的人工成本,很明显要大大高于能量成本。如果确保正常冷却或者结温的温度控制在80°C以下, LED灯 的寿命可以轻松达到100,000小时。这相当于连续工作12年以上,即使是在容易接近的地方进行更换,节省下来的维护成本也是一个占优势的因素。   AC/DC LED驱动 器的寿命主要取决于所用的元器件数。采用较少的电容很快会导致 驱动 器出现薄弱环节,从而使得实现LED长寿命的目标落空。作为一家采用ATE和HALT(高加速寿
[电源管理]
利用温度调节实现热管理的<font color='red'>LED</font><font color='red'>驱动</font>器
凌力尔特推出8 开关 LED 矩阵调光器简化了复杂的LED矩阵设计
加利福尼亚州米尔皮塔斯 (MILPITAS, CA) 2015 年 12 月 9 日 凌力尔特公司 (Linear Technology Corporation) 推出 LED 旁路开关器件 LT3965,该器件允许对 8 个单独 LED 或 LED 段进行独立调光和诊断。LT3965 与一个配置为电流源的 LED 驱动器电路一起运行。LT3965 有 8 个单独控制的浮置 17V/330mΩ NMOS 开关。采用这些内部功率开关和一个集成的 I2C 串行接口,LED 串中每个 LED 都可以单独接通或断开,或者可以对它们进行 PWM 调光以使 LED 矩阵提供独特的照明图案。 典型应用包括汽车矩阵式 LED 前灯、
[电源管理]
工程师分享:数字LED驱动的街道照明系统
LED厂商建议通过控制正向电流使发光二极管保持额定的光通量和特定的色温。鉴于LED的亮度与正向电流值成正比,这个控制方法是最佳的LED电源解决方案。此外,LED的正向电压与输出功率受到结温的严格限制,特别是大功率LED更是如此;结温是众所周知的影响质量和使用寿命的关键参数。准确地说,随着结温升高,正向电压与输出功率会逐渐降低,热漂移会导致临界电流升高。   为了通过降低正向电压解决热漂移问题,提高系统总体能效,通过PWM和/或模拟调光技术控制亮度,获得防失效管理和过热控制功能,照明系统对具有特定控制功能的LED驱动器的需求不断提高。如果给建筑照明和街道照明等应用增加价值,还需要在LED驱动器内增加遥控功能。   因为大功率因
[电源管理]
工程师分享:数字<font color='red'>LED</font><font color='red'>驱动</font>的街道照明系统
工程师推荐PWM调光之如何优化LED色彩稳定度
本文探讨提供发光二极体( LED )调光的方法,分析 LED调光 对其长期性能及所发射出光的色彩稳定性之影响,并特别探讨如何结合使用线性恒流稳流器(CCR)及数位电晶体来提供脉冲宽度调变( PWM )调光。 PWM为改变LED光输出首要方法 光要多少才足够?要求的发光量通常由所处环境与用途决定。就会议室而言,一般圆桌会议时的照明可能非常亮;但若使用投影系统来观看会议材料,会议室的光就可能会调暗很多;起居室的照明通常会被调节从而营造恰当的氛围;而汽车仪表板的背光则通常根据日间或夜间驾驶来自动调节。 光源已从非常易于调节的白炽灯转向要求以特殊电路提供不同光等级的萤光灯。LED是业界出现的最新一代光源,要求采用新的电子电路来改变光等
[电源管理]
工程师推荐PWM调光之如何优化<font color='red'>LED</font>色彩稳定度
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved