大自然的搬运工
TM1637四位数码管模块是一个带时钟点的4位共阳数码管(0.36英寸)的显示模块,驱动芯片为TM1637,驱动方式为IIC,因此只需2根信号线即可使单片机控制4位8段数码管(数码管8级灰度可调)。
控制接口:共4个引脚(GND、VCC、DIO、CLK),GND为地,VCC为供电电源,DIO为数据输入输出脚,CLK为时钟信号脚。
在这里学习I2C协议:
TM1637芯片使用(I2C总线协议学习),含完整程序_黑暗中的一束光1023的博客-优快云博客
头文件, `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);
}