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

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 <<

[1] [2]
关键字:LED  驱动控制  TM1628  AVR 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481956.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

【AT91SAM3S】建立基于SAM3S库的工程并点亮LED
:at91sam3s4cchip(5)MDK中,在E:at91sam3s4c新建工程at91sam3s4c_LED,选择MCU AT91SAM3S4C(6)电机确定后会弹出对话框,询问是否要拷贝启动文件,选择是。当然我们不是要使用这个启动文件,之后我们将会改写这个文件。7、电机设置工程组织结构如下:(8)向工程添加文件将E:at91sam3s4cat91libsource中的board_cstartup_keil.c和board_lowlevel.c文件添加到工程的at91lib目录下,将E:at91sam3s4cchipsource中的exceptions.c、wdt.c、pmc.c、pio.c文件添加到工程的chip目录。将E
发表于 2019-12-05
【AT91SAM3S】建立基于SAM3S库的工程并点亮LED
Melexis最新LIN RGB LED 控制器可简化使用方式
全球微电子工程公司 Melexis宣布引入新一代LIN RGB (W) LED 控制器IC产品。作为车内氛围灯解决方案的全球领导者,全新的MLX81113 将支持基于 LIN 的 RGB LED 车内氛围灯应用(也称为 LIN RGB)进一步发展,LIN RGB 几乎已经获得全球所有OEM 的认可。与广受欢迎的 MLX81108 相比,MLX81113 具有更大的片上内存、更高的恒流源输出和更强的 EMC 稳定性。此外,MLX81113 符合 ISO 26262 功能安全要求,满足 ASIL-A 等级。 MLX81113 提高了片上系统功能,配备有 MLX16 FX 16 位 RISC 微控制器、2 KB RAM
发表于 2019-12-04
Melexis最新LIN RGB LED 控制器可简化使用方式
家用新光源投影,专业传统品牌也不甘落后
提起家用投影机,多年前一直是传统汞灯光源占据大部分市场。而近年来,除了原本传统汞灯光源外,许多产品在开发上也都往新光源的应用上来开发,如 LED、激光等固态光源。其中 LED 光源由于售价相对低廉,且产品体积普遍较小,逐渐成为了目前家用投影市场的主流。根据 IDC 2019 1H 的投影市场报告,LED 投影占据家用投影超过 8 成的市场份额,传统汞灯仅占 7%,激光也以 5%紧追在后。    新光源投影机在市场上的成功,主要原因为新光源相比传统汞灯投影机有着以下几点优势: 无需更换灯泡、使用寿命长、防尘、减少维护成本、低耗能、全天候运作、开机即用、色域覆盖广等天生光源优势,符合消费者使用
发表于 2019-12-04
家用新光源投影,专业传统品牌也不甘落后
AVR单片机教程——点亮第一个LED
中的函数就可以了。用单片机来控制,最简单的就是点亮LED了。这个程序没有输入,有一个输出,就是让LED亮起。但即使简单,它也需要库,请在这里下载。库下载完以后是不能直接用的,我们要把它放进编译器的包含目录下。在EElib1.0.7z文件中有两个目录,分别是include和lib。打开Atmel Studio 7.0的安装目录,一路找toolchain→avr8→avr8-gnu-toolchain→avr,我是默认位置安装的,找到的目录就是C:Program Files (x86)AtmelStudio7.0toolchainavr8avr8-gnu-toolchainavr,这个目录下也有include和lib两个文件夹。把压缩包
发表于 2019-12-03
AVR单片机教程——点亮第一个LED
AVR单片机教程——闪烁LED
上次我们把LED点亮了。你可能已经试过把 LED_RED 换成其他灯,也可能已经用 led_on() 把所有LED一起点亮了。但是LED点亮以后,程序就退出了,之后LED一直没有暗,直到没有供电。这一次,我们用程序来控制LED的亮和暗。新建一个C executable项目,选择ATmega324PA单片机,在项目属性中添加库libee1,将配置改为Release。这是本教程现阶段中每一次新建项目都要做的。我刚才尝试用project template简化,然而设置无法导入。默认生成的main.c中的内容我们还是不要,全部删除后敲入以下代码: 1 #include <ee1/led.h> 
发表于 2019-12-03
单片机iic+pca9685驱动控制9路舵机源程序
利用stc12c5a60s2单片机的iic通信,驱动pca9685,因为采用了9个舵机,所以不需要短接驱动板上的焊点,驱动的scl,sda对应接单片机的就好,vcc接3.3v,然后v+和gnd要给5v,插上9个舵机,我任务需要控制舵机90度来回转即可,用的串口,蓝牙控制,很简单,给需要的朋友参考pca9685驱动板驱动9个舵机单片机源程序如下:#include<reg52.h>           #include <intrins.h>  #include <stdio.h>#include <math.h>
发表于 2019-11-20
单片机iic+pca9685驱动控制9路舵机源程序
小广播
何立民专栏 单片机及嵌入式宝典

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

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