踏入树莓派世界——驱动LCD1602
前言
本文章用到的设备:树莓派、杜邦线、面包板、电阻、10K电位器、LCD1602。
让树莓派拥有一块显示屏是一个好的想法——有的时候,我们想及时的获取一些简单的输出,使用一块1602(16*2字符显示,与之相似的还有2004)显示屏是个经济的选择。

你可以用不到十元钱买到一块LCD1602,只需要单显示屏,不需要驱动模块。
组装电路
LCD1602的引脚定义如下:
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同 为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当 RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
我们将使用四位输入法,所以第7-10脚不用连接。第1、16脚接地,第2、15脚接5V,第3脚串联一个10K电位器(就是滑动变阻器)接地,第4-6、11-14脚接树莓派的GPIO引脚,记得记下这些引脚的值。


全部接好后如上图所示。
使用Python输出文字
python下有一个十分好用的库:RPLCD。使用它可以方便的输出文字,而不用考虑其背后的运作方式。
这里是RPLCD的英文文档: https://rplcd.readthedocs.io/en/stable/index.html
在终端输入
pip3 install RPLCD
以安装该库。
下面是输出键盘输入文字的代码:
import RPi.GPIO as GPIO from RPLCD import CharLCD from time import sleep lcd = CharLCD(pin_rs=21, pin_rw=20, pin_e=16, pins_data=[26, 19, 13, 6], #设置为你使用的GPIO引脚 numbering_mode=GPIO.BCM, #使用BCM编号 cols=16, rows=2, #16*2,如果你用的LCD2004那就是20*4 auto_linebreaks=True, #LCD1602是会自动换行的 ) def main(): while True: lcd.clear() #清空屏幕 lcd.write_string(input('please enter:')) input('press any key to continue...') if __name__ == '__main__': try: main() except KeyboardInterrupt: #检测到ctrl+c结束程序 pass finally: lcd.clear() lcd.write_string("Goodbye!") sleep(0.5) lcd.clear() GPIO.cleanup() #最后要清空GPIO使用
执行后输入 Hello world!,输出结果:

自定义文字
LCD1602本身支持英文、拉丁字符和日文假名的输出,同时能存储八个用户的自定义字符

0x00~0x0f是未定义的,但用户只能使用0x00~0x07或0x08~0x0f之一。
下面是自定义字符的演示代码:
import RPi.GPIO as GPIO from RPLCD import CharLCD from time import sleep lcd = CharLCD(pin_rs=21, pin_rw=20, pin_e=16, pins_data=[26, 19, 13, 6], numbering_mode=GPIO.BCM, cols=16, rows=2 auto_linebreaks=True, ) def CreateChar(): smiley = ( #0b之后的数字表示对应位置的像素点,一共5*8个,1表示显示 0b00000, 0b01010, 0b01010, 0b00000, 0b10001, 0b10001, 0b01110, 0b00000, ) lcd.create_char(0, smiley) #0表示存储的序号,可以使用0~7。定义后写入到了LCD的RAM中,断电清空 def main(): while True: lcd.clear() lcd.write_string("\x00") #使用转义符可以直接显示该位置的字符,x00对应第一个,也就是上文定义的 input('press any key to continue...') if __name__ == '__main__': try: CreateChar() main() except KeyboardInterrupt: pass finally: lcd.clear() lcd.write_string("Goodbye!") sleep(0.5) lcd.clear() GPIO.cleanup()
执行后的效果:
