历史上的今天
返回首页

历史上的今天

今天是:2024年12月04日(星期三)

正在发生

2019年12月04日 | LED 驱动控制专用电路 TM1628 AVR 测试程序源代码

2019-12-04 来源:eefocus

#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);

推荐阅读

史海拾趣

Hitachi Metals公司的发展小趣事

随着汽车工业向智能化、电动化方向发展,Hitachi Metals敏锐地捕捉到了这一趋势带来的商机。公司加大了对汽车电子部件的研发和生产投入,特别是在汽车活塞环材料领域取得了显著成就。其生产的钢制活塞环材料在日本市场占据领先地位,不仅为众多汽车制造商提供了高质量的产品,还通过技术创新不断提升产品的附加值。此外,公司还积极拓展汽车电子控制单元(ECU)等关键部件的市场,进一步巩固了其在汽车电子领域的地位。

AdaptivEnergy公司的发展小趣事

然而,在快速发展的过程中,Hitachi Metals也遭遇过一些挑战。2016年,公司被曝出篡改部分铝制品的强度数据,这一事件对日立金属的声誉造成了一定影响。面对这一危机,公司迅速采取措施进行整改,加强了对产品质量的控制和监管力度。通过持续改进质量管理体系和强化员工培训等措施,Hitachi Metals成功恢复了市场对公司的信任。这一事件也促使公司更加注重产品质量的稳定性和可靠性,为未来的发展奠定了更加坚实的基础。

国盛科技(BOCHEN)公司的发展小趣事

国盛科技在发展过程中获得了多项认证与荣誉。例如,公司获得了知识产权管理体系认证证书,荣登《人民代表报》全国两会特刊,成为“中国质量万里行促进会”会员并获得“收录企业”荣誉称号等。这些认证与荣誉的获得,充分证明了国盛科技在电子行业的领先地位和企业实力的不断提升。

冠西电子(COSMO)公司的发展小趣事

冠西电子(COSMO)公司成立于1981年,起初便专注于光电元件产品的制造。公司创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,逐步将冠西电子打造成光电元件领域的专业制造商。通过不断的技术创新和产品质量提升,冠西电子逐渐在电子行业中崭露头角。

Carling Technologies公司的发展小趣事

Carling Technologies于1920年创立,早期专注于电气和电子开关以及组件的制造。凭借创始人的远见卓识和团队的努力,公司逐渐在行业中崭露头角。在创立初期,Carling Technologies就以其高质量的产品和创新的设计赢得了客户的信赖。通过不断的研发和技术升级,公司逐渐在电气和电子开关领域建立了自己的地位。

EPIGAP公司的发展小趣事

随着公司业务的不断拓展,EPIGAP公司意识到单靠自身力量难以应对日益复杂的市场环境。于是,公司开始积极寻求与产业链上下游企业的战略合作。通过与原材料供应商、代工厂商以及终端客户的紧密合作,EPIGAP公司实现了产业链的整合优化,提高了整体运营效率。这一战略不仅降低了公司的运营成本,还增强了公司的市场竞争力。

问答坊 | AI 解惑

dsp基础

第1章   概述1.1数字信号处理器的基本概念数字信号处理器(Digital Signal Processor,简称DSP)是一种专门用来实现各种数字信号处理算法的微处理器。根据使用方法的不同,DSP可以分成专用的DSP和通用的DSP。专用的DSP用来实现某些特定的 ...…

查看全部问答>

cadence仿真问题

用的是analoglib里的元件画的电路,仿真时不知道加模型库时怎么加?…

查看全部问答>

线径与电流关系(转)

NO.1 绝缘导线芯线最小截面要求可以通过下面的顺口溜快速求得:(单位:平方毫米) 【顺口溜】:十下五、百上二,五十三四上下分,埋地套管七五折。 【意思解释】:根据绝缘导线所要求通过的总电流,当总电流为10A以下时,导线每平方毫米的截 ...…

查看全部问答>

现在学完了51,接下来该学啥?

本帖最后由 paulhyde 于 2014-9-15 09:23 编辑 请各位指教。  …

查看全部问答>

FPGA写的232接收模块,丢包问题

今天早上测试232接收程序时,发现232接收某些特定数据时,接收不到。请问高人,可能啥原因?…

查看全部问答>

0805的电阻的功耗是多少?

来自EEWORLD合作qq群:49900581 群主:wangkj…

查看全部问答>

nandflash的坏块处理

那位有nandflash的坏块处理方法,说下.…

查看全部问答>

菜鸟问问 在Wince中时间显示

想在一个EDIT控件里显示系统当前时间,不知道该怎么做。 有没有相关的控件呢? 不要time picker…

查看全部问答>

弱问,CORTEXM3内核到底高明在啥地方?

哪位高人给个比较出来和ARM7TDMI比比看…

查看全部问答>

液晶浮点值显示的一种解决方法

液晶浮点值显示的一种解决方法   在以ucOS-II为系统搭建的工程中,需要在液晶LCD上显示浮点型值,但液晶的驱动函数中仅编写了一个显示字符串的函数GUI_DispStringAt(); 所以需要一个函数把浮点型值转化成字符串,然后以字符串的形式输出到LC ...…

查看全部问答>