历史上的今天
返回首页

历史上的今天

今天是:2025年04月11日(星期五)

正在发生

2020年04月11日 | TM1637数码管显示STC51单片机驱动程序

2020-04-11 来源:eefocus

/*

Coder : Farman

Date  : 2018-01-02

参考了厂家的TM1637数据手册,在此表示感谢。

*/

 

#include   //包含52单片机头文件

#include "Delay.h"

 

////////////////////////////////////////////////////////////////////////////

 

 

sbit I2C_SCL = P2^1;   //定义模拟IIC总线的时钟线

sbit I2C_SDA = P2^0;   //定义模拟IIC总线的数据线

 

 

#define TM1637_BRIGHTNESS 7 // 0 - 7

 

 

////////////////////////////////////////////////////////////////////////////

 

 

void I2C_delay()

{

    nop_();

}

 

 

void I2C_start()

{   

    I2C_SCL = 1; 

    I2C_SDA = 1;

 

 

    I2C_delay();

 

 

    I2C_SDA = 0; // 时钟线设置为常态,低电平。

}

 

 

/*

I2C 总线写1个字节

不包含应答位的检测

*/

void I2C_write_byte(char byte_to_write)

{

    unsigned char i;

 

 

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

    {

        I2C_SCL = 0;

 

        I2C_SDA = byte_to_write & 0x01;

        I2C_delay();

 

        I2C_SCL = 1;

        I2C_delay();

 

 

        I2C_SCL = 0;

        I2C_delay();

 

 

        byte_to_write >>= 1;

    }

 

    return; 

}

 

 

void I2C_check_ack()

{

    // I2C 检查应答位,实际未检查,只发送了应答位时钟,认为TM1637工作正常

 

 

    I2C_SCL = 0;

    I2C_delay();//在第八个时钟下降沿之后延时5us,开始判断ACK 信号

 

    while(I2C_SDA)

    {

        ;

    }

 

 

    I2C_SCL = 1;

    I2C_delay();

 

 

    I2C_SCL=0;

}

 

 

void I2C_send_ack()

{

    I2C_SDA = 0;

    I2C_delay();

 

 

    I2C_SCL = 1;

    I2C_delay();

 

 

    I2C_SCL = 0;

    I2C_delay();

 

 

    I2C_SDA = 1;

    I2C_delay();

}

 

 

void I2C_stop()

{

    I2C_SCL = 0;

    I2C_delay();

 

 

    I2C_SDA = 0;

    I2C_delay(); 

 

 

    I2C_SCL = 1;

    I2C_delay();

 

 

    I2C_SDA = 1;

}

 

 

///////////////////////////////////////////////////////////////////////////

//

// TM1637模块操作函数

//

//////////////////////////////////////////////////////////////////////////

 

 

void TM1637_write_command_byte(unsigned char command)

{

    I2C_start();

    I2C_write_byte(command);

    I2C_check_ack();

    I2C_stop();

}

 

 

 

 

// bright : 0 - 7

void TM1637_display_switch_and_bright(bit enable_display, unsigned char bright)

{

    TM1637_write_command_byte(0x80 + (enable_display ? 0x08 : 0x00) + bright);

}

 

 

 

 

void TM1637_write_display_bytes(unsigned char first_addr, 

                                unsigned char bytes_to_write[],

                                unsigned char num_of_bytes)

