임베디드시스템개론 : Arduino 활용 Lecture #5: Text LCD 출력하기 2012. 4. 6 by 김영주
강의목차 Text LCD 장치개요 간단한 Text LCD 출력테스트 Text LCD 인터페이스신호줄이기 아두이노라이브러리개요 LiquidCrystal 라이브러리 2
Text LCD 출력장치 (1) Text LCD 출력장치 ASCII 코드를입력받아영문자를출력하는장치주로 16x2 LCD 사용 -16문자 x 2 줄출력전력소모가적어임베디드시스템에서많이사용 3
Text LCD 출력장치 (2) Text LCD 내부모듈구조 LCD panel과제어기 (controller) 가하나의모듈로구성동작방식 데이터버스를통해제어기에명령과데이터를전송 제어기는명령에따라문자코드에해당하는글씨체를 LCD panel로출력 제어기는 LCD panel이계속출력상태를유지하도록제어 (Driving) 4
Text LCD 출력장치 (3) HD44780 의내부블록도 5
Text LCD 출력장치 (4) 내부레지스터 IR (Instruction Register) D.D.RAM과 C.G.RAM에대한주소정보또는클리어, 커서이동, 글자 on/off 등 LCD 제어에대한명령코드를입력받는 8-bit 레지스터 RS(Register Select) 신호가 L 일때에선택 DR(Data Register) D.D.RAM과 C.G.RAM에데이터를읽거나쓸때사용되는 8-bit 레지스터 RS 신호가 H 일때에선택 BF(Busy Flag) 연속적으로 LCD 모듈제어명령이입력될때에 LCD 모듈이처리할수있는지를나타내는상태표시 1-bit 플래그 IR 레지스터읽기를통해접근가능 AC(Address Counter) D.D.RAM과 C.G.RAM 의주소를지정할때사용현재문자가출력될위치 (cursor) 를의미함 6
Text LCD 출력장치 (5) 내부메모리 D.D.RAM(Display Data RAM) 8비트문자코드의디스플레이데이터를저장하는메모리최대용량은 80x8비트로 80문자를저장가능행별로 40 문자의데이터를저장 C.G.ROM(Character Generator ROM) ASCII 문자의글씨체정보를저장하고있는 ROM C.G.RAM(Character Generator RAM) 사용자정의글씨체를다운로드하여저장하는 RAM ASCII 문자이외의사용자정의문자를출력할때에사용 7
Text LCD 출력장치 (6) 외부인터페이스신호사양 8
Text LCD 출력장치 (7) Text LCD 동작명령과인터페이스신호 9
Text LCD 출력장치 (8) Text LCD 동작명령 10
Text LCD 출력장치 (9) Text LCD 문자출력 출력위치를고려하여 D.D.RAM의원하는위치를지정하고 (IR 레지스터 ), 출력할문자의 ASCII 코드를전송한다 (DR 레지스터 ). D.D.RAM은출력할문자들의코드값을저장하는버퍼역할을수행 최대 80개의문자를저장 (80 bytes), 라인별로 40 bytes씩분리하여할당예 : 16문자 2라인 LCD의경우 열위치 -> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 행 -> 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 2 행 -> 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F AC 레지스터는현재문자를출력할 D.D.RAM 주소를저장, 자동증가 문자출력예 : 11 D.D.RAM 의주소 (Hex) 1행 16열에 A 출력 : 0x81 IR, 0x41 DR 2행 1열에 1 출력 : 0xC0 IR, 0x31 DR 1행 4열부터 abc 출력 : 0x83 IR, 0x61 DR, 0x62 DR, 0x63 DR
Text LCD 출력장치 (10) 사용자정의문자출력하기 1. 사용자정의문자패턴의크기 5x7 8 바이트정보로표현 2. IR 레지스터에 C.G.RAM 주소설정 3. DR 레지스터에문자패턴정보 1 바이트설정 4. 8 바이트정보입력이완료될때까지 2, 3 번과정반복 5. D.D.RAM에출력하고자하는사용자정의문자의코드 (0x00~ 0x07) 을설정 6. 사용자정의문자출력 12
Text LCD 출력장치 (11) Text LCD 의초기화과정 Function Set( 이진수 :001x xx00). Display ON/OFF Control(0000 1xxx) Setting. Entry Mode Set(0000 01xx). D.D.RAM 주소 Setting. 문자데이터를연속으로보낸다 13
Text LCD 출력장치 (12) Text LCD 제어신호타이밍 다음동작명령을실행하려면 BF(Busy Flag) 가 0 이될때까지대기 데이터 I/O 를위한파형형태 : E 신호스트로브 HIGH 구간은 0.5[usec] 이상유지 1 2 4 3 14
Text LCD 간단출력테스트 (1) 실험개요 Arduino-Mega 에 Text LCD 장치를연결하여테스트문장을출력한다. 사전요구사항 Text LCD 장치의인터페이스신호규격을정확히이해한다. Text LCD 장치에서의문자출력방법을이해한다. Text LCD 장치의제어신호의타이밍도를이해한다. Arduino-Mega와 Text LCD 장치의연결방법을정한다. 15
Text LCD 간단출력테스트 (2) 회로도및회로구성 회로도 : 16
Text LCD 간단출력테스트 (3) 회로도및회로구성 회로구성 : 17
Text LCD 간단출력테스트 (4) 아두이노프로그램 : Hello, World! 출력프로그램 uint8_t _rs_pin; // LOW: command. HIGH: character. uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD. uint8_t _enable_pin; // activated by a HIGH pulse. uint8_t _data_pins[8]; void lcd_init(int rs, int rw, int enable, int* data, int data_cnt) { int i; _rs_pin = rs; _rw_pin = rw; _enable_pin = enable; for (i=0; i<data_cnt; i++) _data_pins[i] = data[i]; while (i < 8) { _data_pins[i] = 0; i++; pinmode(_rs_pin, OUTPUT); pinmode(_rw_pin, OUTPUT); pinmode(_enable_pin, OUTPUT); 18 // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! // according to datasheet, we need at least 40ms after power rises above 2.7V // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 delaymicroseconds(50000);
Text LCD 간단출력테스트 (5) 아두이노프로그램 ( 계속 ) 19 // Now we pull both RS and R/W low to begin commands digitalwrite(_rs_pin, LOW); digitalwrite(_rw_pin, LOW); digitalwrite(_enable_pin, LOW); // Send function set command sequence lcd_command(0x20 0x10 0x08); delaymicroseconds(4500); // wait more than 4.1ms // second try lcd_command(0x20 0x10 0x08); delaymicroseconds(150); // third go lcd_command(0x20 0x10 0x08); // finally, set # lines, font size, etc. lcd_command(0x20 0x10 0x08); // turn the display on with no cursor or blinking default lcd_command(0x08 0x04); // clear it off lcd_command(0x01); // clear display, set cursor position to zero delaymicroseconds(2000); // this command takes a long time!
Text LCD 간단출력테스트 (6) 아두이노프로그램 ( 계속 ) // Initialize to default text direction (for romance languages) lcd_command(0x04 0x02); delaymicroseconds(2000); // this command takes a long time! void lcd_print(char *str) { while (*str!= NULL) { lcd_data(*str); str++; void lcd_command(uint8_t value) { lcd_send(value, LOW); void lcd_data(uint8_t value) { lcd_send(value, HIGH); void lcd_send(uint8_t value, uint8_t mode) { digitalwrite(_rs_pin, mode); digitalwrite(_rw_pin, LOW); 20 lcd_write8bits(value);
Text LCD 간단출력테스트 (7) 아두이노프로그램 ( 계속 ) void lcd_pulseenable(void) { digitalwrite(_enable_pin, LOW); delaymicroseconds(1); digitalwrite(_enable_pin, HIGH); delaymicroseconds(1); // enable pulse must be >450ns digitalwrite(_enable_pin, LOW); delaymicroseconds(100); // commands need > 37us to settle void lcd_write4bits(uint8_t value) { for (int i = 0; i < 4; i++) { pinmode(_data_pins[i], OUTPUT); digitalwrite(_data_pins[i], (value >> i) & 0x01); lcd_pulseenable(); void lcd_write8bits(uint8_t value) { for (int i = 0; i < 8; i++) { pinmode(_data_pins[i], OUTPUT); digitalwrite(_data_pins[i], (value >> i) & 0x01); 21 lcd_pulseenable();
Text LCD 간단출력테스트 (8) 아두이노프로그램 ( 계속 ) void setup() { int d[8] = { 26, 27, 28, 29, 30, 31, 32, 33 ; lcd_init(22, 23, 24, d, 8); lcd_print("hello, World!..."); void loop() { // display-on cursor-on blink-off lcd_command(0x08 0x04 0x02); delay(5000); // display-on cursor-on blink-on lcd_command(0x08 0x04 0x02 0x01); delay(5000); // display-on cursor-off blink-off lcd_command(0x08 0x04); delay(5000); 22
Text LCD 간단출력테스트 (9) 실험결과 Text LCD 장치에출력되는내용이좌또는우로이동 ( 흐름 ) 하도록수정하여보아라. 23
Text LCD 간단출력테스트 (10) 실험개선 Text LCD 장치의인터페이스신호를줄이는방법은? 4-bit data 통신모드사용출력전용동작지정 24
Text LCD 의 Nibble Interface Mode (1) 실험개요 Text LCD 장치의 Nibble 데이터인터페이스모드를사용하여인터페이스신호수를줄이도록한다. 사전요구사항 25 회로구성은앞의실험과동일하나인터페이스신호연결은다음과같은사항이바뀐다. Text LCD Arduino Mega --------------------------------------------------------------------- RS 22 pin RW GND (Write Only) Enable 24 pin d4 30 pin d5 31 pin d6 32 pin d7 33 pin
Text LCD 의 Nibble Interface Mode (2) 사전요구사항 ( 계속 ) Text LCD 장치는데이터인터페이스모드에따라초기화과정이달라진다. 데이터인터페이스모드가 Nibble 모드인경우, 명령이나데이터를 4-bit 씩 2 번에나누어전송하여야한다. 26
Text LCD 의 Nibble Interface Mode (3) 아두이노프로그램 : Hello, World! 출력프로그램수정 uint8_t _rs_pin; // LOW: command. HIGH: character. uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD. uint8_t _enable_pin; // activated by a HIGH pulse. uint8_t _data_pins[8]; #define BYTE_MODE 0 #define NIBBLE_MODE 1 uint8_t _bit_if_mode = BYTE_MODE; void lcd_init(int rs, int rw, int enable, int* data, int data_cnt) { int i; uint8_t cmd; _rs_pin = rs; _rw_pin = rw; _enable_pin = enable; for (i=0; i<data_cnt; i++) _data_pins[i] = data[i]; while (i < 8) { _data_pins[i] = 0; i++; 27 if (data_cnt < 8) _bit_if_mode = NIBBLE_MODE;
Text LCD 의 Nibble Interface Mode (4) 아두이노프로그램 ( 계속 ) pinmode(_rs_pin, OUTPUT); // pinmode(_rw_pin, OUTPUT); pinmode(_enable_pin, OUTPUT); // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! // according to datasheet, we need at least 40ms after power rises above 2.7V // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 delaymicroseconds(50000); // Now we pull both RS and R/W low to begin commands digitalwrite(_rs_pin, LOW); // digitalwrite(_rw_pin, LOW); digitalwrite(_enable_pin, LOW); if (_bit_if_mode == NIBBLE_MODE) { // we start in 8bit mode, try to set 4 bit mode lcd_write4bits(0x03); delaymicroseconds(4500); // wait min 4.1ms // second try lcd_write4bits(0x03); delaymicroseconds(4500); // wait min 4.1ms 28 // third go! lcd_write4bits(0x03); delaymicroseconds(150);
Text LCD 의 Nibble Interface Mode (5) 아두이노프로그램 ( 계속 ) // finally, set to 4-bit interface lcd_write4bits(0x02); cmd = 0x20 0x08; else { // Send function set command sequence cmd = 0x20; // function set command cmd = (0x10 0x08); // 8bit I/F & 2-line & 5x8 font lcd_command(cmd); delaymicroseconds(4500); // wait more than 4.1ms // second try lcd_command(cmd); delaymicroseconds(150); // third go lcd_command(cmd); 29 // finally, set # lines, font size, etc. lcd_command(cmd); : : :
Text LCD 의 Nibble Interface Mode (6) 아두이노프로그램 ( 계속 ) : : void lcd_send(uint8_t value, uint8_t mode) { digitalwrite(_rs_pin, mode); // digitalwrite(_rw_pin, LOW); if (_bit_if_mode == BYTE_MODE) { lcd_write8bits(value); else { lcd_write4bits(value>>4); lcd_write4bits(value); : : 30
Text LCD 의 Nibble Interface Mode (7) 아두이노프로그램 ( 계속 ) : : : void setup() { // int d1[8] = { 26, 27, 28, 29, 30, 31, 32, 33 ; int d2[4] = { 30, 31, 32, 33 ; // lcd_init(22, 23, 24, d1, 8); lcd_init(22, 23, 24, d2, 4); lcd_print("hello, World!..."); : : 31
Text LCD 의 Nibble Interface Mode (8) 실험결과및개선 출력속도에는차이가있는가? 32
아두이노라이브러리 (1) 아두이노라이브러리 33 빠른프로토타이핑 (Prototyping) 을지원하기위해일반적으로많이사용하는장치에대한인터페이스프로그램을라이브러리로제공 http://arduino.cc/en/reference/libraries 아두이노표준라이브러리 : EEPROM - reading and writing to "permanent" storage Ethernet - for connecting to the internet using the Arduino Ethernet Shield Firmata - for communicating with applications on the computer using a standard serial protocol. LiquidCrystal - for controlling liquid crystal displays (LCDs) SD - for reading and writing SD cards Servo - for controlling servo motors SPI - for communicating with devices using the Serial Peripheral Interface (SPI) Bus SoftwareSerial - for serial communication on any digital pins Stepper - for controlling stepper motors Wire - Two Wire Interface (TWI/I2C) for sending and receiving data over a net of devices or sensors.
아두이노라이브러리 (2) 아두이노라이브러리 ( 계속 ) 라이브러리는예제프로그램을같이제공하여프로그램작성시에참고하도록함. 표준라이브러리이외의추가적인라이브러리는아두이노사이트에서확인할수있으며, 라이브러리제공사이트에다운받아설치하여사용할수있다. 34
아두이노라이브러리 (3) LyquidCrystal 라이브러리 Text LCD 장치를지원하는아두이노표준라이브러리 Hitachi HD44780 (or a compatible) chipset 장착 LCD 제어 4- or 8-bit 데이터인터페이스모드지원 주요함수 : LiquidCrystal(), begin(), clear(), home(), setcursor(), write(), print(), cursor(), nocursor(), blink(), noblink(), display(), nodisplay(), scrolldisplayleft(), scrolldisplayright(), autoscroll(), noautoscroll(), lefttoright(), righttoleft(), createchar() 35
아두이노라이브러리 (4) LyquidCrystal 라이브러리예제 : HelloWorld 36 // include the library code: #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("hello, world!"); void loop() { // set the cursor to column 0, line 1 // (note: line 1 is the second row, since counting begins with 0): lcd.setcursor(0, 1); // print the number of seconds since reset: lcd.print(millis()/1000);
아두이노라이브러리 (5) LyquidCrystal 라이브러리활용 LC 라이브러리에서제공하는다양한예제프로그램을테스트하여사용법을확인하기바람. 활용예 : http://tronixstuff.wordpress.com/2011/01/08/tutorial-arduino-andmonochrome-lcds/ 37
과제물 #2 과제내용 1. 조도센서입력를받아현재의조도크기를 Text LCD 장치에출력하는프로그램을작성하여라. 2. 학기말과제에대한제안서를제출하여라 A. 학기말과제아이템내용 B. 구현일정 C. 팀원별역할분담 제출물 회로도, 프로그램소스, 실행예 ( 사진 ) 학기말과제제안서 5 분간발표 제출일 차주수업시간 38