雏雁-Arduino部分(二)LCD1602+IIC

引入库清单

1
2
3
#include <LiquidCrystal_I2C.h>
//下面这个是依赖库,自己带的,文件里写不写好像无所谓(写了肯定没问题)
#include <Wire.h>

LiquidCrystal_I2C库使用

准备的时候一般设定好lcd的行列数,实例lcd对象,在setup函数里面初始化lcd(begin、打开背光)
setCursor(0, 0)函数用于设置光标位置,参数是行和列,从0开始
print()函数用于打印字符串
println()函数用于打印字符串并换行
clear()函数用于清屏(这个清屏是全部清,我写了单清一行的函数后面说)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

//lcd defination
#define COLUMS 16 // LCD columns
#define ROWS 2 // LCD rows

//这一行可以理解成实例一个lcd对象,参数是lcd的地址和。这个地址是通过i2c扫描器扫描出来的(自动的,因为0x27这个地址我写了报错)
LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14,POSITIVE);

void setup() {
// LCD begin
lcd.begin(COLUMS, ROWS);
//open lcd backlight
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("HELLO");

delay(1000);
}

清屏函数(某行)

先说为什么需要清屏函数。当我们重复的向lcd打印字符串的时候,如果不清屏,那么之前的字符串就会被覆盖。 当然这分几种情况:

  1. 重复打印的字符串长度大于等于之前打印的字符串长度,那么之前的字符串就会被覆盖
  2. 重复打印的字符串长度小于之前打印的字符串长度,那么之前的字符串就会被覆盖,但是后面的字符会保留

举例:原始字符串ACON。如果我在同一起点(setCursor)写入ACIN或者ACONN,结果显示正确的ACIN或者ACONN
但是如果我在同一起点写入BC,结果显示BCON。(AC被覆盖,ON没有)

1602有两行,我们设计用第一行显示温湿度信息,第二行显示指令信息。所以需要清除第二行的函数。
这里传入参数是行数,我们在传入行的开始连续写入空格(空字符),完成覆盖。
(那个size_t就是typedefine unsigned int,copilot写的,我一方面懒得改,另一方面留着装逼)

1
2
3
4
5
6
void lcdclearline(int line) {
lcd.setCursor(0, line);
for (size_t i = 0; i < COLUMS; i++) {
lcd.print(" ");
}
}