{

    unsigned char i;

 

 

    I2C_start();

    I2C_write_byte(0x40);

    I2C_check_ack();

    I2C_stop();

 

 

    I2C_start();

    I2C_write_byte(0xC0 + first_addr);

    I2C_check_ack();

 

 

    for(i=0; i    {

        I2C_write_byte(bytes_to_write[i]);

        I2C_check_ack();

    } 

 

 

    I2C_stop();

}

 

 

 

 

// addr: 0 - 5

void TM1637_write_display_byte(unsigned char addr, unsigned char segments)

{

    I2C_start();

    I2C_write_byte(0x40 + addr);

    I2C_check_ack();

    I2C_stop();

 

 

    I2C_start();

    I2C_write_byte(0xC0 + addr);

    I2C_check_ack();

 

 

    I2C_write_byte(segments);

    I2C_check_ack();

 

 

    I2C_stop();

}

 

 

 

 

code unsigned char TM1637_SEG_TAB[] = 

{

     0x3F // 00111111 0

    ,0x06 // 00000110 1

    ,0x5B // 01011011 2

    ,0x4F // 01001111 3

    ,0x66 // 01100110 4

    ,0x6d // 01101101 5

    ,0x7d // 01111101 6

    ,0x07 // 00000111 7

    ,0x7F // 01111111 8

    ,0x6F // 01101111 9

    ,0x77 // 01110111 A

    ,0x7C // 01111100 b

    ,0x39 // 00111001 C

    ,0x5E // 01011110 d

    ,0x79 // 01111001 E 

    ,0x71 // 01110001 F 

};

 

 

void TM1637_show_digit(unsigned char pos, unsigned char digit, bit with_dot)

{

    TM1637_write_display_byte(pos, TM1637_SEG_TAB[digit] | (with_dot ? 0x20 : 0x00));

}

 

 

 

 

void TM1637_init()

{

    unsigned char i;

 

 

    TM1637_display_switch_and_bright(1, TM1637_BRIGHTNESS);

 

 

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

    {

        TM1637_write_display_byte(i, 0xFF);

    }

 

 

    Delay200ms();

 

 

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

    {

        TM1637_write_display_byte(i, 0x00);

    }

 

 

    Delay200ms();

 

 

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

    {

        TM1637_write_display_byte(i, 0xFF);

    }

 

 

    Delay200ms();

 

 

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

    {

        TM1637_write_display_byte(i, 0x00);

    }

 

 

    Delay200ms(); 

}

 

 

void TM1637()

{

    unsigned char seg;

    unsigned char i, j;

 

 

    TM1637_init();

 

 

    while(1)

    {

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

        {

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

            {

                TM1637_show_digit(j, i, 0);

            }

 

 

            Delay1s();

        }

    }

 

}

推荐阅读

史海拾趣

HM International公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,其发展历程涵盖了从模拟频道增补器到数字卫星、地面及有线电视机顶盒的广泛范畴。而从狭义角度看,机顶盒特指那些具备数字处理能力的设备,如IPTV机顶盒、DVB-S卫星机顶盒、DVB-T地面机顶盒及DVB-C有线电视机顶盒等。

机顶盒的核心功能在于接收并转换数字电视信号,使之能在传统或智能电视上播放。它不仅能接收来自有线电缆、卫星天线及宽带网络的信号,还能提供电子节目指南、网页浏览等增值服务。通过机顶盒,用户能够享受到高清乃至4K超高清的电视节目,体验更为细腻的画面和震撼的音效。此外,机顶盒还具备网络交互能力,支持在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。未来,机顶盒将不仅限于基本的信号接收与解码功能,还将融入更多智能推荐、语音识别等先进技术,为用户提供更加个性化、便捷的娱乐体验。总之,机顶盒作为连接电视与互联网的桥梁,正以其丰富的功能和广泛的应用场景,不断满足用户日益增长的娱乐需求。

Elpida Memory公司的发展小趣事

尽管Elpida Memory已经不复存在,但其在DRAM领域的技术和经验仍然对全球半导体产业产生了深远的影响。Elpida Memory在技术研发、生产管理和市场营销等方面的经验,为后来的半导体企业提供了宝贵的借鉴和参考。同时,Elpida Memory的失败也提醒了半导体企业需要时刻保持警惕和创新精神,以应对日益激烈的市场竞争和技术变革。

Danaher Corporation公司的发展小趣事

丹纳赫集团一直重视科技创新和产品研发。在电子行业,丹纳赫集团不断推出具有创新性和竞争力的产品,如高精度测量仪器、自动化测试设备和电子制造解决方案等。这些产品不仅满足了客户对高质量、高效率生产的需求,还帮助丹纳赫集团在电子行业中树立了良好的品牌形象。

Grande Electronics Ltd公司的发展小趣事
确保遥控器中的电池电量充足,避免电池电量不足导致的发射问题。
Amkor公司的发展小趣事
如电池电量不足、电源线路断路或短路,导致发射电路无法正常工作。
Alliance Memory公司的发展小趣事
定期清洁遥控器表面的灰尘和污垢,避免按键接触不良等问题。

问答坊 | AI 解惑

Spartan-6 and Virtex-6 FPGA Embedded Kit FAQ

1. Where can I purchase an Embedded kit?   2. How much do the Spartan-6 and Virtex-6 FPGA Embedded Kits cost? 3. When will I get my kit? 4. What are included in the Embedded Kits? 5. What expansion ports are avail ...…

查看全部问答>

ini多国语言unicode问题求助

我的多国语言用ini文件的方式来实现,在记事本中写好了多国语言后,保存为unicode编码。 在读取这个ini文件时查看内存中读出的S为 53 00 00 00,而在程序中自己定义的宽字节S在内存中则为53 00。 看起来读的unicode的ini文件中的字符好像多了2个 ...…

查看全部问答>

有关bufil的

求问bufif的功能是什么,比如说这段程序 bufif mybuf(out,in,enable)是什么意思? 刚学Verilog 数字系统设计 以后可能常来这边求教了!…

查看全部问答>

请问要从支持HL7协议的病人监护仪的网口读出数据和波形,谁会做?报酬详谈

请问要从支持HL7协议的病人监护仪的网口读出数据和波形,谁会做?报酬详谈 QQ:312969842…

查看全部问答>

usb驱动+钩子

谁有USB驱动+HOOK的例子和资料呀。 特别感谢!!!!…

查看全部问答>

求教C64x中EMIF中BE[7:0]的作用?

本帖最后由 dontium 于 2015-1-23 13:38 编辑 请大家帮忙,在C64x的EMIF在SDRAM接口中,如何通过BE[7:0]实现8bit、16bit、32bit、64bit的寻址方式? …

查看全部问答>

大哥大姐们求助!!!!

我用的NCP14025V的升压芯片但是纹拨太大,求教怎么解决啊,或者推荐别的芯片,实在不行我想把3.3V升压到7,8V再用别的芯片降到5V不知道可行否;…

查看全部问答>

利用6517A对惰性气体或高真空中的小型晶体高值电阻测量的典型误差来源

屏蔽与防护 为了降低静电干扰,利用具有地电位的导体包围样本和线缆(屏蔽)。 为了防止漏电流影响测量,利用具有同样电势的导体对至静电计[1]输入端的连接进行包围(防护)。测量电流时,需要将防护装置连接至电压源的LO端。 在高真空系统( ...…

查看全部问答>

用51单片机设计频率计并用lcd显示,我用加载了hex文件但是lcd没显示内容。解决者立...

用51单片机设计频率计并用lcd显示,我加载了hex文件但是lcd没显示内容。我用proteus仿真时用的是AT89c51,没有问题,结果也正确。实际硬件电路用的是STC89c52,结果不出来。该怎么解决啊/ 能完美解决者定当重谢,…

查看全部问答>