다음 예제들은 DFRobot사의 LCD쉴드를 이용하여 실험을 진행하였다.

[그림 2] 실험에 사용된 LCD쉴드와 회로도

회로도를 보면 RS가 8번 핀, RW가 9번핀, 그리고 D4~D7번 핀이 4번에서 7번핀까지로 결선되어 있음을 알 수 있다. 따라서 LiquidCrystal 클래스의 인스턴스는 첫 번째 생성자를 이용하여 다음과 같이 생성하면 된다.

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

이제 예제들을 작성해 보도록 하겠다.

첫 번째 예제

 첫 번째 예제로 간단한 문자열을 출력하는 프로그램이다.


// 헤더파일을 인클루드 시킨다.
#include <LiquidCrystal.h>
// 회로도를 참조하여 LCD 객체를 생성/초기화시킨다.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
   // LED의 행수와 열수를 주어 표시를 시작한다.
   lcd.begin(16, 2);
   // LDC에 문자열을 표시한다.
   lcd.print("hello, world!");
}
void loop() {
   // 커서의 위치를 0열, 1행(두 번재 행)으로 설정한다.
   lcd.setCursor(0, 1);
   // 초를 표시한다.
   lcd.print(millis()/1000);
}

두 번째 예제

 LiquidCrystal 라이브러리에는 blink() 와 noBlink() 함수가 있는데 깜박이는 직사각형의 커서를 표시할 것인지 아닌지를 설정하는 함수이다. 다음 예제를 이것을 이용한 것이다.


#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
   lcd.begin(16, 2);
   lcd.print("hello, world!");
}
void loop() {
   lcd.noBlink();
   delay(3000);
   lcd.blink();
   delay(3000);
}

유사한 함수로 cursor() 함수와 noCursor()함수가 있는데 이것은 밑줄 모양의 커서를 표시할 것인가 말 것인가를 설정하는 것이다. 이 경우 밑줄 커서는 깜박이지 않는다.

세 번째 예제

 LiquidCrystal 라이브러리의 공용 멤버함수 중에는 display()함수와 noDisplay()함수가 있다. 함수 명에서 알 수 있듯이 화면에 표시를 할 것인지 말 것인지를 설정하는 것이다.


#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
   lcd.begin(16, 2);
   lcd.print("hello, world!");
}

void loop() {
   lcd.display();
   delay(3000);
   lcd.noDisplay();
   delay(3000);
}


위 예제어서 noDisplay()함수가 실행되면 화면에 표시된 문자열이 사라지지만 그 내용은 내부 메모리에 여전히 남아있다. 따라서 display()함수가 호출되면 되살아나는 것이다. 또한 이 함수들을 이용하면 화면 전체를 깜박이는 효과를 줄 수도 있다.

네 번째 예제

문자열이 표시되는 방향을 바꾸는 함수로 rightToLeft()함수와 leftToRight()함수가 있다. 다음 예제는 이것을 이용한 것이다.


#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int thisChar = 'a';
void setup() {
   lcd.begin(16, 2);
   lcd.cursor();
}
void loop() {
   // ‘m’ 이 표시되면 방향을 바꾼다.
   if (thisChar == 'm') {
       lcd.rightToLeft();
   }
   // 's'가 표시되면 방향을 다시 바꾼다.
   if (thisChar == 's') {
       lcd.leftToRight();
   }
   // 'z'가 표시된 후 처음 조건으로 다시 리셋한다.
   if (thisChar > 'z') {
       lcd.clear(); // 화면을 지운 후 커서를 처음 자리로
       thisChar = 'a';
   }
   lcd.write(thisChar);
   delay(1000);
   thisChar++;
}


다섯 번째 예제

 이번에는 터미널에 입력한 문자를 LCD에 표시하는 프로그램을 작성해 보자.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
   lcd.begin(16, 2);
   Serial.begin(9600);
}
void loop() {
   // 문자가 전송되면
   if (Serial.available()) {
       // 전체 문자열이 들어올 때까지 잠시 기다린다.
       delay(100);
       lcd.clear();
       // 전송된 모든 문자를 표시한다.
       while (Serial.available() > 0) {
           lcd.write(Serial.read());
       }
   }
}


