我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 630|回复: 2

TM1628驱动源码

[复制链接]

该用户从未签到

36

主题

12

回帖

81

积分

一级逆天

积分
81

终身成就奖

发表于 2020-11-21 08:49:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
详细说明
TM1628 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良,质量可靠。采用SOP28的封装形式。
产品特性
•  采用功率CMOS 工艺
•  工作电压范围:3V~5V
•  多种显示模式(10 段×7 位 ~ 13 段×4 位)
•  键扫描(10×2 bit )
•  灰度调节电路(占空比 8级可调)
•  串行接口(CLK,STB,DIO)
•  振荡方式:内置RC 振荡(450KHz ± 5%)
•  内置上电复位电路
•  封装形式:SOP28
应用说明
主要应用于VCR、VCD、DVD 及家庭影院等产品的显示屏驱动。

TM1628驱动源码:
#include <avr/io.h>
#include <util/delay.h>

#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);
    }
    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 = number[n % ary];
        n /= ary;
    }
    if (i == 0)
    {
        temp = number[0];
        i = 1;
    }
    if (neg_flag && (i < size))
    {
        temp = 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);

    for (i = 0; i < 10; i++)
    {
        _data = SEG_H;
    }
    for (i = 0; i < 7; i++)
    {
        TM1628_Display(_data, i + 1);
        _delay_ms(100);
    }
    for (i = 0; i < 7; i++)
    {
        TM1628_Display(_data, 7 - i);
        _delay_ms(100);
    }

    for (i = 0; i < 10; i++)
    {
        _data = SEG_NULL;
    }

    TM1628_DisplayNumber(brightness, 10, 0, 1, LEFT, brightness);
    TM1628_DisplayNumber(n, 10, 5, 5, RIGHT, brightness);

    while (1)
    {
        key = TM1628_ReadKey();
        if (key != now)
        {
            now = key;
            repeat_flag = 0;
            repeat_count = 0;
            key_process(key);
        }
        else
        {
            if (repeat_flag)
            {
                key_process(key);
                _delay_ms(50);
            }
            else
            {
                repeat_count++;
                if (repeat_count > 5000)
                {
                    repeat_flag = 1;
                    repeat_count = 0;
                }
            }
        }
    }
}
回复

使用道具 举报

该用户从未签到

1

主题

4703

回帖

4345

积分

二级逆天

积分
4345

终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

发表于 2020-11-21 09:20:39 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    开心
    昨天 08:22
  • 签到天数: 186 天

    [LV.7]常住居民III

    6

    主题

    6830

    回帖

    1万

    积分

    三级逆天

    积分
    14513

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2020-11-21 10:27:19 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表