Arduino(九)——lcd时钟以及部分库函数介绍

利用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库函数
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() 检测缓冲区是不是已经溢出

硬件串口(UART)通信
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后面 

IIC总线与Wire类库函数
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

猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/121550799