简体   繁体   English

python程序LCD 20x4显示器是否需要使用RPi GPIO 08引脚?

[英]Do a python program lcd 20x4 display need to used RPi GPIO 08 pin?

I have created a python program used wxpython module to display output from mcp3008 which convert data from analog to digital from rain sensor. 我创建了一个Python程序,该程序使用wxpython模块显示mcp3008的输出,该输出将雨量传感器的数据从模拟转换为数字。 This project I'm doing is to upgrade the current project with only display data through lcd 20x4 display from other input or source. 我正在做的项目是通过其他输入或源的20x4液晶显示器升级仅显示数据的当前项目。 But the my wxpython program used the GPIO08 pin which has a SPIO_CE0_N function for spi bus as my mcp3008 required it to check my other spi pin. 但是我的wxpython程序使用了GPIO08引脚,该引脚具有SPI总线的SPIO_CE0_N功能,因为我的mcp3008要求它检查我的其他SPI引脚。 This my mcp3008 pin layout to raspberry pi: 这是我的mcp3008到树莓派的引脚布局:

VDD   3.3V
VREF  3.3V
AGND  GROUND
CLK   GPIO11 (P1-23)
DOUT  GPIO9  (P1-21)
DIN   GPIO10 (P1-19)
CS    GPIO8  (P1-24)
DGND  GROUND

And this is lcd 20x4 display pin layout to raspberry pi: 这是树莓派的LCD 20x4显示引脚布局:

LCD Pin Function    Pi Function Pi Pin
01  GND GND P1-06
02  +5V +5V P1-02
03  Contrast        
04  RS  GPIO7   P1-26
05  RW  GND P1-06
06  E   GPIO8   P1-24
07  Data 0      
08  Data 1      
09  Data 2      
10  Data 3      
11  Data 4  GPIO25  P1-22
12  Data 5  GPIO24  P1-18
13  Data 6  GPIO23  P1-16
14  Data 7  GPIO18  P1-12
15  +5V via 560 ohm     
16  GND     P1-06

As the python program for the lcd display i get from the internet use GPIO 08 in the program: 作为我从互联网上获得的液晶显示器的python程序,请在程序中使用GPIO 08

#!/usr/bin/python
#--------------------------------------
#    ___  ___  _ ____
#   / _ \/ _ \(_) __/__  __ __
#  / , _/ ___/ /\ \/ _ \/ // /
# /_/|_/_/  /_/___/ .__/\_, /
#                /_/   /___/
#
#  lcd_16x2.py
#  20x4 LCD Test Script with
#  backlight control and text justification
#
# Author : Matt Hawkins
# Date   : 06/04/2015
#
# http://www.raspberrypi-spy.co.uk/
#
#--------------------------------------

# The wiring for the LCD is as follows:
# 1 : GND
# 2 : 5V
# 3 : Contrast (0-5V)*
# 4 : RS (Register Select)
# 5 : R/W (Read Write)       - GROUND THIS PIN
# 6 : Enable 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: LCD Backlight +5V**
# 16: LCD Backlight GND

#import
import RPi.GPIO as GPIO
import time

# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
LED_ON = 15

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

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

def main():
  # Main program block

  GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers
  GPIO.setup(LCD_E, GPIO.OUT)  # E
  GPIO.setup(LCD_RS, GPIO.OUT) # RS
  GPIO.setup(LCD_D4, GPIO.OUT) # DB4
  GPIO.setup(LCD_D5, GPIO.OUT) # DB5
  GPIO.setup(LCD_D6, GPIO.OUT) # DB6
  GPIO.setup(LCD_D7, GPIO.OUT) # DB7
  GPIO.setup(LED_ON, GPIO.OUT) # Backlight enable

  # Initialise display
  lcd_init()

  # Toggle backlight on-off-on
  lcd_backlight(True)
  time.sleep(0.5)
  lcd_backlight(False)
  time.sleep(0.5)
  lcd_backlight(True)
  time.sleep(0.5)

  while True:

    # Send some centred test
    lcd_string("--------------------",LCD_LINE_1,2)
    lcd_string("Rasbperry Pi",LCD_LINE_2,2)
    lcd_string("Model B",LCD_LINE_3,2)
    lcd_string("--------------------",LCD_LINE_4,2)

    time.sleep(3) # 3 second delay

    lcd_string("Raspberrypi-spy",LCD_LINE_1,3)
    lcd_string(".co.uk",LCD_LINE_2,3)
    lcd_string("",LCD_LINE_3,2)
    lcd_string("20x4 LCD Module Test",LCD_LINE_4,2)

    time.sleep(3) # 20 second delay

    # Blank display
    lcd_byte(0x01, LCD_CMD)

    time.sleep(3) # 3 second delay

