自制Arduino 使用TM1637显示时间

硬件

TM1637芯片

TM1637是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU&数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于电磁炉、微波炉及小家电产品的显示屏驱动。

TM1637数码管模块

TM1637和Arduino uno 的接线关系

TM1637 Arduino uno

CLK --》2

DIO --》3

VCC--》5V

GND==》GND 由于我的Arduino是自制的,需要找到对应的引脚,下面是引脚图:

程序

//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();
}

文档信息

版权声明:可自由转载(请注明转载出处)-非商用-非衍生

发表时间:2021年12月29日 11:36