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

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Li.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值