esp8266wifi时钟,tm1637六位数码管显示

我是初学者不会编程,在网上找到的程序,发一个共大家参考,先上程序。

#include <ESP8266WiFi.h>

#include <TimeLib.h>

#include <NTPClient.h>

#include <WiFiUdp.h>

int8_t timeZone = 8;

const PROGMEM char *ntpServer = "ntp1.aliyun.com";

#define ADD_AUTO        0X40

#define ADD_FIX         0x44

#define DISP_BRIGHT     0x80

#define ADDR_COMMAND    0XC0

#define READ_COMMAND    0x42

#define BRIGHT          0X8F

//-------------------------key code----------------------

#define  S1              0X8F

#define S2              0X4F

#define S3              0X0F

#define S4              0X6F

#define S5              0XEF

#define S6              0XAF

unsigned char DIO=12;

unsigned char CLK=13;

#define DIO_H         digitalWrite(DIO,HIGH)

#define DIO_L         digitalWrite(DIO,LOW)

#define CLK_H       digitalWrite(CLK,HIGH)

#define CLK_L       digitalWrite(CLK,LOW)

#define DIO_IN        pinMode(DIO,INPUT)

#define DIO_OUT       pinMode(DIO,OUTPUT)

#define DIO_READ      digitalRead(DIO)

#define  point 0x80  //定义小数点

unsigned char SEG_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,

                 0x38,0x30,0x76,0x74,0x3E,0x1C,0x37,0x54,0x73,0x73,0x1E,0x1E,0x3F,0x5C,0x6D,0x6D,

                 0x6E,0x6E,0x00,0x40,0x77,0x7C,0x39,0x5E,0x79,0x71};  //段码表,与下面支持显示的字符一一对应

unsigned char char_tab[]={"0123456789ABCDEFLlHhUuNnPpJjOoSsYy -abcdef"};    //支持显示的字符集合,与上面段码必须一一对应

void Start(void)

{

  CLK_H;

  delayMicroseconds(2);

  DIO_H;

  delayMicroseconds(2);

  DIO_L;

  delayMicroseconds(2);

  CLK_L;

  delayMicroseconds(2);

}

void Stop(void)

{

  CLK_L;

  delayMicroseconds(2);

  DIO_L;

  delayMicroseconds(2);

  CLK_H;

  delayMicroseconds(2);

  DIO_H;

  delayMicroseconds(2);

}

void Ack(void)

{

  unsigned char timeout=0;

  CLK_L;

  DIO_IN;

  DIO_H;

  do  timeout++;

  while((DIO_READ)&&(timeout<255));

  CLK_H;

  CLK_L;

  DIO_OUT;

}

void TM1637_Write(unsigned char DATA)  

{

  unsigned char i;  

  for(i=0;i<8;i++)        

    {

      CLK_L;    

      if(DATA & 0x01)DIO_H;

      else DIO_L;

      DATA >>= 1;      

      CLK_H;

    }  

  Ack();

}

void Write_DATA(unsigned char add,unsigned char DispData)    //指定地址写入数据

{

  Start();          //Start signal sent to TM1637 from MCU

  TM1637_Write(ADD_FIX);//

  Stop();           //

  Start();          //

  TM1637_Write(ADDR_COMMAND|add);//

  TM1637_Write(DispData);//

  Stop();            //

}

void Clear(void)

{

  unsigned char i;

  for(i=0;i<6;i++)

    Write_DATA(i,0);

}

void Disp_Char_Fix(unsigned char add,unsigned char dis_char)  //指定地址显示数据,add代表数码管位置,dis_char为要显示的字符

{

  unsigned char i,point_flag;

  if(add>5) return;

  point_flag=dis_char&point;    //先把小数点分离出来

  dis_char&=0x7f;

  if(dis_char<0x10)Write_DATA(add,SEG_CODE[dis_char]|point_flag); //如果是数字,直接显示

  else

    {

      for(i=0;i<sizeof(char_tab);i++)               //如果是字符,则在支持的字符中查找

        if(char_tab[i]==dis_char)                 //找到,则把对应的段码送显示

        Write_DATA(add,SEG_CODE[i]|point_flag);

    }

}

void Disp_Num(unsigned long Num)  //按十进制显示数字,超出范围直接返回

{

  unsigned char i=0;

  if(Num>999999)return;

  Clear();

  do{Disp_Char_Fix(5-i,Num%10);Num/=10;i++;}while(Num>0);

}

void init_TM1637(void)

{

  Start();

  TM1637_Write(BRIGHT);

  Stop();

  Clear();

}

void Io_Init(void)

{

  pinMode(DIO,OUTPUT);

  pinMode(CLK,OUTPUT);

}

WiFiUDP ntpUDP;

NTPClient timeClient(ntpUDP, "ntp1.aliyun.com",60*60*8, 30*60*1000);

void setup()

{

   Serial.begin(115200);

   WiFi.begin("CMCC-g", "guo-1363497");

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    //Serial.print(".");

  }

  Serial.println("Local IP:");

  Serial.print(WiFi.localIP());

  timeClient.begin();

  delay(50);      

        Io_Init();

        init_TM1637();

}

void loop()

{

      timeClient.update();

      Serial.println(timeClient.getFormattedTime());

      delay(1000);

      //int month = timeClient.getMonth();

      int day = timeClient.getDay();

      //int weekday = timeClient.getWeekday();

      int hours = timeClient.getHours();

      int minu =  timeClient.getMinutes();

      int sece =  timeClient.getSeconds();

      int daya = day/10;

      int dayb = day%10;

      int hoursa = hours/10;

      int hoursb = hours%10;

      int minua = minu/10;

      int minub = minu%10;

      int secea = sece/10;

      int seceb = sece%10;

      //unsigned char i,j;//循环显示123456789

      //for(i=0;i<0x10;i++)//滚动显示0~F

       // {

         // for(j=0;j<6;j++)

            //{

             // Disp_Char_Fix(j,i|0x80);

            //}

          //delay(500);

        //}

    Disp_Char_Fix(1,hoursb);//第二位显示2

    Disp_Char_Fix(3,minub);//第四位显示4和小数点

    delay(400);

    Disp_Char_Fix(1,hoursb|point);//第二位显示时和小数点

    Disp_Char_Fix(3,minub|point);//第四位显示分和小数点

    Disp_Char_Fix(2,minua);//第三位显示分

    Disp_Char_Fix(0,hoursa);//第一位显示时

    if(dayb==0){

      dayb=8;

    }

    Disp_Char_Fix(4,'-');//第五位显示‘-’

    Disp_Char_Fix(5,dayb);//第六位显示星期

}

我还不会用函数库编程,哪位大神能教一教,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值