一旦您’玩过LED,开关和步进电机,下一步自然是16×2个字母数字LCD模块。这些模块价格便宜(不到10美元),并且易于与Raspberry Pi进行接口。它们有16个连接,但是您只需要在Pi上使用6个GPIO引脚即可。

16个中的大多数 ×2个可用模块与Hitachi HD44780 液晶屏控制器兼容。这样一来,您几乎可以购买任何设备,并确保它能以与其他设备几乎相同的方式工作。在eBay上,有多种颜色的背光可供选择。我购买的那个有蓝色背光。

液晶模组硬件

16x2 液晶屏模块该模块的引脚排列为:

  1. 地面
  2. VCC(通常+ 5V)
  3. 对比度调整(VO)
  4. 寄存器选择(RS)。
    RS = 0:命令,RS = 1:数据
  5. 读/写(R / W)。
    R / W = 0:写,R / W = 1:读
  6. 启用
  7. 位0(4位操作中不需要)
  8. 位1(4位操作中不需要)
  9. 位2(4位操作中不需要)
  10. 位3(4位操作中不需要)
  11. Bit 4
  12. Bit 5
  13. Bit 6
  14. Bit 7
  15. LED背光阳极(+)
  16. LED背光阴极(-)

通常,设备需要8条数据线才能将数据提供给位0-7。但是,可以将设备设置为“4 bit” mode which allows you to send data in two chunks (or nibbles) of 4位s. 这个 is great as it reduces the number of 通用输入输出 connections you require when interfacing with your Pi.

这是我连接液晶显示器的方式 :

液晶屏针功能Pi功能Pin
01地线地线P1-06
02+5V+5VP1-02
03对比地线P1-06
04RS 通用输入输出7P1-26
05RW地线P1-06
06E通用输入输出8P1-24
07Data 0
08Data 1
09Data 2
10Data 3
11Data 4通用输入输出25P1-22
12Data 5通用输入输出24P1-18
13Data 6通用输入输出23P1-16
14Data 7通用输入输出18P1-12
15+ 5V通过560ohm
16地线P1-06

注意 : RW引脚允许将设备置于读取或写入模式。我想将数据发送到设备,但不希望它将数据发送到Pi,所以我将此引脚接地。 Pi不能容忍其GPIO接头上的5V输入。将RW接地,可确保设备不会试图将数据线拉至5V,这会损坏Pi。

为了控制对比度,您可以调节提供给引脚3的电压。该电压必须在0至5V之间。我将此针脚接地。

引脚15为背光LED提供5V电压。那不是’不能在设备上清除该引脚是否可以直接连接到5V,所以我玩得很安全,并在此引脚上放置了一个560ohm电阻。

16x2 液晶屏模块 wiring to 树莓派

接线检查

在首次给电路上电之前,这里有一些完整性检查:

  • 引脚1(GND),3(对比度),5(RW)和16(LED-)(应接地)。
  • 引脚2应该连接到5V。针脚15的串联电阻应为5V,以保护背光。
  • 引脚7-10未连接
  • 引脚11-14连接到Pi上的GPIO引脚

蟒蛇

您可以使用任何喜欢的编程环境来控制HD44780样式的显示,但我选择的武器是Python。我用 RPi.GPIO库 提供对GPIO的访问。

这是我的代码:

#!/usr/bin/python
#--------------------------------------
#    ___  ___  _ ____
#   / _ \/ _ \(_) __/__  __ __
#  / , _/ ___/ /\ \/ _ \/ // /
# /_/|_/_/  /_/___/ .__/\_, /
#                /_/   /___/
#
#  lcd_16x2.py
#  16x2 液晶屏 Test Script
#
# Author : 马特 Hawkins
# Date   : 06/04/2015
#
# //www.ytguangda.com/
#
#--------------------------------------

# The wiring for the 液晶屏 is as follows:
# 1 : 地线
# 2 : 5V
# 3 : 对比 (0-5V)*
# 4 : RS  (Register Select)
# 5 : R/W (Read Write)       - GROUND THIS PIN
# 6 : 启用 or Strobe
# 7 : Data Bit 0             - NOT USED
# 8 : Data Bit 1             - NOT USED
# 9 : Data Bit 2             - NOT USED
# 10: Data Bit 3             - NOT USED
# 11: Data Bit 4
# 12: Data Bit 5
# 13: Data Bit 6
# 14: Data Bit 7
# 15: 液晶屏 Backlight +5V**
# 16: 液晶屏 Backlight 地线

#import
import RPi.GPIO as 通用输入输出
import time

# Define 通用输入输出 to 液晶屏 mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18

# Define some device constants
LCD_WIDTH = 16    # Maximum characters per line
LCD_CHR = True
LCD_CMD = False

LCD_LINE_1 = 0x80#第一行的LCD RAM地址
LCD_LINE_2 = 0xC0#第二行的LCD RAM地址

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

