## 简介
LCD Keypad Shield是Arduino的一块液晶扩展板,这块扩展板仅需直接插在Arduino开发板上即可通过程序驱动,让Arduino连接屏幕变得十分简单和方便。

如上图所示,这块扩展板上带有一个LCD1602液晶屏,5个按键,1个Arduino复位按键,和一个用来调节液晶对比度的电位器,并且引出了Arduino开发板的所有引脚以及其他接口。这篇文章主要介绍一下如何使用这块扩展板的显示和按键功能。
## LCD驱动
驱动LCD1602显示屏之前首先来简单说明一下LCD显示屏各个引脚的功能。LCD1602上方共有16个引脚,每个引脚名称及功能如下:
VSS:接地
VDD:接电源
V0:对比度调整端,使用时可接电位器接地进行对比度调节
RS:寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器
RW:读写信号线,高电平读,低电平写
E:使能端,下降沿写操作,高电平读操作
DB0:数据总线最低位
DB1:数据总线1位
DB2:数据总线2位
DB3:数据总线3位
DB4:数据总线4位
DB5:数据总线5位
DB6:数据总线6位
DB7:数据总线7位
A:背光电源正极
K:背光电源负极
LCD1602显示屏的驱动我们可以使用LiquidCrystal库。LiquidCrystal库是Arduino中的一个LCD驱动库,我们可以使用库中的函数来对LCD显示屏进行操作。要驱动LCD显示屏我们就要知道扩展板上的LCD显示屏与Arduino是怎么连接的。在文章开头的图片中我们可以看到左侧对LCD显示屏引脚的连接有标注,LCD显示屏使能脚E接到了Arduino的数字9脚,RS脚接数字8脚,RW脚接地,信号脚DB4~DB7分别接数字脚4~7。LCD1602可以通过程序选择4线操作还是8线操作,我们的这块扩展板选择的是4线操作,所以数据脚只需要连接DB4到DB7即可。
在了解了LCD显示屏引脚功能以及与Arduino的连接后我们就可以通过LiquidCrystal库中的函数对LCD显示屏进行操作了,首先我们来看用到的第一个函数LiquidCrystal(),这个函数用于设置Arduino与LCD显示屏的连接信息,我们在使用这个函数的时候需要依次填入相应的参数,这块扩展板上显示屏与Arduino的数据连接是四线控制,所以我们使用LiquidCrystal()函数的时候需要依次填入LCD的RS、RW、E、D4、D5、D6、D7对应的Arduino引脚,由于RW是接地的,所以我们在填的时候可以省略。我们打开LiquidCrystal库的cpp文件可以看到LiquidCrystal()函数做的工作:
LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
{
init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0);
}
我们可以看到函数中调用了init()这个函数,这个函数就是用来对Arduino引脚来进行初始化的,具体内容为:
void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
_rs_pin = rs;
_rw_pin = rw;
_enable_pin = enable;
_data_pins[0] = d0;
_data_pins[1] = d1;
_data_pins[2] = d2;
_data_pins[3] = d3;
_data_pins[4] = d4;
_data_pins[5] = d5;
_data_pins[6] = d6;
_data_pins[7] = d7;
if (fourbitmode)
_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
else
_displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
begin(16, 1);
}
这个函数非常简单,就是将我们对我们填写的引脚进行一个设置同时设置显示屏为4线还是8线控制。

在设置完引脚后我们可以进行第二步操作,第二步我们要用到的是begin()函数,这个函数的主要作用就是来设置LCD显示屏的显示尺寸,扩展板上用到的是LCD1602显示屏,显示尺寸为16列2行,在填写参数时我们要先填写列数再填写行数,所以我们的函数语句应为:LCD.begin(16,2);
我们同样可以在LiquidCrystal库的cpp文件中找到begin()函数的定义,因为篇幅原因就这里就不把代码贴出来了,具体的功能就是根据输入的行和列对LCD显示屏发送指令,设置显示的尺寸,我们连接的LCD四位数据线除了可以发送要显示的信息以外,还可以对LCD显示屏发送指令信息,显示屏会根据发送的指令进行相应的设置。
LCD显示屏内部控制器的指令如下表所示:

这11条指令就是LCD1602的所有指令了。这些指令我们在使用的时候不需要再编写程序发送,在LiquidCrystal库中已经封装好了各种函数,我们直接调用就可以了。
例如我们在前面设置好了引脚和显示屏尺寸后可以调用clear()函数来清屏,clear()同样是LiquidCrystal()库中的一个函数,我们可以找到它的定义:
void LiquidCrystal::clear()
{
command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
delayMicroseconds(2000); // this command takes a long time!
}
我们可以看到clear()函数里调用了command()函数和一个延时函数,command()函数命是命令,很显然这个函数是给LCD显示屏发送命令的,接着我们找到它的定义:
inline void LiquidCrystal::command(uint8_t value)
{
send(value, LOW);
}
在里面我们又看到了一个函数send(),这个函数有两个参数,value很明显指的是命令,LOW应该是引脚的配置,我们找到send()函数定义:
void LiquidCrystal::send(uint8_t value, uint8_t mode)
{
digitalWrite(_rs_pin, mode);
// if there is a RW pin indicated, set it low to Write
if (_rw_pin != 255) {
digitalWrite(_rw_pin, LOW);
}
if (_displayfunction & LCD_8BITMODE) {
write8bits(value);
} else {
write4bits(value>>4);
write4bits(value);
}
}
通过分析上面这段程序我们就可以了解Arduino给LCD显示屏发送指令的步骤了,首先通过digitalWrite()函数让RS脚输出低电平,RS为低电平时操作的是指令寄存器,我们就可以开始写指令了,然后send()函数判断连接方式是4线还是8线,对于不同模式分别发送不同bit的指令,这就是对LCD写指令的操作,像clear()函数一样,LiquidCrystal库中也将其他指令封装成了函数,我们可以直接调用,这里我列出部分函数和各自的功能:
home() 将光标置于左上角,不会清屏
setCursor() 将光标置于指定位置
write() 在光标处显示一个字符
print() 显示字符串
cursor() 显示光标
blink() 光标闪烁
这只是一部分常用的,其余的函数也可以去库中查找。
在清屏操作后我们设置一下光标的位置也是要显示的字符的位置,我们通过调用setCursor()函数实现,这个函数可以将光标置于指定位置,函数内部同clear()函数,这里就不再介绍了。最后我们就要发送要显示的字符了,显示字符我们用到的是write()函数,显示字符串可以使用print()函数,这里讲一下write()函数,定义如下:
inline size_t LiquidCrystal::write(uint8_t value) {
send(value, HIGH);
return 1; // assume sucess
}
我们看到write()函数与command()函数很相似,只是对send()函数中引脚设置不同,前面讲过send()函数中的HIGH、LOW是设置RS的,RS为低是写指令,为高就是写数据的,所以write()里面设置RS为高,然后send()函数会自动转换字符为4bit还是8bit然后发送出去。这样就完成了一个字符的写入,有了单字符显示的函数我们很容易就能写字符串显示的函数了,这里就不再讲了,只需知道原理,用的时候直接调用print()函数就可以了。
现在我们就可以写一个简单的小程序在LCD上显示字符了,例如:

通过这段程序我们就可以在LCD第一行显示一串字符,效果如下

LCD的对比度我们可以通过左上角的电位器进行调整。现在我们已经实现了这块扩展板上LCD的驱动,接下来我们看一下扩展板上的5个按键要怎么驱动。
## 按键驱动
这块扩展板上按键的连接电路图如下:

这五个按键连接在了Arduino的A0口上,A0是Arduino的一个模拟口,当按下不同的按键时A0口的电压是不同的,我们只要读取A0口的值再通过对比就可以分辨出我们按下的是哪一个按键,这种方法非常节省IO口,而且对按键的判断也是很准确的。
我们先写一段程序来看一下当按下不同按键时A0返回的值是多少。

上述程序可以在我们按下按键后将A0口的数值通过串口发送到电脑,我们可以打开Arduino的串口监视器

当我们按下不同按键的时候,A0口可以读取到不同的值,并且不同按键是很好区分的,不过我们可以看到,对于同一按键,我们每次按下时A0口的值其实是在一个小范围内变化的,所以我们在写程序区分的时候就要选择好用来比较的值。
通过上述的原理我们就可以根据以下的程序来对按键进行判断了。



通过这段程序我们就可以判断按下的按键了,实际效果如下图


以上就是LCD Keypad Shield的使用教程了,感谢各位观看本教程。
原创作品,未经权利人授权禁止转载。详情见转载须知。
举报文章