去年三月份正在學習Arduino時,也曾參考範例練習使用2x16 LCD顯示字元,現在要改用Raspberry Pi, 除了使用語言上的不同外,接線的方式則是大同小異。本實作參考Matt Hawkins發表於Raspberry Pi Spy的文章,不同的是LCD顯示器的亮度因為電壓的關係,無法呈現對比的字元,需要加裝一個可變電阻,將LCD Pin3接到電阻,調整電阻就可以呈現LCD的字元。以下是執行結果的照片:
•Raspberry Pi Model B主板 x 1 (使用無線網卡)
•2x16 LCD x 1
•可變電阻 x 1
•連接線 x N條
• 將 LCD 的 VSS(1) 及 R/W(5) 接到 GND(6),VDD(2)接到 +5V(Pin 2)
• 可變電阻中間腳位接到 LCD 的 VO(3),其中一支接到 5V,另外一支接 GND (註:或是在VO 上串接一顆 1k ohm 電阻連到 GND)
[材料]
•麵包板 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()
張貼留言