def 主要():
  # Main program block
  通用输入输出.setwarnings(False)
  通用输入输出设置模式(GPIO.BCM)       # Use BCM 通用输入输出 numbers
  通用输入输出.setup(LCD_E, 通用输入输出.OUT)  # E
  通用输入输出.setup(LCD_RS, 通用输入输出.OUT) # RS 
  通用输入输出.setup(LCD_D4, 通用输入输出.OUT) # DB4
  通用输入输出.setup(LCD_D5, 通用输入输出.OUT) # DB5
  通用输入输出.setup(LCD_D6, 通用输入输出.OUT) # DB6
  通用输入输出.setup(LCD_D7, 通用输入输出.OUT) # DB7

  # Initialise 显示
  lcd_init()

  while True:

    # Send some test
    lcd_string("Rasbperry Pi",LCD_LINE_1)
    lcd_string("16x2 液晶屏 Test",LCD_LINE_2)

    time.sleep(3) # 3 second delay

    # Send some text
    lcd_string("1234567890123456",LCD_LINE_1)
    lcd_string("abcdefghijklmnop",LCD_LINE_2)

    time.sleep(3) # 3 second delay

    # Send some text
    lcd_string("RaspberryPi-spy",LCD_LINE_1)
    lcd_string(".co.uk",LCD_LINE_2)

    time.sleep(3)

    # Send some text
    lcd_string("Follow me 上",LCD_LINE_1)
    lcd_string("Twitter @RPiSpy",LCD_LINE_2)

    time.sleep(3)

def lcd_init():
  # Initialise 显示
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear 显示
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
  #发送字节到数据引脚
  #位=数据
  #模式=字符正确
  #命令错误

  通用输入输出.output(LCD_RS,模式)#RS

  #高位
  通用输入输出.output(LCD_D4, False)
  通用输入输出.output(LCD_D5, False)
  通用输入输出.output(LCD_D6, False)
  通用输入输出.output(LCD_D7, False)
  if bits&0x10==0x10:
    通用输入输出.output(LCD_D4, True)
  if bits&0x20==0x20:
    通用输入输出.output(LCD_D5, True)
  if bits&0x40==0x40:
    通用输入输出.output(LCD_D6, True)
  if bits&0x80==0x80:
    通用输入输出.output(LCD_D7, True)

  # Toggle 'Enable' pin
  lcd_toggle_enable()

  #低位
  通用输入输出.output(LCD_D4, False)
  通用输入输出.output(LCD_D5, False)
  通用输入输出.output(LCD_D6, False)
  通用输入输出.output(LCD_D7, False)
  if bits&0x01==0x01:
    通用输入输出.output(LCD_D4, True)
  if bits&0x02==0x02:
    通用输入输出.output(LCD_D5, True)
  if bits&0x04==0x04:
    通用输入输出.output(LCD_D6, True)
  if bits&0x08==0x08:
    通用输入输出.output(LCD_D7, True)

  # Toggle 'Enable' pin
  lcd_toggle_enable()

def lcd_toggle_enable():
  # Toggle enable
  time.sleep(E_DELAY)
  通用输入输出.output(LCD_E, True)
  time.sleep(E_PULSE)
  通用输入输出.output(LCD_E, False)
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Send string to 显示

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, 液晶屏_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

if __name__ == '__main__':

  try:
    主要()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, 液晶屏_CMD)
    lcd_string("Goodbye!",LCD_LINE_1)
    通用输入输出.cleanup()

可以使用以下命令下载此脚本 这个连结 或使用以下命令直接连接到您的Pi:

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/lcd_16x2.py

然后可以使用以下命令运行它:

sudo lcd_16x2.py

如果使用此代码,则唯一需要更改的就是GPIO引脚映射,具体取决于您在Pi 通用输入输出接头上使用的引脚。这是一些照片:

补充说明 : 向LCD发送命令时,RS为低电平;发送字符时,RS为高电平。 RW始终很低,以确保我们只将数据输入到模块中。 8位字节一次发送4位。高4位在前,后4位在后。在某些步骤之间添加了延迟,以确保模块可以在信号改变之前对其做出反应。

上面的代码是由‘texy’ 上 the RaspberryPi.org论坛。一世 changed the way the bytes are broken down to bits as this significantly increased the response time of the 显示.

故障排除

如果您遇到问题,请尝试:

  • 仔细检查接线。
  • 尝试将对比针上的电压调整为0V至3.3V。
  • 将E_PULSE和E_DELAY参数从0.0005更改为0.001。一些屏幕对这些时间敏感并赢得了’如果它们太小,请初始化。
  • Use 蟒蛇 2. 我没有’还没有使用Python 3进行过测试。

看看我的另一个 液晶屏相关帖子 其中包括20的详细信息×本文使用的4版屏幕。