def lcd_init():
  # Initialise display
  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 display
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = data
  # mode = True  for character
  #        False for command

  GPIO.output(LCD_RS, mode) # RS

  # High bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x10==0x10:
    GPIO.output(LCD_D4, True)
  if bits&0x20==0x20:
    GPIO.output(LCD_D5, True)
  if bits&0x40==0x40:
    GPIO.output(LCD_D6, True)
  if bits&0x80==0x80:
    GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  lcd_toggle_enable()

  # Low bits
  GPIO.output(LCD_D4, False)
  GPIO.output(LCD_D5, False)
  GPIO.output(LCD_D6, False)
  GPIO.output(LCD_D7, False)
  if bits&0x01==0x01:
    GPIO.output(LCD_D4, True)
  if bits&0x02==0x02:
    GPIO.output(LCD_D5, True)
  if bits&0x04==0x04:
    GPIO.output(LCD_D6, True)
  if bits&0x08==0x08:
    GPIO.output(LCD_D7, True)

  # Toggle 'Enable' pin
  lcd_toggle_enable()

def lcd_toggle_enable():
  # Toggle enable
  time.sleep(E_DELAY)
  GPIO.output(LCD_E, True)
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)
  time.sleep(E_DELAY)

def lcd_string(message,line,style):
  # Send string to display
  # style=1 Left justified
  # style=2 Centred
  # style=3 Right justified

  if style==1:
    message = message.ljust(LCD_WIDTH," ")
  elif style==2:
    message = message.center(LCD_WIDTH," ")
  elif style==3:
    message = message.rjust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

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

def lcd_backlight(flag):
  # Toggle backlight on-off-on
  GPIO.output(LED_ON, flag)

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)
    lcd_string("Goodbye!",LCD_LINE_1,2)
    GPIO.cleanup()

So my question is can i change the pin for lcd display that used GPIO 08 to other pin and change the program to used the changing RPi pin as i don't know whether the lcd display python program need to used the SPIO_CE0_N in GPIO 08 or only used the GPIO 08 without the SPIO_CE0_N function. 所以我的问题是我可以将使用GPIO 08 LCD显示器的引脚更改为其他引脚,并将程序更改为使用更改的RPi引脚,因为我不知道LCD显示器python程序是否需要在GPIO 08使用SPIO_CE0_N还是仅使用不带SPIO_CE0_N功能的GPIO 08

You use GPIO 8 for SPI_CE0 on Raspberry Pi only if you are using hardware SPI , and from your MCP3008 connections, it is pretty clear that you are. 仅在使用硬件SPI且从MCP3008连接中使用GPIO 8SPI_CE0在Raspberry Pi SPI_CE0 GPIO 8用于SPI_CE0

The simplest solution is to use Software SPI for MCP3008 instead, and connect MCP3008 CLK , DOUT , DIN , and CS/SHDN pins to any other free digital GPIO pins, and use your GPIO08 for your LCD connections. 最简单的解决方案是改用MCP3008 Software SPI ,并将MCP3008的CLKDOUTDINCS/SHDN引脚连接到任何其他免费的数字GPIO引脚,并使用GPIO08进行LCD连接。 Or you can do the opposite and use software SPI for your LCD. 或者,您可以做相反的事情,并为LCD使用软件SPI。

Switching from hardware SPI to software SPI is easy, you only have to change pin numbers in the code. 从硬件SPI切换到软件SPI很容易,您只需更改代码中的引脚号即可。 You can read more details on using Software SPI with MCP3008 here, https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters/mcp3008#software-spi 您可以在这里( https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters/mcp3008#software-spi)上了解有关将SPI与MCP3008使用的更多详细信息。

GPIO image for future reference, GPIO映像以供将来参考,

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM