컴퓨터정보공학과 권춘우 최신인터넷기술 - LCD 디스플레이
목차 LCD 디스플레이 패러럴 LCD 디스플레이 시리얼 LCD 디스플레이
LCD(Liquid Crystal Display, p107)
LCD(Liquid Crystal Display) □ 손목시계, TV, 핸드폰 등 우리 생활의 많은 부분에서 사용 됨 □ 그래픽 LCD, TFT LCD, Character LCD 등 종류가 다양 □ 아두이노 Character LCD 지원 □ 시리얼 방식 □ 패러럴 방식
LCD Controller(HD44780) Hitachi HD44780 LCD controller data sheet download (click!) alphanumeric dot matrix liquid crystal display (LCD) controller(Hitachi 개발) Max addressing : 80 chars : 80 x 8 bit display RAM MPU interface : 4-bit or 8-bit Size : 8 characters x 1 row, 8x2, 16x1, 16×2, 20×2, 20×4 등 가능 Custom size : (32, 40, 80) characters x (1, 2, 4 or 8 lines) ASCII characters, Japanese Kana characters, some symbols : 240 character fonts 208 character fonts (5x8 dot), 32 character fonts (5x10 dot) Backlight 지원 HD44780U
LCD Controller(HD44780) 사용 Interface MPU - LCD controller - LCD(Liquid Crystal Display) LCD MPU / Arduino / etc. HD44780U LCD LCD
LCD Controller(HD44780) 사용 MPU - LCD controller Interface
HD44780U Block Diagram & Pin Functions
HD44780U - 기능 설명 RS(Register Selector) : IR(0), DR(1) 선택 IR(instruction register) : 명령어 코드, DDRAM/CGRAM 주소정보 저장 DR(data register) : DDRAM/CGRAM 저장/읽은 데이터 일시 저장 BF(Busy Flag) : chip 내부 상태가 Busy 여부 상태 의미 BF : RS=0 & 𝑅/ 𝑊 =1 상태에서 읽은 데이터의 DB7이 BF 상태 값 BF=1 : HD44780U가 Internal operation mode 상태로 다음 명령어가 받아 들여지지 않음 BF=0 : 다음 명령어 가능 (프로그램에서 받드시 BF=0임을 확인한 후 명령어 수행) AC(Address Counter) : DDRAM/CGRAM의 주소를 지정 명령어 주소가 IR에 저장되면 IR 값이 AC로 보내짐 DDRAM/CGRAM의 선택도 동시에 일어나야 함
HD44780U – DDRAM DDRAM(Display Data RAM) 1-line Display 경우 (N=0) 8-bit 문자코드로 된 Display 데이터를 저장 저장 용량 : 80 character or 80 x 8 bits Display로 사용되지 않은 경우 일반 데이터 RAM으로 사용 가능 DDRAM 주소는 ADD는 AC(address counter)에 16값으로 설정 1-line Display 경우 (N=0) DDRAM Address 1-Line Display 1-Line x 8-Character Display
HD44780U – DDRAM 2-line Display 경우 (N=1) : 8-char x 2-line 표시 경우 (Case 1) 2-Line Display 2-Line x 8-Character Display
HD44780U – DDRAM 2-line Display 경우 (N=1) : 8-char x 2-line 표시 경우(Case 2) 2-Line Display 2-Line x 8-Character Display
HD44780U – CGROM/CGRAM CGROM(Character Generator ROM) 240 characters patterns(8-bit character code) 208 5x8 dot character patterns 32 5x10 dot character patterns User-defined character patterns by mask-grogrammed ROM Character Pattern(5x8) 예 A11-A4 : character code A3-A0 : character patterns의 line position O4-O0 : character pattern data O5-O7 : ‘0’ Line 9 – line 15 : ‘0’ Character Pattern(5x10) 예 Line 11 – line 15 : ‘0’
HD44780U – CGROM/CGRAM Character Codes & Character Patterns (ROM Code : A00) CGRAM (Character Generator RAM) 사용자가 저장하여 사용할 수 있는 character patterns Character Codes Table의 첫째 열에 해당하는 코드 Character code : 0000xxxx / 0001xxxx 8 5x8 dot character patterns 4 5x10 dot character patterns
HD44780 Instruction(명령어) Instruction Outline 명령어 개요 MPU의 HD44780 제어 : IR(Instruction Register)와 DR(Data Register) 만 사용 MPU의 HD44780 내부 동작을 결정하는 신호(signal) RS(Register Selection), 𝑅/ 𝑊 (read/write), DB0-DB7(data bus) 4개 구분 명령어 HD44780 기능 관련 : display format, data length 등 내부 RAM 주소 설정 내부 RAM에 데이터 전달 : 표시할 글자를 RAM에 전달하는 것(명령어 대부분) 기타 기능 처리 내부 RAM 주소는 data write 후 자동으로 1 증가/감소 : 프로그래밍 부담 감소 명령어 수행 경우 BF(Busy Flag)가 ‘1’로 설정되기 때문에, MPU는 다른 명령어를 보내기 전에 BF=0 임을 확인하여야 함
HD44780 Instruction(명령어) Instructions
HD44780 Instruction(명령어) Instructions (cont)
HD44780 명령어 설명 Clear Display Return Home Entry Mode Set Display On/Off Control Cursor/Display Shift Function Set Set CGRAM Address Set DDRAM Address Read Busy Flag and Address Write Data to CG or DDRAM Read Data from CG/DDRAM
HD44780 명령어 설명 Instruction Codes
HD44780 명령어 설명 Instruction Codes
HD44780 Instruction-Display 연관성 8-bit operation, 8-digit x 1-line display with internal reset The HD44780U functions must be set by the function set instruction prior to the display. Since the display data RAM can store data for 80 characters, the RAM can be used for displays such as for advertising when combined with the display shift operation. Since the display shift operation changes only the display position with DDRAM contents unchanged, the first display data entered into DDRAM can be output when the return home operation is performed. 4-bit operation, 8-digit x 1-line display with internal reset The program must set all functions prior to the 4-bit operation. When the power is turned on, 8-bit operation is automatically selected and the first write is performed as an 8-bit operation. Since DB0 to DB3 are not connected, a rewrite is then required. However, since one operation is completed in two accesses for 4-bit operation, a rewrite is needed to set the functions (see Table 12). Thus, DB4 to DB7 of the function set instruction is written twice. nstruction.
HD44780 Instruction-Display 연관성 8-bit operation, 8-digit x 2-line display For a 2-line display, the cursor automatically moves from the first to the second line after the 40th digit of the first line has been written. Thus, if there are only 8 characters in the first line, the DDRAM address must be again set after the 8th character is completed. Note that the display shift operation is performed for the first and second lines. In the example of Table 13, the display shift is performed when the cursor is on the second line. However, if the shift operation is performed when the cursor is on the first line, both the first and second lines move together. If the shift is repeated, the display of the second line will not move to the first line. The same display will only shift within its own line for the number of times the shift is repeated. Note: When using the internal reset, the electrical characteristics in the Power Supply Conditions Using Internal Reset Circuit table must be satisfied. If not, the HD44780U must be initialized by instructions. See the section, Initializing by Instruction.
HD44780 Instruction-Display 프로그램 예시 8-Bit Operation, 8-Digit x 1-Line Display Example with Internal Reset
HD44780 Instruction-Display 프로그램 예시 8-Bit Operation, 8-Digit x 1-Line Display Example with Internal Reset (cont)
HD44780 Instruction-Display 프로그램 예시 8-Bit Operation, 8-Digit x 1-Line Display Example with Internal Reset (cont)
HD44780 Instruction-Display 프로그램 예시 4-Bit Operation, 8-Digit x 1-Line Display Example with Internal Reset
HD44780 Instruction-Display 프로그램 예시 8-Bit Operation, 8-Digit x 2-Line Display Example with Internal Reset
HD44780 Instruction-Display 프로그램 예시 8-Bit Operation, 8-Digit x 2-Line Display Example with Internal Reset (cont)
HD44780 초기화(Initializing) 8-bit Interface
HD44780 초기화(Initializing) 4-bit Interface
LCD(Liquid Crystal Display 패러럴 LCD 디스플레이(4-bit 모드) (p108) 패러럴 LCD 디스플레이(8-bit 모드) (p113)
패러럴 LCD 디스플레이(4-bit 모드) (p108) Character LCD 모듈 : 16x1 LCD Module Hitachi HD44780 호환 컨트롤러 사용 데이터 처리 : 4-bit bus 회로 측면에서 배선이 용이 LCD 관련 프로그래밍 라이브러리 : Liquid Crystal Library #include <LiquidCrystal.h> 아두이노 IDE 포함
패러럴 LCD 디스플레이(4bit) - 배선도 1 3 5 7 9 11 13 15
패러럴 LCD 디스플레이(4bit) - 회로도(Schematic)
패러럴 LCD 디스플레이(4bit) – 스케치(1) Hello world // 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() { // setup the LCD’s number of columns and rows; lcd.begin(8,2); } void loop() lcd.setCursor(0,0); // print a message to the LCD lcd.print("Hello, w"); // set the cursor to column 0, line 1 // note : line 1 is the second row, since counting begins with 0 lcd.setCursor(0,1); lcd.print("orld!"); delay(1000); 아두이노의 LCD 라이브러리를 사용하기 위해 헤더 파일을 추가 라이브러리 사용을 위해 초기화 (DB : Data Bit) //lcd(RS, Enable, DB0, DB1, DB3, DB4) 사용하는 LCD는 1행 16열이지만 LCD Library를 그대로 이용하기 위해서 2행 8열로 Library를 초기화 (아두이노 LCD 라이브러리는 원래 16문자 2줄로 나타내는 LCD(1602 LCD)를 위해 만들어져 있기 때문에 LCD 초기화 방법을 다르게 함) LCD에 Display할 좌표 지정 LCD를 8열로 초기화했기 때문에 한 번에 8글자 이상 표현 불가 8글자 넘는 글자는 lcd.setCursor() 함수를 이용하여 행을 0->1로 변경한 다음 Display 처리 (Hello world) “Hello, world!” 글자를 LCD에 표시
패러럴 LCD 디스플레이(4bit) – 스케치(2) SerialDisplay // include the library code: #include <LiquidCrystal.h> char a; int start=0; // 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); // initialize the serial communications: Serial.begin(9600); } void loop() { if (start == 0) lcd.setCursor(0,0); lcd.clear(); lcd.print("+ -"); delay(700); lcd.print("- +"); // when characters arrive over the serial port... if (Serial.available()) { // wait a bit for the entire message to arrive start = 1; delay(100); // clear the screen // read all the available characters while (Serial.available() > 0) { // display each character to the LCD lcd.write(a=Serial.read()); Serial.write(a); (SerialDisplay) Serial 모니터 창에 입력한 글자를 LCD에 표시
패러럴 LCD 디스플레이(4bit) – 스케치(3) AutoScroll // 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); } void loop() { // set the cursor to (0,0): lcd.setCursor(0, 0); // print from 0 to 9: // for (int thisChar = 0; thisChar < 10; thisChar++) { for (int thisChar = 0; thisChar < 10; thisChar++) { lcd.print(thisChar); delay(500); // set the cursor to (16,1): lcd.setCursor(16, 1); // set the display to automatically scroll: lcd.autoscroll(); // turn off automatic scrolling lcd.noAutoscroll(); // clear screen for the next loop: lcd.clear(); (AutoScroll) Serial 모니터 창에 입력한 글자를 LCD에 표시
패러럴 LCD 디스플레이(4bit) – 스케치(4) CursorBlink // 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(8, 2); // Print a message to the LCD. lcd.print("hello, w"); lcd.setCursor(0,1); lcd.print("orld!"); } void loop() { // Turn off the blinking cursor: lcd.noBlink(); delay(3000); // Turn on the blinking cursor: lcd.blink(); (CursorBlink) LCD에 Cursor가 3초 간격으로 Blink 상태가 변경 : ON-OFF
패러럴 LCD 디스플레이(4bit) – 스케치(5) TextDirection // 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); int thisChar = 'a'; void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // turn on the cursor: lcd.cursor(); } void loop() { // reverse directions at 'h': if (thisChar == 'h' || thisChar == 'v') { // go right for the next letter lcd.rightToLeft(); // reverse again at 'o': if (thisChar == 'o') { // go left for the next letter lcd.leftToRight(); // reset at 'z': if (thisChar > 'z') { delay(2000); lcd.clear(); // go to (0,0): lcd.home(); // start again at 0 thisChar = 'a'; // print the character lcd.write(thisChar); // wait a second: delay(500); // increment the letter: thisChar++; (TextDirection) LCD에 알파벳이 a-z까지 표시하는데 입력 방향이 변경 : Left->Right, Right->Left
패러럴 LCD 디스플레이(8-bit 모드) (p113) Character LCD 모듈 : 16x1 LCD Module Hitachi HD44780 호환 컨트롤러 사용 데이터 처리 : 8-bit bus (데이터 송신하는데 8개의 데이터 선이 필요) 배선은 복잡하지만 LCD에 문자를 디스플레이 하는 속도가 4-bit 모드보다 빠름 RS(Register Select), R/W(Read/Write), Enable 등의 제어 필요 LCD 관련 프로그래밍 라이브러리 : Liquid Crystal Library #include <LiquidCrystal.h> 아두이노 IDE 포함
패러럴 LCD 디스플레이(8bit) - 배선도 1 3 5 7 9 11 13 15
패러럴 LCD 디스플레이(8bit) - 회로도(Schematic)
패러럴 LCD 디스플레이(8bit) - 스케치 int int DI = 12; int RW = 11; int DB[] = {3, 4, 5, 6, 7, 8, 9, 10}; int Enable = 2; void LcdCommandWrite(int value){ // poll all the pins int i=0; for(i=DB[0];i<=DI;i++){ digitalWrite(i,value & 01); value >>= 1; } digitalWrite(Enable, LOW); delayMicroseconds(1); // send a pulse to enable digitalWrite(Enable, HIGH); delayMicroseconds(1); // pause 1 ms according to datasheet void LcdDataWrite(int value){ int i = 0; digitalWrite(DI, HIGH); digitalWrite(RW, LOW); for(i=DB[0];i<=DB[7];i++){ void initLCD(){ delay(100); // initiatize LCD after a short pause // needed by the LCDs controller LcdCommandWrite(0x3A); // function set; // 8-bit interface, 2 display lines, display ON delay(10); LcdCommandWrite(0x0E); // display control; // turn display ON, cursor ON, no blinking LcdCommandWrite(0x01); // clear display, set cursor position to zero LcdCommandWrite(0x06); // entry mode set; // increment automatically, no display shift LCD 라이브러리를 사용하지 않은 관계로, HD44780 Controller 초기화나 DDRAM 데이터 쓰기 등을 위해서는 직접 컨트롤러에 접근(Access)하여야 함. 이러한 처리로 Sketch code가 복잡하며 HD44780 Data Sheet의 참조가 필요
패러럴 LCD 디스플레이(8bit) - 스케치 // this is the function used to send data to the // LCD screen in the proper format, the others are // working at lower level void printLCD(const char *s){ int count = 0; while(*s){ if(count == 8){ LcdCommandWrite(0xC0); // jump to the second part of the display; delay(5); } if(count>=16){ break; LcdDataWrite(*s++); count++; void setup() { // put your setup code here, to run once: int i = 0; for(i=Enable; i<=DI; i++){ pinMode(i,OUTPUT); initLCD(); void loop() { // put your main code here, to run repeatedly: LcdCommandWrite(0x02); delay(10); // write the welcome message printLCD("Dept of Computer"); delay(500);
시리얼 LCD 디스플레이 □ 시리얼 LCD 디스플레이 □ 데이터를 송신하는데 1개의 데이터 선만 있으면 됨 □ serial.print(cammand) 라는 명령어로 LCD에 다양한 문자를 표시 가능하다. □ 시리얼 LCD 디스플레이 기능을 지원하기 위해서는 시리얼 LCD 제품에 시리얼 통신으로 데이터를 수신해서 LCD에 대신 디스플레이를 해주는 별도의 마이크로 프로세서가 필요하다. □ 우리가 사용하는 시리얼 LCD 디스플레이 제품에는 이미 이러 한 기능이 포함되어 있는 마이크로 프로세서가 장착 되어 있 다.
시리얼 LCD 디스플레이 - 배선도 D1
시리얼 LCD 디스플레이 - 스케치 void setup() { Serial.begin(9600); } void loop() Serial.print("$CLEAR\r\n"); Serial.print("$GO 1 4\r\n"); Serial.print("$PRINT Welcome to\r\n"); Serial.print("$GO 2 1\r\n"); Serial.print("$PRINT www.jkelec.co.kr\r\n"); Serial.print("$CURSOR 1 1\r\n"); delay(1000);
감사합니다. Thank You !