이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

asm-avr-LCD-display

AVR LCD Display - ASM
  Character LCD Display Controller와 LCD Module - ASM

    LCD Display Module은 LCD Panel과 LCD Display Controller IC로 구성 된다.

    이용자가 LCD Display Module을 선택 하면 LCD Panel의 물리적인 크기와 기능이 결정된 상태 이기 때문에 여기서는 LCD에 표시되는 문자와 위치 등을 프로그램으로 제어하는 Display Controller에 대한 Interface와 Control(제어 프로그램)에 대하여 설명 한다.





  • Hitachi HD44780 Dot matrix LCD driver & controller
  • HD44780 LCD Display Controller는 대표적인 Character type dot matrix LCD controller 이다.

    Hitachi HD44780와 삼성 S6A0069 Dot matrix LCD driver & controller는 호환 된다.

    Hitachi HD44780.pdf


    • HD44780 LCD driver의 개요
      • 5 x 8 and 5 x 10 dot matrix possible
      • Low power operation support: 2.7 to 5.5V
      • Correspond to high speed MPU bus interface: 2 MHz (when VCC = 5V)
      • 4-bit or 8-bit MPU interface enabled
      • 80 x 8-bit display RAM (80 characters max.)
      • 9,920-bit character generator ROM for a total of 240 character fonts
        • 208 character fonts (5 ´ 8 dot)
        • 32 character fonts (5 ´ 10 dot)
      • 64 x 8-bit character generator RAM
      • Wide range of instruction functions:
        • Display clear, cursor home, display on/off, cursor on/off, display character blink, cursor shift,display shift

    • HD44780 Block Diagram
      • HD44780는 Instruction Register(IR)과 Data Register(DR)을 이용하여 컴퓨터(대부분의 경우 Embedded computer)로 부터 명령(Instruction)과 Display Data를 전송 받고, LCD Controller의 동작 상태(Flag)를 전송 한다.
      • 다른 장치(Embedded computer)와 통신은 3종류의 Control 신호(Register Selection(RS), Read/Write(R/~W), Enable(E))와 Data Bus(DB0 - DB7) 신호를 이용 하여 실행 된다.

    • HD44780 LCD driver의 중요 기능
      • 외부 장치와 통신에 이용 되는 Registers
        • Instruction register(IR) : Stores instruction codes
          • display clear, cursor shift, 등의 명령과
          • Address information을 외부 장치로 부터 받는다.
            • Display data RAM (DDRAM)과
            • Character generator RAM (CGRAM)의 Address를 받는다.
        • Data register(DR): DDRAM 이나 CGRAM에 Read/Write 하는 Data을 임시로 저장 하는 Rg 이다.
      • LCD Controller의 상태를 표시 하는 Busy Flag (BF)
        • HD44780가 내부 동작 모드일 경우(Busy 상태)에는 다음 명령을 받을 수 없기 때문에 LCD Controller의 내부 동작 상태를 표시하는 Flag가 필요 하다.
        • Busy Flag는 DB7에 Output 된다.
      • Address Counter(AC)
        • LCD Controller 내부에 있는 Rg로 Instruction register로 부터 필요한 Address 정보를 받는다.
        • DDRAM 이나 CGRAM의 Address를 저장 한다.
      • Registers Selection과 Operation
        • Registers Selection 신호(RS)
          • RS가 Low(0)인 경우 LCD Controller 내의 Instruction register가 선택 된다.
          • RS가 High(1)인 경우 LCD Controller 내의 Data register가 선택 된다.
        • Read/Write Operation 신호(R/~W)
          • R/~W가 Low(0)인 경우 RS Register에 의하여 선택 된 Rg에 Write Operation이 실행 된다.
          • R/~W가 High(1)인 경우 RS Register에 의하여 선택 된 Rg로 부터 Read Operation이 실행 된다.

    • Display Data RAM (DDRAM)
      • Display Data RAM (DDRAM) Address Counter(AC)
        • Display data RAM(DDRAM)은 80 x 8 bits(80자)를 저장 할 수 있다.
        • 80 Byte의 Address(DDRAM address) 공간을 표시 하기 위하여 7Bit Address Counter가 필요 하다.
      • 1-Line Display(N=0) 모드인 경우 Display 위치와 DDRAM address
      • 1-Line에 8자를 표시하는 LCD Panel인 경우 Display 예
        • LCD Display Module이 1줄에 8자를 표시 할 수 있는 경우, 윗 그림과 같이 DDRAM에 저장 할 수 있는 80자(Byte) 중 선택된 8자만 Display 된다.
        • Shift Left Operation: 윗 그림과 같이 DDRAM에 저장된 80 Byte의 Data가 Left Shift 되고 0 번지 부터 7 번지 사이의 Data가 Display 된다.
        • Shift Right Operation: 윗 그림과 같이 DDRAM에 저장된 80 Byte의 Data가 Right Shift 되고 0 번지 부터 7 번지 사이의 Data가 Display 된다. 0 번지에 8번지의 Data가 아니라 16진수 0x4f(79번째) 번지의 Data가 Shift 되는 것에 유의 할 것.
      • 2-Line Display(N=1) 모드인 경우 Display 위치와 DDRAM address
      • 2-Line에 각 Line 마다 8자를 표시하는 LCD Panel인 경우 Display 예
        • LCD Display Module이 2줄에 8자를 표시 할 수 있는 경우, 윗 그림과 같이 DDRAM에 저장 할 수 있는 80자(Byte) 중 선택된 8자만 각 Line에 Display 된다. 둘째줄 첫번째 위치에 16진수 0x40 번지의 Data가 Display 되는 것에 유의 할 것.
        • Shift Left Operation: 윗 그림과 같이 각 줄의 Data가 별도로 Left Shift 되고 그 결과가 Display 된다.
        • Shift Right Operation: 윗 그림과 같이 각 줄의 Data가 별도로 Right Shift 되고 그 결과가 Display 된다.
      • 2-Line에 각 Line 마다 16자를 표시하는 LCD Panel인 경우 Display 예

    • Instructions
    • 아래 표는 HD44780 LCD Controller에서 실행 할 수 있는 명령을 요약 하여 보여 주고 있다. 자세한 내용은 첨부한 pdf 자료를 참고 하기 바람. 별첨 자료: hd44780.pdf


  • LMC1623A LCD Module의 외부 Pin 배열
    • 아래 표는 LCD Module(LMC1623A)의 Pin 배열과 Function 설명서 이다.
    • 이 Module은 기본적으로 8 Bit Data Bus를 사용 하고 있다. 그러나 이 경우 Control 신호 3개를 포함 하면 8 Bit Output Port 하나를 사용 하여 제어 할 수 없기 때문에 이 LCD Module은 Data Bus를 4 Bit 만 사용(8 Bit Data를 4 Bit 씩 2번 전송)하는 변형된 Interface를 제공 한다.
    • LCD Module(LMC1623A)은 모듈 동작에 필요한 14Pin 이외에 Backlight 제어를 위한 2개의 핀을 포함 하여 16Pin으로 구성된 경우가 있다.(아래 그림 참고 요)


  • 윗 LCD Module을 사용 하여 Data Bit를 4Bit만 사용한 Interfacing 예(Port A 사용)
    • 아래 회로는 LCD Module(LMC1623A)과 외부장치(Embedded Computer)의 Interfacing 예 이다.
    • 이 예에서는 Data Bit를 4 Bit 만 사용 하여 PortA 8 Bit 중 7 Bit(Control 신호 3 Bit + Data Bit 4 Bit)만 사용 하였다.

  • HD44780 Controller 의 Access Type과 Timing Diagram
  • 아래 그림은 LCD Module 제어 프로그램 작성에 필요한 정보를 제공 하기 위한 Timing Diagram 이다.


  • Parallel Port LCD Interface(4 Bits) 프로그램 예:
    • Parallel Port LCD Interface(4 Bits) 프로그램 예
    • Console 프로그램으로 부터 문자를 입력 받아 Console과 LCD에 출력하는 실험을 위한 회로 예

    • LCD 제어 함수에서 사용 하는 Header File: GCC_asm_lcd_hd44_4bit.h

    • LCD 제어 함수 프로그램 예: GCC_asm_lcd_hd44_4bit__soft_util.s

      • 실험을 위한 준비
        • 실험 구성도를 참고하여 PC와 AVR 사이에 UART 통신선을 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 RXD와 Atmega128의 TXD0(PE1)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 TXD와 Atmega128의 RXD0(PE0)를 연결한다.
          • 컴퓨터(USB --> UART(RS232) 변환 모듈)의 GND와 Atmega128의 GND를 연결한다.
          • 주: 컴퓨터에 Serial Port가 없는 경우 "USB --> UART(RS232) 변환 모듈"를 사용(USB Port를 Serial Port로 변환)하여 연결한다. 개발보드에 따라서는 "USB --> UART(RS232) 변환 모듈"을 내장하고 있는 경우가 많기 때문에 본인이 사용하는 개발보드에서 확인 하여야 한다.

            참고자료: USB - Serial 변환 모듈

        • 실험 구성도를 참고하여 AVR에 LCD display module의 신호를 연결한다.
          • 실험 구성도를 참고하여 LCD 제어 신호(RS, R/W, Enable)를 연결한다.
          • 실험 구성도를 참고하여 LCD Data 신호(Data0, Data1, Data2, Data3)를 연결한다.
        • 위 "LCD 모듈 4Bit Interface 예"을 참고하여 전원과 Contrast adjustment 선을 연결한다.
          • GND: LCD 모듈 1번 핀
          • Vdd: LCD 모듈 2번 핀
          • Contrast adjustment: LCD 모듈 2번 핀. 5 에서 10K 가변저항을 사용하여 "LCD 모듈 4Bit Interface 예"와 같이 연결한다.
          • 주: 처음 LCD display module을 연결한 경우에는 Contrast adjustment 가변저항을 조정하여 LCD에 문자가 잘 보이도록 하여야 한다.

      • 실험 방법
        • GCC_asm_lcd_4bit_soft_basic.zip 파일을 Download하여 압축을 해제한다.
        • Build → Build Solution 를 실행 하면 프로그램이 Build 되어 GCC_asm_lcd_4bit_soft_basic.hex 파일이 생성된다.
        • GCC_asm_lcd_4bit_soft_basic.hex 파일을 Target Board에 Upload 하고 프로그램을 실행한다.
        • 모니터 프로그램(예: OC-Console, Tera Term)을 설치(이미 설치되어 있는 경우에는 실행만 하면됨)하고 실행 한다.
        • 모니터 프로그램에서 필요한 설정(Serial Port와 Baudrate 등을 설정)을 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 모니터에 "LCD test" 메세지가 출력된다.
          • LCD display module의 첫 Line에 "LCD test" 메세지가 출력된다.
          • LCD display module의 둘째 Line에 "TS" 메세지가 출력된다.
          • 모니터 프로그램에서 영문자를 입력하면 모니터와 LCD의 둘째줄에 문자가 출력(둘째줄의 끝까지만 출력됨)된다.
        • 참고자료: timer2를 이용한 Time delay를 이용하는 프로그램 예: GCC_asm_lcd_4bit_timer2_basic.zip

    • LCD와 Keypad를 이용한 문자 입출력 프로그램 예
    • Keypad와 LCD를 이용한 가산기 프로그램 시스템 구성도

      • 실험을 위한 준비
        • 실험 구성도를 참고하여 AVR에 Keypad를 연결한다.
        • 참고자료: Keypad Interfacing

        • 실험 구성도와 윗 예를 참고하여 AVR에 LCD display module의 신호를 연결한다.
      • 실험 방법
        • GCC_c_asm_keypad_lcd_io_basic.zip 파일을 Download하여 압축을 해제한다.
        • Build → Build Solution 를 실행 하면 프로그램이 Build 되어 GCC_c_asm_keypad_lcd_io_basic.hex 파일이 생성된다.
        • GCC_c_asm_keypad_lcd_io_basic.hex를 개발 보드에 Upload 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 LCD display module의 둘째 Line에 "In:Key Out:LCD" 메세지가 출력된다.
          • Keypad에서 Key를 누르면 입력된 문자가 LCD display module의 첫 Line에 출력된다. # Key를 Return code로 사용한다.

    • Keypad와 LCD를 이용한 가산기 프로그램 예
      • LCD를 출력 장치로 Keypad를 입력 장치로 사용 하는 가산 기능을 갖는 계산기 프로그램 예 이다.

        I/O Format : 정수 + 정수 = 결과

        + 부호는 * Key, = 부호는 # Key 를 사용 한다

      • 실험을 위한 준비
        • 실험 구성도와 윗 예를 참고하여 AVR에 Keypad를 연결한다.
        • 실험 구성도와 윗 예를 참고하여 AVR에 LCD display module의 신호를 연결한다.
      • 실험 방법
        • GCC_c_asm_keypad_lcd_add.zip 파일을 Download하여 압축을 해제한다.
        • Build → Build Solution 를 실행 하면 프로그램이 Build 되어 GCC_c_asm_keypad_lcd_add.hex 파일이 생성된다.
        • GCC_c_asm_keypad_lcd_add.hex를 개발 보드에 Upload 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 LCD display module의 둘째 Line에 "KeyPad Adder" 메세지가 출력된다.
          • Keypad에서 정수와 + 연산자(* Key), 정수, = 연산자(# Key)를 입력하면 LCD display module의 첫 Line에 입력 내용과 연산 결과가 출력된다. 입력 예: 12+23= , LCD 출력 예: 12 + 23 = 35

    • LCD와 Keypad(Multi Code Keypad)를 이용한 4칙 연산 프로그램 예
      • LCD를 출력 장치로 Keypad를 입력 장치로 사용하여 가산(16Bit Unsigned integer), 감산(16Bit Unsigned integer), 승산(16Bit ← 8Bit * 8Bit), 제산(/) 기능을 갖는 계산기를 구현한다.

        I/O Format 예 : 1(정수)*(Key Code Table 변환) +(Operator)2(정수)=3(결과)

        기본 Key Code Table은 * Key를 Key Code Table 변환 Code로 사용 하고, # Key를 = 변환 Code로 사용 한다. 두번째 Key Code Table에서는 숫자 Key 2를 + (가산)Key로 사용 하고, 숫자 Key 5를 - (감산) Key로 사용, 숫자 Key 8를 * (승산) Key로 사용, 숫자 Key 0를 /(제산)Key로 사용 한다.

      • 실험을 위한 준비
        • 실험 구성도와 윗 예를 참고하여 AVR에 Keypad를 연결한다.
        • 실험 구성도와 윗 예를 참고하여 AVR에 LCD display module의 신호를 연결한다.
      • 실험 방법
        • GCC_c_asm_keypad_LCD_arithmetic.zip 파일을 Download하여 압축을 해제한다.
        • Build → Build Solution 를 실행 하면 프로그램이 Build 되어 GCC_c_asm_keypad_LCD_arithmetic.hex 파일이 생성된다.
        • GCC_c_asm_keypad_LCD_arithmetic.hex를 개발 보드에 Upload 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 LCD display module의 둘째 Line에 Input format를 표시하는 "Input: 12*+34=46" 메세지가 출력된다.
          • Keypad에서 정수와 + 연산자(* Key), 정수, = 연산자(# Key)를 입력하면 LCD display module의 첫 Line에 입력 내용과 연산 결과가 출력된다. 입력 예: 12*+23= , LCD 출력 예: 12 + 23 = 35
          • 4칙 연산을 모두 실험한다.

  • LCD 표시 장치 관련 페이지 보기