星期四, 1月 30, 2014

Raspberry Pi 筆記(五):2x16 LCD顯示字元

[2014/01/29]
去年三月份正在學習Arduino時,也曾參考範例練習使用2x16 LCD顯示字元,現在要改用Raspberry Pi, 除了使用語言上的不同外,接線的方式則是大同小異。本實作參考Matt Hawkins發表於Raspberry Pi Spy的文章,不同的是LCD顯示器的亮度因為電壓的關係,無法呈現對比的字元,需要加裝一個可變電阻,將LCD Pin3接到電阻,調整電阻就可以呈現LCD的字元。以下是
執行結果的照片:

材料
•麵包板 x 1
•Raspberry Pi Model B主板 x 1 (使用無線網卡)
•2x16 LCD x 1
•可變電阻 x 1
•連接線 x N條

線路連接與電路圖
• 將 LCD 的 RS(4), Enable(6), D4(11), D5(12), D6(13), D7(14) 依序接到 26, 24, 22, 18, 16, 12 腳位
• 將 LCD 的 VSS(1) 及 R/W(5) 接到 GND(6),VDD(2)接到 +5V(Pin 2)
• 可變電阻中間腳位接到 LCD 的 VO(3),其中一支接到 5V,另外一支接 GND (註:或是在VO 上串接一顆 1k ohm 電阻連到 GND)




1602顯示器接腳說明
LCD顯示器若無背光則會有14個Pin,若有背光則會有16個,而接腳位置大多如下:

LCD pin 功能 Pi功能 Pi Pin
1 VSS(接地) GND Pin 6
2 VDD(5V電源輸入) +5V Pin 2
3 VO 或稱 Vee:
調整對比,需接一個1k的可變電阻
GND Pin 6
4 Register Select(RS):
1: D0 – D7 當作資料解釋,0: D0 – D7 當作指令解釋
GPIO7 Pin 26
5 READ/WRITE(RW):
1: 從 LCD 讀取資料,0: 寫資料到 LCD
GND Pin 6
6 Enable GPIO8 Pin 24
7 Data Bit 0
8 Data Bit 1
9 Data Bit 2
10 Data Bit 3
11 Data Bit 4 GPIO25 Pin 22
12 Data Bit 5 GPIO24 Pin 18
13 Data Bit 6 GPIO23 Pin 16
14 Data Bit 7 GPIO18 Pin 12
15 A(+) 背光:可接330 Ohm電阻到電源
16 K(-) 背光:接地 GND Pin 6

程式
# 在2x16 LCD顯示幕印出字元
#
# 原作者 : Matt Hawkins

#import
import RPi.GPIO as GPIO
import time

# 定義GPIO 對 LCD 的接腳
LCD_RS = 7
LCD_E  = 8
LCD_D4 = 25 
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18

# 定義變數
LCD_WIDTH = 16    # 每行最多字元
LCD_CHR = True
LCD_CMD = False

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

# Timing constants
E_PULSE = 0.00005
E_DELAY = 0.00005

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

  # 初始設定LCD顯示器
  lcd_init()

  # 送出第一次顯示字元
  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string("Rasbperry Pi")
  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string("Model B")

  # 暫停 3秒鐘
  time.sleep(3)   

  # 送出第二次顯示字元
  lcd_byte(LCD_LINE_1, LCD_CMD)
  lcd_string("Raspberrypi-spy")
  lcd_byte(LCD_LINE_2, LCD_CMD)
  lcd_string(".co.uk")

  time.sleep(20)

def lcd_init():
  # 初始設定LCD顯示器
  lcd_byte(0x33,LCD_CMD)
  lcd_byte(0x32,LCD_CMD)
  lcd_byte(0x28,LCD_CMD)
  lcd_byte(0x0C,LCD_CMD)  
  lcd_byte(0x06,LCD_CMD)
  lcd_byte(0x01,LCD_CMD)  

def lcd_string(message):
  # 送出字串到顯示器
  message = message.ljust(LCD_WIDTH," ")  

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

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
  time.sleep(E_DELAY)    
  GPIO.output(LCD_E, True)  
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)  
  time.sleep(E_DELAY)      

  # 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
  time.sleep(E_DELAY)    
  GPIO.output(LCD_E, True)  
  time.sleep(E_PULSE)
  GPIO.output(LCD_E, False)  
  time.sleep(E_DELAY)   

if __name__ == '__main__':
  main()

參考資料:
• Raspberry Pi Spy
• Raspberry Pi Cookbook by Simon Monk
Share:

0 意見:

張貼留言