TM1637驱动4位时钟数码管的Arduino 程序

时间:2024-05-18 15:26:20

1 硬件

                                    TM1637驱动4位时钟数码管的Arduino 程序TM1637驱动4位时钟数码管的Arduino 程序

2 软件环境

          ArduinoIDE_31422

3 TM1637芯片

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

                                                                     TM1637驱动4位时钟数码管的Arduino 程序

                               TM1637驱动4位时钟数码管的Arduino 程序

4 TM1637数码管模块 

                             TM1637驱动4位时钟数码管的Arduino 程序

             该模块有商品出售,所以该电路图只示意各管脚连接关系,未列出其它辅助原件。 

5 时钟数码管

 

                               TM1637驱动4位时钟数码管的Arduino 程序

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

      }