일시 : 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()
'2017 멀티캠퍼스 > Raspberry Pi' 카테고리의 다른 글
#15 라즈베라파이 SPI 통신 (0) | 2018.02.01 |
---|---|
#13 라즈베리파이 FND (0) | 2018.01.30 |
#12 라즈베리파이 온습도 센서 (0) | 2018.01.30 |
#11 라즈베리파이 조도센서 (0) | 2018.01.30 |
#10 라즈베리파이 Ultrasonic (초음파 센서) (0) | 2018.01.30 |