LCD1602是一块成本低廉的输出设备,它有着体积小、操作简单、功耗低等优点,所以在一些DIY 产品上会用它来输出一些信息。昨天在使用时,虽然借鉴网上的资源,但是仍然有遇到一些问题,在这里写出来以便大家遇到时能够正确处理。
一、LCD1602 相关[1]
工业字符型液晶,能够同时显示16x02即32个字符。(16列2行)
1.1 管脚
1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。
引脚 | 符号 | 功能说明 |
1 | VSS | 一般接地 |
2 | VDD | 接电源(+5V) |
3 | V0 | 晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 |
4 | RS | RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 |
5 | R/W | R/W为读写选择,高电平(1)时进行读操作,低电平(0)时进行写操作。 |
6 | E |
E(或EN)端为使能(enable)端, 写操作时,下降沿使能。 读操作时,E高电平有效 |
7 | DB0 | 低4位三态、 双向数据总线 0位(最低位) |
8 | DB1 | 低4位三态、 双向数据总线 1位 |
9 | DB2 | 低4位三态、 双向数据总线 2位 |
10 | DB3 | 低4位三态、 双向数据总线 3位 |
11 | DB4 | 高4位三态、 双向数据总线 4位 |
12 | DB5 | 高4位三态、 双向数据总线 5位 |
13 | DB6 | 高4位三态、 双向数据总线 6位 |
14 | DB7 | 高4位三态、 双向数据总线 7位(最高位)(也是busy flag) |
15 | BLA | 背光电源正极 |
16 | BLK | 背光 电源负极 |
1.2 寄存器选择控制
根据上面的表中管脚说明,我们可以知道主要操控的是RS 和R/W 两个管脚:
RS | R/W | 操作说明 |
0 | 0 | 写入指令寄存器(清除屏等) |
0 | 1 | 读busy flag(DB7),以及读取位址计数器(DB0~DB6)值 |
1 | 0 | 写入数据寄存器(显示各字型等) |
1 | 1 | 从数据寄存器读取数据 |
注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.
busy flag(DB7):在此位为1时,LCD忙,将无法再处理其他的指令要求。也即:D7=1,禁止读写操作;D7=0,允许读写操作;
所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序)
1.3 指令集
LCD_1602 初始化指令小结:
0x38 设置16*2显示(总共可以输出16*2=32个字符),5*7点阵(每个字符为5*7的点阵显示),8位数据接口
0x01 清屏
0x0F 开显示,显示光标,光标闪烁
0x08 只开显示
0x0e 开显示,显示光标,光标不闪烁
0x0c 开显示,不显示光标
0x06 地址加1,当写入数据的时候光标右移
0x02 地址计数器AC=0;(此时地址为0x80) 光标归原点,但是DDRAM中断内容不变
0x18 光标和显示一起向左移动
1.4 显示地址
602字符液晶显示可分为上下两部分各16位进行显示,处于不同行时的字符显示地址如下:
显示字符 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
第一行地址 | 00H | 01H | 02H | 03H | 04H | 05H | 06H | 07H | 08H | 09H | 0AH | 0BH | 0CH | 0DH | 0EH | 0FH |
第二行地址 | 40H | 41H | 42H | 43H | 44H | 45H | 46H | 47H | 48H | 49H | 4AH | 4BH | 4CH | 4DH | 4EH | 4FH |
1.5 字符集
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如‘A’。
以下是1602的16进制ASCII码表:
读的时候,先读上面那列,再读左边那行,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。
注: 第一节的这些信息都是来源于互联网,网上还有一些操控程序,相信大家只要搜集一下就可以获取丰富资料。有了这些我们可以自己C 语言编程输出信息。但是本文的程序是基于国外的库进行的,并没有太大的复杂性。
在GitHub 上找到了一个关于树莓派使用1602 打印的一个项目,地址是:https://github.com/qtsharp/pi-screen。而这个小项目是基于一个国外大牛创建的树莓派的库:其地址为 https://projects.drogon.net/raspberry-pi/wiringpi/ 。
亲测可用,但是会遇到一些问题,所以下面两节我们分开来说说。
二、如何连接树莓派
在大神的LCD 连接网页上,我们可以看到树莓派与1602之间这么连接:
上述的图还是很清晰地,看图接线应该还是比较简单的。
注意: LCD1602 的第三个管脚接的是电位器,用于调节屏幕的对比度(也就是说字与背景亮光之间的颜色差异)。
树莓派的 GPIO 口接线,因为我的是有亚巧克力外壳的,所以从外面接进去还是比较麻烦的。我使用的方法是:
使用两派母口杜邦线将所有的GPIO 口接出来。然后接出来的线对于LCD1602这样接16根线的就需要通过面包板衔接。如果是一些类似于超声波模块只要接三根线的,直接将传感器模块接上这些母口就可以使用。还是很方便的吧!!!
三、正确打印信息
对于大神的库如果你没有耐心看或者想尽快看出LCD1602 的效果。这个树莓派1602打印信息的小项目倒是比较好的选择:
1. 给你的树莓派配置好源后,使用sudo apt-get install git 安装版本管理软件Git 。
2. git clone https://github.com/qtsharp/pi-screen 将此小项目的仓库克隆下来
根据pi-screen/README.md的描述,我们需要先将 大神的库wiringPi 编译好后,才能编译此项目中的1602.c。因为1602.c使用了wiringPi 库文件提供的树莓派1602 操控函数。
3. git clone git://git.drogon.net/wiringPi
cd wiringPi
克隆好wiringPi 的git 仓库后,我们需要的不是直接 “ ./build ”。因为此库经过大神的不断改进,已经到了v2 版本,而pi-screen 的作者一直没有更新,所以目前有两个选择:
(1) 根据库的API修改源代码 1602.c
(2) 跟我学偷懒,既然 pi-screen/1602.c 使用v1 版,我们就使 wiringPi 库回到 v1 版:
我们可以看到 pi-screen 的最后修改时间为 2013年5月8号, 我们就将 wiringPi 的git 仓库回到2013年5月8号以前。
使用 git log 追溯库的以前版本(如果你对git 这个神器还不是很了解,欢迎学习《Git
使用及进阶实战》),我们可以找到:
commit da38443cb257a3bbbe4ad7f54ee3f569710a2fe7
Author: Gordon Henderson <[email protected]>
Date: Mon May 13 19:43:26 2013 +0100
wiringPi Version 2 - First commit (of v2)
commit 98bcb20d9391ebde24f9eb1244f0d238fb1a1dab
Author: Gordon Henderson <[email protected]>
Date: Thu Feb 7 21:53:49 2013 +0000
Slight change to the gpio program to fix SPI buffer size when loading
the module.
Typo in gpio man page
Bug fixed in board revision detection (which would never happen
anyway, however)
与 2013-5-8 最接近的一次commit 是2013-2-7, 而且不巧的是5月13 就升级到了 v2 版本。所以我们只要使用 "
git reset --hard 98bcb20d9391ebde24f9eb1244f0d238fb1a1dab " 回到2月7日这个版本就可以了。
然后使用 " sudo ./build
" 编译这个库就可以了。
4. 至此, wiringPi 库编译完后,我们就“ cd ../pi-screen ”回到pi-screen 目录:
使用 “ gcc 1602.c -o 1602 -L lib -l wiringPi ” 编译好这个打印文件即可。
5. 然后使用 "sudo ./1602 你想打印的信息" 运行即可。
来显摆一下打印效果。
顺便啰嗦一句:树莓派使用文本界面然后使用ssh 登陆操控体验真的很好,而且超级省资源。可以看到图中,447MB的内存还有402M 可用。而使用图形界面的话应该只会剩下一半的样子。
不过即便我加了散热片,树莓派的温度一直持续在55度的样子,不知道你们那如何?
四、 总结
4.1 好好接线很重要
在本次操作中,由于一点失误,将其中一根数据线接错,导致后来使用程序打印的字符有问题:
比如我想打印的是 0123456789 ,出来的结果却是: 0101454589
4.2 用好 Git 仓库很重要
我们可以看到,本次实验中,由于1602.c 使用的是老版本的库,而最新的库已经提供了有所不同的API, 而我使用的较为偷懒的方法就是得益于强大的Git 。所以对于程序员来说使用 Git 是一个好习惯,会用Git 快要成了最基本的基础技能。
好吧,写到这,算结束了。以后再发使用其他的传感器与1602 接轨,相信会更好玩。再有时间可以自己写c 程序直接对1602 的寄存器读写数据,还是挺好玩的。
===================
引用资料:
[1]
百度百科 -- 1602字符液晶
[2] https://projects.drogon.net/raspberry-pi/wiringpi/lcd-library/
[3] https://github.com/qtsharp/pi-screen
树莓派玩耍笔记3 -- LCD1602显示篇,布布扣,bubuko.com