2017 멀티캠퍼스/Raspberry Pi

#14 라즈베리파이 CLCD

꿈꾸는어린이 2018. 1. 30. 23:43

//

일시 : 2018.01.15 11:20AM ~

내용 : GPIO Character LCD

​ ★★★FND에 온,습도 표시하는 거 해보기

//

CLCD(Character LCD)

  • 액정을 이용해 화소에 도달하는 빛을 선택적으로 투과,차단하여 문자를 표시

  • 2행 16열, 5 X 8 dot로 하나의 문자를 표시

  • 8bit / 4bit , 한 글자가 8bit이기 때문에 4bit를 이용할 시에 두 번 보내야함.

  • GPIO핀 7개 할당. 3개는 제어신호로 사용, 4개의 핀을 통해 데이터나 명령 전송하여 CPU와 통신

  • 3.3V -> 5V로 전환해주기 위해 칩을 이용

  • RS핀 : 명령(rs=0)인지 데이터(rs=1)인지 구분을 해주는 핀, 명령일 때는 LOW, 데이터일 때는 HIGH로

    ​ rs = 0 : 명령, rs = 1 : 데이터

  • RW핀 : High일 때 read, Peri 0 에서는 쓰기 전용으로 고정되어 사용x

​ rw = 0 : 쓰기, rw = 1 : 읽기

  • CG ROM : 아스키코드에 해당하는 문자들을 미리 저장

    CG RAM : 아스키코드에 저장되어 있지 않은 (사용자가 정의하는) 문자

  • IR(instruction register) : LCD on/off, clear, function set (지시사항) 등을 설정하는 레지스터.

    DR(data register) : LCD 모듈에문자를 나타내기 위한 데이터 값이 들어가는 레지스터.

  • DD RAM : 데이처가 들어오면 DD RAM으로 전달하여 LCD에 전달


  • 주소 버스는 없고 데이터 버스만 존재하여 데이터 버스에 제어 명령과 데이터 정보가 함께 전달 -> rs로 데이터 버스에 실린 정보가 제어 명령인지 데이터인지 구분해야함

  • CLCD 미리 정의된 명령은 실행 시간이 다르므로 주의한다.

  • LCD_D4 ~ LCD_D7 명령의 상위 4bit를 전달하고 다시 하위 4bit를 전달




  #!/usr/bin/python

import RPi.GPIO as GPIO
import time

# Define GPIO to LCD mapping
LCD_RS = 23
LCD_E = 26
LCD_D4 = 17
LCD_D5 = 18
LCD_D6 = 27
LCD_D7 = 22

# Define some device constants
LCD_WIDTH = 16    # 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

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

def main():
 
 GPIO.setwarnings(False)
 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

 # Initialise display
 lcd_init()

 while True:
   # Send some test
   lcd_string("Rasbperry Pi",LCD_LINE_1)
   lcd_string("16x2 LCD 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

def lcd_init():
 # Initialise display
 lcd_byte(0x33,LCD_CMD) # 110011 Initialise 4비트 인터페이스를 위한 특별한 명령 두개
 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
 #       bits = 00000110 false
 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):
 # Send string to display
 message = message.ljust(LCD_WIDTH," ")  ##문자열왼쪽정렬
 lcd_byte(line, LCD_CMD)
 for i in range(LCD_WIDTH):
   lcd_byte(ord(message[i]),LCD_CHR)

if __name__ == '__main__':
 try:
   main()
 except KeyboardInterrupt:
   pass
 finally:
   lcd_byte(0x01, LCD_CMD)
   lcd_string("Goodbye!",LCD_LINE_1)
   GPIO.cleanup()