TM1637数码管显示STC51单片机驱动程序

发布者:SereneNature最新更新时间:2020-04-11 来源: eefocus关键字:TM1637  数码管显示  STC51单片机  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

/*

Coder : Farman

Date  : 2018-01-02

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

*/

 

#include <STC89C5XRC.h>  //包含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();

        }

    }

 

}

关键字:TM1637  数码管显示  STC51单片机  驱动程序 引用地址:TM1637数码管显示STC51单片机驱动程序

上一篇:linux系统与51单片机实现串口数据交互
下一篇:89C51单片机数码管显示

小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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