51单片机驱动TM1637

文章介绍了TM1637芯片用于驱动4位共阳数码管的原理和方法,包括其IIC驱动方式,只需2根信号线即可控制。提供了头文件和C代码示例,展示如何在STC8H系列单片机上使用IIC协议与TM1637芯片通信,实现整数和自定义内容的显示功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大自然的搬运工

TM1637四位数码管模块是一个带时钟点的4位共阳数码管(0.36英寸)的显示模块,驱动芯片为TM1637,驱动方式为IIC,因此只需2根信号线即可使单片机控制4位8段数码管(数码管8级灰度可调)。
控制接口:共4个引脚(GND、VCC、DIO、CLK),GND为地,VCC为供电电源,DIO为数据输入输出脚,CLK为时钟信号脚。

头文件, `tm1637.h`

#ifndef __TM1637_H__
#define __TM1637_H__

#include "stc8h.h" // 我用的是stc8h系列单片机

// 随意两个I/O口
sbit CLK = P1^5; //定义模拟IIC总线的时钟线
sbit DIO = P1^4; //定义模拟IIC总线的数据线

// 显示整数
void TM1637_DisplayInt(unsigned int target);

// 显示小数: 使用 ':' 分隔, 仅限两位整数和两位小数, 否则截取
// void TM1637_DisplayFloat(unsigned float target);

// 自定义显示
void TM1637_Display(unsigned char a, unsigned char b, unsigned char c, unsigned char d, unsigned char h);

#endif

`tm1637.c`

#include "tm1637.h"
#include "intrins.h"
  
code unsigned char tab[] =
{
        0x3F,/*0*/
        0x06,/*1*/
        0x5B,/*2*/
        0x4F,/*3*/
        0x66,/*4*/
        0x6D,/*5*/
        0x7D,/*6*/
        0x07,/*7*/
        0x7F,/*8*/
        0x6F,/*9*/
        0x77,/*10 A*/
        0x7C,/*11 b*/
        0x58,/*12 c*/
        0x5E,/*13 d*/
        0x79,/*14 E*/
        0x71,/*15 F*/
        0x76,/*16 H*/
        0x38,/*17 L*/
        0x54,/*18 n*/
        0x73,/*19 P*/
        0x3E,/*20 U*/
        0x00,/*21 黑屏*/
};

void Delay_us(unsigned  int i)
{
    for(;i>0;i--)
        _nop_();;
}

//IIC开始
void TM1637_start(void)
{
     CLK=1;
     DIO=1;
     Delay_us(2);
     DIO=0;
}


//IIC应答
void TM1637_ack(void)
{
    unsigned char i;
    CLK=0;
    Delay_us(5);
     //DIO=1;   
    while(DIO==1&&(i<250))i++;
    CLK=1;
    Delay_us(2);
    CLK=0;
}

//IIC停止
void TM1637_stop(void)
{
     CLK=0;
     Delay_us(2);
     DIO=0;
     Delay_us(2);
     CLK=1;
     Delay_us(2);
     DIO=1;
     Delay_us(2);
}

//写数据函数
void TM1637_Write(unsigned char DATA)   
{
    unsigned char i;   
    for(i=0;i<8;i++)        
    {
        CLK=0;     
        if(DATA & 0x01)
            DIO=1;
        else DIO=0;
         Delay_us(3);
        DATA=DATA>>1;      
        CLK=1;
         Delay_us(3);
    }  
    //TM1637_ack();
}


/** 按从左到右的顺序显示, h 控制 ':', 1显示,0不显示 */
void TM1637_display(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char h)
{

    TM1637_start();
    TM1637_Write(0x40);//写数据+自动地址加1+普通模式
    TM1637_ack();
    TM1637_stop();
    TM1637_start();
    TM1637_Write(0xc0);//设置显示首地址即第一个LED
    TM1637_ack();

    TM1637_Write(tab[a]);
    TM1637_ack();
    TM1637_Write(tab[b]|h<<7);//h为1时显示时钟中间的两点
    TM1637_ack();
    TM1637_Write(tab[c]);
    TM1637_ack();
    TM1637_Write(tab[d]);
    TM1637_ack();

    TM1637_stop();
    TM1637_start();
    TM1637_Write(0x89);//开显示,2/16亮度
    TM1637_ack();
    TM1637_stop();
}

void TM1637_DisplayInt(unsigned int target)
{
	unsigned char one, ten, hund, thous;
	
	thous = target / 1000;
	hund = target / 100 % 10;
	ten = target / 10 % 10;
	one = target % 10;
	
	TM1637_Display(thous, hund, ten, one, 0);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值