ESP8266NodeMCU+MAX7219八位数码管制作联网时钟【Arduino】

其实这个网上有许多教程,我自己跟着改了改就写出来了

先上源码

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti wifiMulti;

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.aliyun.com");

//模块引脚定义
#define CLK D4
#define CS D3
#define DIN D2  

int sl = 0,sh = 0,mintl = 0,minth = 0,hrl = 0,hrh = 0,i =0;
//位写入
void Write_Max7219_byte(unsigned char DATA)         
{
    unsigned char i;    
    for(i=8;i>=1;i--)
    {                  
      digitalWrite(CLK,LOW);    
      if(DATA&0X80)
      {
           digitalWrite(DIN,HIGH);
      }
      else
      {
           digitalWrite(DIN,LOW);
      }
      DATA<<=1;
      digitalWrite(CLK,HIGH);
     }                                 
}


//16位写入
void Write_Max7219(unsigned char address,unsigned char dat)
{ 
   digitalWrite(CS,LOW);
   Write_Max7219_byte(address);           //写入地址
   Write_Max7219_byte(dat);               //写入数据
   digitalWrite(CS,HIGH);                        
}

//初始化函数
void Init_MAX7219(void)
{
   Write_Max7219(0x09, 0xFF);       //译码/BCD码
   Write_Max7219(0x0a, 0x08);       //亮度
   Write_Max7219(0x0b, 0x07);       //扫描界限:8
   Write_Max7219(0x0c, 0x01);       //普通模式
   Write_Max7219(0x0f, 0x00);       //正常显示     

   delay(10);
   Write_Max7219(1,0);
   delay(10);
   Write_Max7219(2,0);
   delay(10);
   Write_Max7219(3,0);
   delay(10);
   Write_Max7219(4,0);
   delay(10);
   Write_Max7219(5,0);
   delay(10);
   Write_Max7219(6,0);
   delay(10);
   Write_Max7219(7,0);
   delay(10);
   Write_Max7219(8,0);
   delay(10);
}

void setup() {

  
  Serial.begin(9600);
  pinMode(CLK,OUTPUT);
  pinMode(CS,OUTPUT);
  pinMode(DIN,OUTPUT); 
  delay(2000);
  Init_MAX7219();
   

// 尝试进行wifi连接。

wifiMulti.addAP("PHICOMM_301","949725167911Matsumotozawa");
wifiMulti.addAP("Matsumotozawa","080127dd");

  while (wifiMulti.run() != WL_CONNECTED) 
  { 
    delay(250);
    Serial.print('.');
  }

  timeClient.begin();
  timeClient.setTimeOffset(28800);
}

void loop() {
  timeClient.update();
  unsigned long epochTime = timeClient.getEpochTime();
  Serial.print("Epoch Time:");
  Serial.println(epochTime);

    //print time
    int currentHour = timeClient.getHours();

  Serial.print("Hour:");
  Serial.println(currentHour);
  int currentMinute = timeClient.getMinutes();
  Serial.print("Minute:");
  Serial.println(currentMinute);
  int weekDay = timeClient.getDay();
  Serial.print("Week Day:");
  Serial.println(weekDay);
  int currentSecond = timeClient.getSeconds();

  //数码管取得数位
  hrh = (currentHour - (currentHour % 10)) /10;
  hrl = currentHour % 10;
  minth = (currentMinute -(currentMinute % 10)) /10;
  mintl = currentMinute % 10;
  sh = (currentSecond -(currentSecond % 10)) /10;
  sl = currentSecond % 10;
  Write_Max7219(1,sl);
  Write_Max7219(2,sh);
  Write_Max7219(3,mintl);
  Write_Max7219(4,minth);
  Write_Max7219(5,hrl);
  Write_Max7219(6,hrh);
while(i<3600){
  i++;
delay(999);
sl++;

if(sl>=10)
{
  sl = 0;
  sh++;
 
  if(sh>=6)
  {
    sh = 0;
    mintl++;
     if(mintl >= 10)
     {
        mintl = 0;
        minth++;
        if(minth >= 6)
        {
          minth = 0;
          hrl++;
          if(hrl >= 10)
          {
            hrl = 0;
            hrh++;
            if(hrh >= 3)
            {
              hrh = 0;
            }
            Write_Max7219(6,mintl);
          }
          Write_Max7219(5,hrl);
          
        }
        Write_Max7219(4,minth);
     }
  
    Write_Max7219(3,mintl);
  }


  Write_Max7219(2,sh);
  
}
Write_Max7219(1,sl);
}
}

这里先写高位再写低位,具体如下:


高位数据:

0x01:为第一位数码管

0x02:为第二位数码管

0x03:为第三位数码管

0x04:为第四位数码管

0x05:为第五位数码管

0x06:为第六位数码管

0x07:为第七位数码管

0x08:为第八位数码管

0x09:译码,这里的低位数据输入的二进制为1的位就是进行译码的位, 比如0xFF表示全部译码,而0x2a则是显示第2、4、6位数码管

0x0a:亮度设置,后跟的数据就是亮度值

0x0b:扫描界限,就是要显示的数码管,0x07为全部显示

0x0c:普通模式与掉电模式选择,0x00为掉电模式,0x01为普通显示模式。掉电模式下不会显示

0x0f:正常显示与测试模式选择,0x00为正常显示,0x01为测试模式,此时全部数码管亮起


低位数据:

为BCD译码模式的时候

0x00-0x09为显示的数字

0x0a到0x0f为其他的一些字符(好像是没译码的),具体请大家研究

本人初二,这是我第一次写文章,有很多不足,请大家谅解

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值