An Arduino Sample Project Based on Liquid Crystal Display (LCD)
Introduction
本博客使用LCD屏幕搭建示例项目:Grove - 16x2 LCD: Play with Arduino。该示例项目使用的LCD显示器(Liquid Crystal Display,液晶显示器)来自Grove套件(Grove - 16x2 LCD):
示例项目的运行需要使用与硬件配套的Github: Grove RGB LCD Library,要首先安装:
之后将LCD屏接到I2C端口(并且接到四个I2C端口中的任意一个都可以,都不影响使用,也不需要修改代码),烧录代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//Inclue RBG LCD library
#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd lcd;
const int colorR = 255;
const int colorG = 0;
const int colorB = 0;
void setup()
{
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.setRGB(colorR, colorG, colorB);
// Print a message to the LCD.
lcd.print("Hello, world!");
delay(1000);
}
void loop()
{
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
delay(100);
}
最后的效果是LCD的第一行显示“Hello, world”的字样,第二行显示跳动的数字,该数字表示程序运行的秒数:
Code Learning
程序一开始包含了两个头文件:
1
2
3
//Inclue RBG LCD library
#include <Wire.h>
#include "rgb_lcd.h"
不是很清楚头文件 <Wire.h>
的作用,因为注释掉后程序仍可以运行;第二个头文件"rgb_lcd.h"
就是前面我们下载的Grove RGB LCD Library中的内容。紧接着实例化类rgb_lcd()
,声明得到一个对象lcd
:
1
rgb_lcd lcd;
以供后面的程序中调用和使用函数。
setup()
Initialization
LCD屏幕的初始化,要与屏幕的型号所匹配:
1
lcd.begin(16, 2);
lcd.begin()
函数的第一个参数表示列,第二参数表示行,这一点有一些别扭;另外,我尝试修改两个参数的值,最后发现第二个参数的影响比较大,例如如果代码改为:
1
lcd.begin(16, 1);
虽然不会报错,但是LCD屏幕的第二行不会显示任何内容。
Change Color of Backlight
改变LCD背光颜色:
1
2
3
4
5
6
7
8
9
const int colorR = 255;
const int colorG = 0;
const int colorB = 0;
void setup()
{
// ...
lcd.setRGB(colorR, colorG, colorB);
}
这部分代码的含义是将背光颜色调整为纯红色,但实际上这里的设置对LCD的显示效果没有任何影响,因为我们使用的这块LCD屏是固定的蓝底白字(White on Blue)显示。
Hello, world!
代码:
1
lcd.print("Hello, world!");
将”Hello, world!”字样打印在屏幕第一行。但是这块LCD屏不支持中文,例如我们想要输出“你好,世界!”:
1
lcd.print("你好,世界!");
显示的是乱码的内容:
loop()
Fix Cursor
代码:
1
2
3
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
是为了固定Cursor在指定位置。我们可以尝试改变一下lcd.setCursor
的参数。例如:
1
lcd.setCursor(3, 1);
如果直接将这一行注释掉:
1
// lcd.setCursor(3,1);
loop()
部分中打印的数字就不会在固定的位置显示。
lcd.print(millis()/1000);
loop()
部分代码的主要功能就是刷新屏幕第二行的数字:
1
2
lcd.print(millis()/1000);
delay(100);
此时屏幕上所打印的数字是整数,一秒钟变化一次,但是每秒钟屏幕刷新十次。其中,millis()
函数返回的是Arduino的运行时间,单位是毫秒;并且millis()
函数所返回的数据类型是unsigned long
,表示无符号长整型。
在C语言中,两个整型变量相除,是得不到一个double浮点数的,而是会直接舍去小数部分向下取整,因此屏幕上显示的是整数。如果想要在屏幕上显示小数表示的秒数,则可以使用下面两种方法:
1
2
3
lcd.print(millis()/1000.00); // Method 1
lcd.print(" ");
lcd.print((double)millis()/1000); // Method 2