여섯 번째 예제

 화면의 내용을 스크롤(scroll)하는 예제이다.


#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
   lcd.begin(16, 2);
   lcd.print("hello, world!");
   delay(1000);
}
void loop() {
   // 왼쪽으로 스크롤
   for (int cnt = 0; cnt < 13; cnt++) {
       lcd.scrollDisplayLeft();
       delay(150);
   }
   // 오른쪽으로 스크롤
   for (int cnt = 0; cnt < 29; cnt++) {
       lcd.scrollDisplayRight();
       delay(150);
   }
   // 다시 왼쪽으로 스크롤하여 제자리로
   for (int cnt = 0; cnt < 16; cnt++) {
       lcd.scrollDisplayLeft();
       delay(150);
   }
   delay(1000);
}


이 예제에서는 scrollDisplayLeft() 함수와 scrollDisplayRight() 함수를 이용하여 수동으로 이동시켰다. 반면 autoScroll()함수를 사용하면 문자가 표시되기 전에 왼쪽으로 자동으로 이동이 된다.




Posted by 살레시오
,

 가전제품이나 전자 장치에서 간단한 정보를 표시하는데 많이 사용되는 것이 바로 액정 표시기 (liquid crystal display, LCD)이다. 크게 문자만을 표시할 수 있는 문자형과 선이나 도형 등 그래픽을 그릴 수 있는 그래픽형으로 나뉜다.

[그림 1] LCD 장치의 예

아두이노의 LiquidCrystal 라이브러리는 텍스트 액정(liquid crystal) 표시장치를 구동하기 위한 라이브러리이다. 이 라이브러리를 이용하기 위해서는 다음과 같이 프로그램 서두에 해당 헤더파일을 인클루드시켜야 한다.


#include <LiquidCrystal.h>

이 헤더파일에는 LiquidCrystal 이라는 클래스가 정의되어 있으며 다음과 같은 공용(public) 멤버함수들이 정의되어 있어서 쉽게 사용할 수 있다.

  • 생성자 : LCD 모듈과 아두이노의 연결 방식에 따라서 생성자를 사용하면 된다. 다음과 같은 네 가지 함수가 오버로드되어 있다.

       ❶ LiquidCrystal(rs, enable, d4, d5, d6, d7)

       ❷ LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)

       ❸ LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)

       ❹ LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

보통은 핀수를 가장 적게 차지하는 ❶번 방식이 많이 사용된다.  멤버함수는 다음과 같다.


[표 1] LiquidCrystal 클래스의 멤버 함수들

멤버 함수

기능

void begin(row, col)

LCD를 초기화 한다.

void clear()

화면을 지운 후 커서를 처음 자리로 옮긴다.

void home()

화면은 그대로 나둔채로 처서만 (0,0)자리로 옮긴다.

setCursor(col, row)

커서를 (col, row)자리로 옮긴다.

byte write(data)

한 문자를 출력한다.

print(data, BASE)

문자열이나 변수 값을 출력한다.

createChar()

사용자 (그림)문자를 생성한다. (8개까지 가능함)

void cursor()

(밑줄)커서를 표시한다.

void noCursor()

커서를 표시하지 않는다

void blink()

깜박이는 커서를 표시한다.

void noBlink()

커서를 표시하지 않는다.

void display()

내용을 표시한다.

void noDisplay()

내용을 표시하지 않는다.(메모리에 내용은 남아 있음)

scrollDisplayLeft()

표시된 내용을 왼쪽으로 한 칸 이동한다.(회전)

scrollDisplayRight()

표시된 내용을 오른쪽으로 한 칸 이동한다.(회전)

void autoscroll()

기존 내용을 좌로 이동시킨 후 현재 내용을 표시.

noAutoscroll()


void leftToRight()

문자 표시 방향을 왼쪽에서 오른쪽으로 설정한다.

void rightToLeft()

문자 표시 방향을 오른쪽에서 왼쪽으로 설정한다.

여기서 write()함수는 입력을 아스키(ASCII)값으로 받으며 print()함수는 문자열이나 상수(변수)값을 받는 것에 유의하자.



Posted by 살레시오
,