利用lcd1602显示时间的代码
#include<DS3231.h>
#include<Wire.h>
#include<LiquidCrystal.h>
#define RS 12
#define RW 11
#define dpinmin 3
#define dpinmax 10
#define Enable 2
DS3231 Clock;
bool Century, h12, PM = false;
byte year , month, date, Dow, hour, minute, second;
LiquidCrystal lcd(12, 11, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//地址位置
void Lcdcommandwrite( int value)
{
digitalWrite(RS, 0);
digitalWrite(RW, 0);
for (int i = dpinmin; i <= dpinmax; i++)
{
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite (Enable, 0);
delayMicroseconds(1);
digitalWrite(Enable, 1);
delayMicroseconds(1);
digitalWrite (Enable, 0);
delayMicroseconds(1);
}
//内容
void Lcddatawrite(int value)
{
digitalWrite(RS, 1);
digitalWrite(RW, 0);
for (int i = dpinmin; i <= dpinmax; i++)
{
digitalWrite(i, value & 01);
value >>= 1;
}
digitalWrite (Enable, 0);
delayMicroseconds(1);
digitalWrite(Enable, 1);
delayMicroseconds(1);
digitalWrite (Enable, 0);
delayMicroseconds(1);
}
void LCD_SET_XY(int x, int y)
{
int address;
if (x == 0)
{
address = 0x80 + y;
}
else
{
address = 0xC0 + y;
Lcdcommandwrite (address);
}
}
void setup()
{
for (int i = Enable; i <= RS; i++)
{
pinMode(i, OUTPUT);
}
delay(100);
Lcdcommandwrite(0x38);
delay(20);
Lcdcommandwrite(0x06);
delay(20);
Lcdcommandwrite(0x0e);
delay(20);
Lcdcommandwrite(0x01);
delay(20);
Lcdcommandwrite(0x02);
delay(100);
}
void Pritime ()
{
int second, minute, hour, date, month, year, dow;
second = Clock.getSecond();
minute = Clock.getMinute();
hour = Clock.getHour(h12, PM);
date = Clock.getDate();
month = Clock.getMonth(Century);
year = Clock.getYear();
dow = Clock.getDoW();
//年
lcd.setCursor(0, 0);
lcd.print("21");
if (year >= 10)
{
lcd.print(year, DEC);
}
else
{
lcd.print("0");
lcd.print(year, DEC);
}
lcd.print('-');
//月
lcd.setCursor(5,0);
if (month >= 10)
{
lcd.print(month, DEC);
}
else
{
lcd.print("0");
lcd.print(month,DEC);
}
lcd.print('-');
//日
lcd.setCursor(8,0);
if (date >= 10)
{
lcd.print(date,DEC);
}
else
{
lcd.print("0");
lcd.print(date,DEC);
}
//星期
lcd.setCursor(11, 0);
switch (dow)
{
case 1:
lcd.print("Mon");
break;
case 2:
lcd.print("Tue");
break;
case 3:
lcd.print("Wed");
break;
case 4:
lcd.print("Thu");
break;
case 5:
lcd.print("Fri");
break;
case 6:
lcd.print("Sat");
break;
case 7:
lcd.print("Sun");
break;
}
LCD_SET_XY(1, 0);
if (hour >= 10)
{
lcd.print(hour, DEC);
}
else
{
lcd.print("0");
lcd.print(hour, DEC);
}
lcd.print(':');
LCD_SET_XY(1, 3);
if (minute >= 10)
{
lcd.print(minute, DEC);
}
else
{
lcd.print("0");
lcd.print(minute, DEC);
}
lcd.print(':');
LCD_SET_XY(1, 6);
if (second >= 10)
{
lcd.print(second, DEC);
}
else
{
lcd.print("0");
lcd.print(second,DEC);
}
}
//时间冒号闪烁
void Tictime()
{
LCD_SET_XY(1,2);
lcd.print(' ');
LCD_SET_XY(1,5);
lcd.print(' ');
}
void loop()
{
unsigned long Rt = millis()%1000;
if (Rt<500)
{
Pritime();
}
else
{
Tictime();
}
}
看完了代码之后,我们就要来看看这上面的库
LiquidCrystal(rs,(rw),enable,(d0,d1,d2,d3),d4,d5,d6,d7) | 初始化LCD |
lcd.begin(cols,rows) | 设置显示器的宽度和高度 |
lcd.clear() | 清屏,光标移到左上角 |
lcd.home() | 光标复位到左上角 |
lcd.setCursor(col,row) | 设置光标到指定位置 |
lcd.write(data) | 输出一个字符到 LCD |
lcd.print(data) | 输出一串字符到 LCD,返回输出的字符数 |
lcd.(no)c/Cursor() | 显示/隐藏光标 |
lcd.(no)b/Blink() | 开启/关闭光标闪烁 |
lcd.(no)d/Display() | 开启/关闭LCD显示功能 |
lcd.scrollDisplayLeft/Right() | 向左/右滚屏 |
lcd.(no)a/Autoscroll() | 开启/关闭自动滚屏 |
lcd.createChar(num,data) | 创建自定义字符,num 自定义字符编号,data像素数据 |
SoftwareSerial mySerial(rxPin.txPin) | 构造函数,创建一个软串口 |
mySerial.listen() | 开启软串口监视状态,一个时刻只能监视一个软串口 |
mySerial.isListening() | 判断是不是处在监视状态 |
mySerial.overflow() | 检测缓冲区是不是已经溢出 |
Serial.available() | 返回串口接收缓冲区的字节数 |
Serial.begin(speed,config) | 初始化串口,speed波特率,config数据、校验、停止位 |
Serial.end() | 释放串口通信引脚,使其作为普通引脚 |
Serial.find(target) | 在缓冲区中搜索target,找到返回 true,否则返回false |
Serial.findUntil(target,terminal) | 搜索target直至terminal,无返回值 |
Serial.flush() | 等待正在发送的数据发送完成 |
Serial.peek() | 返回但不删除一字节数据 |
Serial.print(value,format) | 以ASCII码格式输出数据 |
Serial.read() | 读取并删除一字节数据 |
Serial.readBytes(buffer,length) | 读取 length长度的数据并存入 buffer |
Serial.readBytesUntil(character,buffer,length) | |
Serial.setTimeout(time) | 设置超时(等待串口数据)时间,与前两个函数配合使用 |
Serial.write(val/str/(buf,len)) | 以字节形式输出数据到串口,返回输出的字节数 |
void serialEvent() | 串口事件,在串口缓冲区有数据时触发,实际是运行在两次 loop之间 |
两个设备TX与RX交叉连接,GND相连.
对于MEGA,Serial 包括Serial,Serial1,Serial2,Serial3,Serial4
String += (char)Char 将Char添加到String后面
Wire.begin(none/address) | 以主机/从机模式加入IIC 总线 |
Wire.requestFrom(address,quantity,stop) | 主机向从机发送数据请求, stop:true 释放 IIC |
Wire.beginTransmission(address) | 告诉某从机主机要向它发送数据 |
Wire.endTransmission(none/stop) | 告诉从机数据发送完毕,stop:true释放IIC |
Wire.write(value/string/(date,length)) | 主机从机间发送数据 |
Wire.available() | 返回缓冲区的字节数 |
Wire.read() | 从机或主机从缓冲区中读取数据 |
Wire.onReceive(myHandler1) | 从机的函数,主机endTransmission后myHandler1被触发 |
Wire.onRequest(myHandler2) | 从机的函数,主机requestFrom后myHandler2 被触发 |
void myHandler1(int numBytes) void myHandler2() numBytes | 主机发送的字节数 |
EEPROM.write(address,value) 对指定地址写入数据,无返回值
EEPROM类库 补充:
EEPROM.read(address) 从指定地址读数据,若无数据,则读出255
union date 共用体类型,将大于1B的数据存到 EEPROM
{ 此例将float数据存到EEPROM中
float a; 读写的时候是对c.b[ i]操作,输出或其他是对 c.a操作
byte b[4];
}
date c;
部分库函数借鉴于:https://www.cnblogs.com/pengwenzheng/p/8332196.html