一、电路连接
LCD1602IIC
LCD1602IIC引脚 | Arduino引脚 |
---|---|
VCC | 5V |
GND | GND |
SDA | A4 |
SCL | A5 |
我这里的LCD1602是IIC的,所以只需要4根线
DS1302
DS1302引脚 | Arduino引脚 |
---|---|
VCC | 5V |
GND | GND |
RST | A0(14) |
DAT | A1(15) |
SCK | A2(16) |
二、代码
记得提前安装DS1302的库
DS1302
#include <DS1302.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //引用I2C库
char buf1[50];
char buf2[50];
//设置LCD1602设备地址,这里的地址是0x27,一般是0x20,或者0x27,具体看模块手册
LiquidCrystal_I2C lcd(0x27,16,2); //这里是0x27
DS1302 rtc(14, 15, 16); //对应DS1302的RST,DAT,CLK
void initRTCTime(void)//初始化RTC时钟
{
rtc.writeProtect(false); //关闭写保护
rtc.halt(false); //清除时钟停止标志
Time t(2022, 12, 15, 17, 21, 50, 4); //新建时间对象 最后参数位星期数据,周日为1,周一为2以此类推
rtc.time(t);//向DS1302设置时间数据
}
void printTime()//打印时间数据
{
Time tim = rtc.time(); //从DS1302获取时间数据
snprintf(buf1, sizeof(buf1), "%04d-%02d-%02d ",
tim.yr, tim.mon, tim.date
);
snprintf(buf2, sizeof(buf2), "%02d:%02d:%02d",
tim.hr, tim.min, tim.sec);
Serial.println(buf1);
Serial.println(buf2);
}
void setup() {
Serial.begin(9600);
//新模块上电需要设置一次当前时间,
//下载完成后需屏蔽此函数再次下载,否则每次上电都会初始化时间数据
initRTCTime();
lcd.init(); // 初始化LCD
lcd.backlight(); //设置LCD背景等亮
lcd.setCursor(0,0);
lcd.print(" Clock ");
delay(2000);
lcd.clear();
}
void loop() {
printTime();
delay(1000);
Time tim = rtc.time(); //从DS1302获取时间数据
lcd.setCursor(0,0);
lcd.print(buf1);
lcd.setCursor(0,1);
lcd.print(buf2);
}