개요
16*2 LCD는 직접 아두이노와 연결해 제어할 수도 있지만 I2C를 이용하는 쪽이 간결하고 핀도 적게 사용한다.
I2C 제어에는 SDA(Serial Data), SCL(Serial Clock) 핀을 사용한다.
한글은 사용할 수 없으며, 모듈에 따라 정규 아스키 코드 외에 약간의 추가 문자(보통 일본어 표기용 가나 문자가 보인다)가 있다.
문자 하나는 5*8도트로 이루어져 있다 (즉, LCD 전체의 해상도는 80*16 도트)
결선도
HELLO WORLD 출력 코드
#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { // put your setup code here, to run once: lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Hello World!"); }
LiquidCrystal_I2C.h : i2c lcd 제어 라이브러리
LiquidCrystal_I2C 클래스 : i2c 주소, 컬럼 수, 라인 수
※이번에 사용한 모듈의 i2c 주소는 0x27이지만 모듈에 따라 다르다. 0x3F라던가.
setCursor(x, y) : 문자를 출력할 위치를 지정 (basic을 배운 사람은 지금 많지 않겠지만, basic의 locate 명령과 같다)
print(출력할 문자열)
출력된 모습
사용자 정의 문자 (Custom Character)
16*2 LCD는 최대 8개까지의 사용자 정의 문자를 사용할 수 있다.
비트맵 디자인이 익숙하지 않은 사람은 아래 페이지를 이용하면 편리하다.
Custom Character Generator for HD44780 LCD Modules
커스텀 문자 정의/출력 코드
#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); byte smile[8] = { 0b00000, 0b00000, 0b01010, 0b01010, 0b00000, 0b10001, 0b01110, 0b00000 }; byte heart[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 }; byte fighter[8] = { 0b00100, 0b01110, 0b00100, 0b10101, 0b10101, 0b11111, 0b11111, 0b10101 }; byte loderunner[8] = { 0b11000, 0b11100, 0b11100, 0b01000, 0b00111, 0b10100, 0b01011, 0b01000 }; void setup() { // put your setup code here, to run once: lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Custom Character"); lcd.createChar(0, smile); lcd.createChar(1, heart); lcd.createChar(2, fighter); lcd.createChar(3, loderunner); for(int i=0;i<4;i++){ lcd.setCursor(i*2,1); lcd.write(byte(i)); } }
createChar(문자코드, 비트맵배열)
write(문자코드)
※문자코드는 원래 아스키코드가 들어가는데, 사용자 정의 캐릭터는 0~7에 할당된다.
일반적인 아스키코드를 지정해서 createChar를 해도 변화는 없다.
실행 결과
제한적이지만 애니메이션을 만들 수도 있다. 단, 보통 이 LCD 모듈은 잔상이 매우 심하고, 오랜 시간 빠른 쓰기를 계속하면 오동작을 일으킨다. 너무 과도한 출력을 하지 말자..
커스텀 문자 애니메이션 코드
#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); byte loderunner[8] = { 0b11000, 0b11100, 0b11100, 0b01000, 0b00111, 0b10100, 0b01011, 0b01000 }; byte loderunner2[8] = { 0b11000, 0b11100, 0b11100, 0b01000, 0b00100, 0b00110, 0b01100, 0b00100 }; byte loderunner3[8] = { 0b01100, 0b01110, 0b01110, 0b00100, 0b01110, 0b00110, 0b01011, 0b01000 }; void setup() { // put your setup code here, to run once: lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Custom Character"); lcd.createChar(0, loderunner); lcd.createChar(1, loderunner2); lcd.createChar(2, loderunner3); } void loop() { // put your main code here, to run repeatedly: for(int i=0;i<3;i++){ lcd.setCursor(0, 1); lcd.write(byte(i)); delay(300); } }실행 결과
댓글 없음:
댓글 쓰기