مروری بر ویژگیهای نمایشگر کاراکتری ۱۶۰۲
در برخی از پروژهها نیاز به نمایش اطلاعات توسط نمایشگر است. نمایشگر کاراکتری ۱۶۰۲ نمایشگری ایدهآل و مقرون به صرفه جهت نمایش متون کوتاه به شمار میرود. راه اندازی و تنظیمات مربوط به این نمایشگر با تمامی پردازنده بسیار ساده است.در این پروژه نحوهی اتصال و تنظیم این نمایشگر با رزبری پای و زبان پایتون آموزش داده خواهد شد.
تجهیزات مورد نیاز جهت انجام این پروژه شامل موارد زیر است:
تنظیمات سخت افزاری نمایشگر ۱۶۰۲
به منظور راه اندازی نمایشگر ۱۶۰۲ لازم است دو مدل دیتا ارسال شود. ۱) کاراکترها، حروف و اعداد ۲) دستورالعملهای راهاندازی برای اینکه متن مورد نظر در چه حالتی نمایش داده شود.
این دیتاها از طریق خطوط دیتا (Data Lines) فرستاده میشوند. هر کاراکتر و دستور ۸ بیت دیتا را به خود اختصاص میدهد.
به منظور کاهش اتصالات ترجیح داده میشود این نمایشگر به صورت ۴ سیمه راه اندازی شود. یعنی فقط از خطوط D4 ، D5 ، D6 و D7 به منظور ارسال داده استفاده میشود. در داخل برنامه پایتون نیز ۴ بیت به طور همزمان برای ارسال کاراکترها و دستورالعمل ها استفاده میشود. طریقه اتصالات پینهای نمایشگر و رزبری پای در جدل زیر نشان داده شده است.
پین (Read/Write (RW مشخص میکند که نمایشگر ۱۶۰۲ در چه حالتی اعم از خواندن و یا نوشتن قرار بگیرد . ما در اینجا فقط از حالت نوشتن آن استفاده میکنیم. بنابراین این پین به زمین متصل شده تا نمایشگر در این مود قرار بگیرد. توجه داشته باشید که فقط میتوان نمایشگر را در حالت نوشتن قرار داد. میزان ولتاژ خروجی نمایشگر ۵ ولت است. در حالیکه میزان ولتاژ پینهای GPIO رزبری پای ۳٫۳ ولت است. در صورت قرار گرقتن در حالت خواندن ، دیتا با میزان ۵ ولت به رزبری پای ارسال شده و باعث آسیب دیدن آن میشود.
- پین (Register Select (RS پینی است که به نمایشگر میگوید در کدام قسمت حافظه اطلاعات ذخیره شود. اعمال مقدار ولتاژ ۳٫۳ ولت از طریق رزبری پای باعث ذخیرهی اطلاعات در رجیستر داده و با زمین کردن این پین (RS) اطلاعات در رجیستر دستور ذخیره میشود.
- پین (Enable (E قابلیت نوشتن دیتا در رجیستر در حالت آماده بودن فعال میکند.
- پین VO برای تنظیم کنتراست نمایشگر به کار گرفته میشود. این پین به یک پتانسیومتر متصل شده است.
- پین A پایهی مثبت بک لایت یا پین تنظیم نور پس زمینه بوده و به ۵ ولت متصل میشود.
- پین K پایهی منفی بک لایت یا پین تنظیم نور پس زمینه بوده و به صفر ولت نیز متصل میشود.
همانطور که در تصویر زیر مشاهده میکنید پین ورودی/ خروجی (GPIO) رزبری برای ارسال دیتا به صورت ۴ بیتی ، کنترل پین RS و فعالسازی نمایشگر (E) استفاده میشود.
دو پین آبی رنگ برای پایههای RS و E استفاده شده است. ۴ پین سبز رنگ برای ارسال دیتا ، پین مشکی رنگ زمین و پین قرمز رنگ میزان تغذیهی نمایشگر (۵v) است. در شکل زیر شماتیک اتصالات نشان داده شده است. در این میان از برد بورد به منظور انشعابات تغذیه و اتصال پتانسیومتر نیز استفاده شده است.
کد سورس پروژه
کد پایتون این پروژه در ادامه قرار داده شده است. از دو راه میتوانید آن را نصب کنید.
- سورس کد را در داخل ویرایشگر متنی کپی و با نام py ذخیره کنید.
- در صورتیکه رزبری پای به اینترنت متصل است میتوانید از وب سایت ما دانلود کنید. به این صورت که در داخل
(Terminal program (command line interface آدرس زیر را قرار داده سپس دانلود و نصب کنید.
# Partineh.com 2019
# Control an LCD 1602 display from Raspberry Pi with Python programming
#!/usr/bin/python
# Pinout of the LCD:
# ۱ : GND
# ۲ : ۵V power
# ۳ : Display contrast – Connect to middle pin potentiometer
# ۴ : RS (Register Select)
# ۵ : R/W (Read Write) – Ground this pin (important)
# ۶ : Enable or Strobe
# ۷ : Data Bit 0 – data pin 0, 1, 2, 3 are not used
# ۸ : Data Bit 1 –
# ۹ : Data Bit 2 –
# ۱۰: Data Bit 3 –
# ۱۱: Data Bit 4
# ۱۲: Data Bit 5
# ۱۳: Data Bit 6
# ۱۴: Data Bit 7
# ۱۵: LCD Backlight +5V
# ۱۶: LCD Backlight GND
import RPi.GPIO as GPIO
import time
# GPIO to LCD mapping
LCD_RS = 7 # Pi pin 26
LCD_E = 8 # Pi pin 24
LCD_D4 = 25 # Pi pin 22
LCD_D5 = 24 # Pi pin 18
LCD_D6 = 23 # Pi pin 16
LCD_D7 = 18 # Pi pin 12
# Device constants
LCD_CHR = True # Character mode
LCD_CMD = False # Command mode
LCD_CHARS = 16 # Characters per line (16 max)
LCD_LINE_1 = 0x80 # LCD memory location for 1st line
LCD_LINE_2 = 0xC0 # LCD memory location 2nd line
# Define main program code
def main():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
GPIO.setup(LCD_E, GPIO.OUT) # Set GPIO’s to output mode
GPIO.setup(LCD_RS, GPIO.OUT)
GPIO.setup(LCD_D4, GPIO.OUT)
GPIO.setup(LCD_D5, GPIO.OUT)
GPIO.setup(LCD_D6, GPIO.OUT)
GPIO.setup(LCD_D7, GPIO.OUT)
# Initialize display
lcd_init()
# Loop – send text and sleep 3 seconds between texts
# Change text to anything you wish, but must be 16 characters or less
while True:
lcd_text(“Hello World!”,LCD_LINE_1)
lcd_text(“”,LCD_LINE_2)
lcd_text(“Rasbperry Pi”,LCD_LINE_1)
lcd_text(“16×2 LCD Display”,LCD_LINE_2)
time.sleep(3) # 3 second delay
lcd_text(“ABCDEFGHIJKLMNOP”,LCD_LINE_1)
lcd_text(“1234567890123456”,LCD_LINE_2)
time.sleep(3) # 3 second delay
lcd_text(“I love my”,LCD_LINE_1)
lcd_text(“Raspberry Pi!”,LCD_LINE_2)
time.sleep(3)
lcd_text(“MBTechWorks.com”,LCD_LINE_1)
lcd_text(“For more R Pi”,LCD_LINE_2)
time.sleep(3)
# End of main program code
# Initialize and clear display
def lcd_init():
lcd_write(0x33,LCD_CMD) # Initialize
lcd_write(0x32,LCD_CMD) # Set to 4-bit mode
lcd_write(0x06,LCD_CMD) # Cursor move direction
lcd_write(0x0C,LCD_CMD) # Turn cursor off
lcd_write(0x28,LCD_CMD) # 2 line display
lcd_write(0x01,LCD_CMD) # Clear display
time.sleep(0.0005) # Delay to allow commands to process
def lcd_write(bits, mode):
# High bits
GPIO.output(LCD_RS, mode) # RS
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():
time.sleep(0.0005)
GPIO.output(LCD_E, True)
time.sleep(0.0005)
GPIO.output(LCD_E, False)
time.sleep(0.0005)
def lcd_text(message,line):
# Send text to display
message = message.ljust(LCD_CHARS,” “)
lcd_write(line, LCD_CMD)
for i in range(LCD_CHARS):
lcd_write(ord(message[i]),LCD_CHR)
#Begin program
try:
main()
except KeyboardInterrupt:
pass
finally:
lcd_write(0x01, LCD_CMD)
lcd_text(“So long!”,LCD_LINE_1)
lcd_text(“MBTechWorks.com”,LCD_LINE_2)
GPIO.cleanup()