其实这个网上有许多教程,我自己跟着改了改就写出来了
先上源码
#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为其他的一些字符(好像是没译码的),具体请大家研究
本人初二,这是我第一次写文章,有很多不足,请大家谅解