1 硬件
2 软件环境
ArduinoIDE_31422
3 TM1637芯片
TM1637是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU&数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于电磁炉、微波炉及小家电产品的显示屏驱动。
4 TM1637数码管模块
该模块有商品出售,所以该电路图只示意各管脚连接关系,未列出其它辅助原件。
5 时钟数码管
6 TM1637和Arduino uno 的接线关系
TM1637 |
Arduino uno |
CLK |
2 |
DIO |
3 |
VCC |
5V |
GND |
GND |
7 程序
//unsigned char LED[4]; //用于LED的4位显示缓存
int CLK = 2;
int DIO = 3; //
//sbit CLK= P3^4; //定义模拟IIC总线的时钟线
//sbit DIO = P3^5; //定义模拟IIC总线的数据线
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 setup ()
{
pinMode(CLK,OUTPUT);
pinMode(DIO,OUTPUT); //让管脚为输出状态
}
void loop()
{
/*LED[0]=1;
LED[1]=2;
LED[2]=3;
LED[3]=4;*/
//unsigned char data_add4=1;
while(1)
{
//DIO=1;
//digitalWrite(DIO,HIGH);
TM1637_display(0x01,0x02,0x03,0x04,0x00);//演示怎样按顺序显示
// LED4_Display ();
delay(500);
TM1637_display(0x01,0x02,0x03,0x04,0x01);//演示怎样让两个点儿闪烁
delay(500);
unsigned char i;
for(i=1;i<=9;i++)//演示按地址显示
{
display_fix(0x03,i);
delay(500);
}
}
}
//IIC开始
void TM1637_start(void)
{
digitalWrite(CLK,HIGH);
digitalWrite(DIO,HIGH);
delay(2);
digitalWrite(DIO,LOW);
}
//IIC应答
void TM1637_ack(void)
{
char i;
digitalWrite(CLK,LOW);
delay(5);
while(DIO==1&&(i<250))i++;
digitalWrite(CLK,HIGH);
delay(2);
digitalWrite(CLK,LOW);
}
//IIC停止
void TM1637_stop(void)
{
digitalWrite(CLK,LOW);
delay(2);
digitalWrite(DIO,LOW);
delay(2);
digitalWrite(CLK,HIGH);
delay(2);
digitalWrite(DIO,HIGH);
delay(2);
}
//写数据函数
void TM1637_Write(unsigned char DATA)
{
unsigned char i;
for(i=0;i<8;i++)
{
digitalWrite(CLK,LOW);
if(DATA & 0x01)
digitalWrite(DIO,HIGH);
else
digitalWrite(DIO,LOW);
delay(3);
DATA=DATA>>1;
digitalWrite(CLK,HIGH);
delay(3);
}
}
//按顺序显示
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 display_fix(unsigned char add,unsigned char DispData)
{
TM1637_start();
TM1637_Write(0x40);
TM1637_ack();
TM1637_stop();
TM1637_start();
TM1637_Write(0xc0|add);//设置显示地址
TM1637_ack();
TM1637_Write(tab[DispData]);//写入数据如果第2个加0x80则显示两小点
TM1637_ack();
TM1637_stop();
TM1637_start();
TM1637_Write(0x89);
TM1637_ack();
TM1637_stop();
}