마이크로 프로세서 실험 IV

- Text, Graphic LCD 구동 -

1. 실험 목적

본 실험은 마이크로 프로세서의 많은 응용 분야에서 매우 자주 사용되는 TEXT, Graphic LCD를 소프트웨어적으로 조작해 봄으로써 그래픽이나 Text 출력을 위해서 보통 컴퓨터에서 사용되는 CRT Display을 쓸 수 없는 환경에서 매우 간단한 회로만으로도 연결할 수 있는 LCD Unit의 사용법을 익힌다.

2. 배경 이론

(1) 실험의 개요

이 실험에서는 Text, Graphic LCD Module이라고 하는 장치를 이용한다. 이 장치는 실제 LCD(Liquid Crystal Display) 표시 장치(LCD Panel)와 그 LCD에 글자나 그림을 표시하기 위한 구동 장치, 현재 표시되고 있는 데이터를 저장하는 메모리등이 모두 포함된 장치이다. LCD 모듈의 블록 다이어그램을 다음과 같다(그림은 Text LCD 모듈이며 Graphic LCD도 거의 동일하다.) 그림에는 표시되지 않았지만 현재 LCD가 표시하고 있는 데이터를 저장하고 있는 메모리가 있으며, TEXT 모드를 지원하는 LCD인 경우에는 Font를 저장하기 위한 Character Generator ROM도 가지고 있다. 실제로 LCD Panel 자체는 그림의 Control LSI와 Segment Driver에 의해 Scan 방식으로 구동되며 프로그래머에게는 이 과정이 느껴지지 않는다. 다시말해 Control LSI는 LCD Module에 대한 모든 제어를 하는 장치로 프로그래머에게 LCD는 메모리와 같은 형태로 Access될 수 있도록 만들어주는 역할을 한다. 프로그램에서는 간단히 LCD 모듈 내부의 메모리 주소와 그에 해당하는 데이터를 줌으로써 LCD에 글자나 그림을 표시할 수 있게 된다.

그림에서 DB0-DB7은 LCD에 명령(주소지정, 초기화, ...), 문자나 그래픽 데이터 등을 전달하고 LCD의 상태(방금 전에 보낸 명령 처리가 끝났는지)를 읽기 위한 데이터 버스이고, E는 LCD 모듈에 대한 Chip Select 신호, R/W는 Read/Write 지정신호 (Read는 LCD 상태를 읽을 때), RS는 LSI내부의 Register 선택 신호이다. 그림에서 Vo는 LCD 구동 전압으로 Vo가 높은 경우 LCD가 더 진하게 표시되며 LED는 배경 불빛으로 Text LCD와 같이 작은 경우에는 LED를, Graphic LCD와 같이 Panel이 큰 경우에는 EL, CCFL과 같은 밝은 빛을 사용한다.

실험에서는 LCD 모듈과 CPU의 회로적인 연결 방법을 이해하고, LCD Module이 제공하는 각종 명령과 기능을 이용하여 LCD Module 초기화, Cursor 동작, 일반적인 출력 장치로서의 LCD 구동, Graphic LCD 이용, 간단한 그래픽 기법 등을 배운다.

(2) 하드웨어 구성

우리 실험에 사용되는 LCD는 다음과 같다.

LCD	해상도	Model	Driving Method	Back-light	기타
Text	40자 x 2줄	HC40201	1/16 Duty	LED (사용안함)	Write-Only
Graphic	160x128 Dot	HC16501	1/128 Duty	EL (100v)*

*Graphic LCD에는 배경 불빛을 위한 EL 전압으로 100 Volt를 사용한다. (안전에 주의)

(2-1) TEXT LCD

TEXT LCD와 CPU의 연결은 다음과 같다.

LCD	DATA	RS	E	R/W
CPU	I/O 0x7A00	CPU P0.6	CPU P0.7	Low
Active	-	1: Data 0: Cmd	high	1:Read 0:Write

그러므로 TEXT LCD는 데이터 북의 Timing에 맞추어 P0.6, P0.7 신호를 조정하고 I/O 주소 0x7A00 번지에 명령이나 데이터를 출력함으로써 원하는 LCD Command나 Data를 Write할 수 있다. 표에서와 같이 R/W 신호는 Low로 고정되어 Write만 가능하며 LCD의 현재 상태를 읽는 것은 우리 회로 상으로 불가능하다. 대개 LCD 모듈들은 명령과 데이터를 Read, Write할 때 Controller LSI에서 약간의 시간(수십 usec에서 길게는 수십 msec정도)이 걸리는데 이 동작이 끝난 것을 LCD의 Status Register를 읽어 확인할 수 있다. 우리 TEXT LCD 회로는 상태 읽기가 안되기 때문에 이러한 작업은 할 수 없고 각 동작에 맞추어 적당히 Delay를 하는 방법 밖에 없다.

TEXT LCD Controller 기능 :

Clear Display, Cursor ON/OFF, Cursor Blinking ON/OFF

Cursor, Display Shift, ....

- TEXT LCD 초기화 : TLCD.C의 TLCD_init() 함수 참조

- 이후 TLCD에 문자 출력 : (TLCD_putch() 내부 동작 참조)

1. TLCD Control Register에 문자를 Write할 위치를 지정하여 SET_ADDRESS 명령을보낸다.

TLCD 첫줄 첫째 글자의 물리적인 주소는 0, 둘째줄 첫째 글자의 주소는 64 이다.

TLCD_putch()에서는 이것를 연속인 주소인 것 처럼 만들고 있다.

2. TLCD Data Register에 Write할 문자를 보낸다.

(2-2) GRAPHIC LCD

Graphic LCD와 CPU의 연결은 다음과 같다.

LCD	DATA	CE	C/D	RD	WR
CPU	I/O 0x798x	I/O 0x798x decode	A0	I/O READ	I/O WRITE
Active	-	low	1: Cmd 0: Data	low	low

Graphic LCD는 I/O 번지 0x7981(Command), 0x7980(Data) 번지를 input/output 함으로써 제어한다. Graphic LCD는 Read가 가능하기 때문에 명령, 데이터 읽기 쓰기 동작의 완료를 Status Register를 읽어 알아낼 수 있어서 TEXT LCD 회로와는 달리 최단 시간의 동작이 가능하다.

Graphic LCD Controller의 기능

Text Mode / Graphic Mode 지원(우리는 Graphic 모드만 사용)

Auto Mode - 데이터를 읽거나 쓰면 자동으로 주소가 증가/감소하는 모드

Bit 단위 Operation,  OR, EXOR, AND 모드, ....

Graphic LCD의 각 Pixel에 대한 주소 지정은 다음과 같다.

첫 번째 줄의 시작 주소 : GLCD_SET_GRHOME 명령으로 지정 (GLCD_init() 함수 참조)

두 번째 줄의 시작 주소 : GRHOME + GLCD_SET_GRAREA 명령으로 지정된 값(32)

이후 각 줄의 시작 주소는 GLCD_SET_GRAREA 만큼 씩 증가한 값

한 줄은 32 byte로 구성되지만 실제로 표시되는 것은 27 바이트이고

각 바이트의 하위 6 bit만 LCD에 pixel로 mapping 되어 있다.

(수평 해상도 = 160,  27 x 6 = 162)

따라서 각 줄의 처음 6 Pixel은 첫 바이트, 그 다음 6 Pixel은 다음 바이트.. 와 같이 주소를

지정하여야 한다. - GLCD.C의 plot_tbx() 함수 참조.

(예 두 번째 줄의 첫 번째 6 pixel은 0(GRHOME) + 32(GRAREA) * 2 = 64 번지

두 번째 6 pixel은 65 번지 등이다.)

(2-3) LCD 데이터 Sheet :

Text LCD Data Sheet

5/12 - Text LCD 모듈의 Connector 핀 설명

6/12 - Text LCD Controller LSI Timing -

TLCD.C의 TLCD_data(), TLCD_control() 함수와 비교

7/12 - TLCD Instruction Set과 각 명령의 소요 시간 -

TLCD.C의 #define 문들

8/12 - TLCD 초기화 과정

Graphic LCD Data Sheet

7/27 - Graphic LCD 모듈의 Connector pin 설명

9/27 - Graphic LCD Controller LSI Timing

11/27 - GLCD Instruction Set

GLCD.C의 #define 문들

12/27 - GLCD Status Check 방법

*/27  - 이후 각 모드별 동작 방법

(3) 샘플 프로그램

샘플 프로그램에서는 Text LCD와 Graphic LCD를 위한 Defined 문, 초기화 함수 등이 있다.

TLCD.C	Y:\TOOLS\EXP\EXP4\TLCD.C

GLCD.C	Y:\TOOLS\EXP\EXP4\GLCD.C

3. 실험 방법

(1) TLCD :

- TextLCD 초기화 함수를 수정하여 Cursor를 Blink 모드로 설정한다.

- TLCD.C의 한 글자 출력 함수 TLCD_putch()를 이용하여 커저 위치를 유지하면서

<ENTER>, <TAB>, <BS>등 제어 문자를 처리할 수 있고 <ENTER> (^M : 13)이

눌리거나 한줄이 다 차면 TEXT LCD가 Scroll-up되며 새로운 빈 줄이 나타나도록 하는

한 글자 출력함수 Tputch()를 만든다.

- 위의 vsprintf()를 이용하여 Format 지정이 가능한 출력 함수인 Tprintf를 만든다.

(2) GLCD :

- Graphic LCD의 Auto READ/WRITE  모드를 숙지한다.

- GLCD.C의 clear_GLCD(), plot_tbx() 함수의 auto 모드 버전을 만든다.

Auto모드에서는 check_crw() 함수 대신 automode Data Read/write의 완료를 검사하는

함수를 만들어서 사용하여야 한다.

tbx 파일의 형태 :

처음 두 바이트 : 그림 한 줄의 Pixel 수 / 8 = Width8

다음 두 바이트 : 그림의 줄 수 = Height

그 다음부터는 Height * Width8 바이트 수 만큼의 그림 Bitmap

(각 바이트는 8 Pixel을 표시하며 MSB는 가장 오른쪽 Pixel이다.)

- Graphjc 화면의 한 줄을 읽어 저장하고 지운 뒤 잠시 delay하고 읽었던 것을 다시 쓰는

함수를 만든다.

4. 실험 결과

(1) TLCD

EXP4T.EXE

- 프로그램이 시작되면  Text LCD가 Clear되고 커저가 깜박거린다.

- PC의 키보드에서 누르는 글자를 Text LCD에 그대로 표시한다.

<ENTER>, <TAB>, <BACKSPACE>  Key가 처리됨을 보인다.

라인의 끝에서 또 다시  Key가 눌리면 한 줄 스크롤이 일어나고

새로운 빈 라인이 생긴다.

- 프로그램에  x 옵션을 주어 실행하면  PC에서 눌려진 데이터가 16진수로

Text LCD에 차례로 표시된다. 이때  Tprintf() 함수를 사용한다.

역시 한줄이 차면 다음 줄로 넘어가 계속 표시된다.

(2)  GLCD

A.  GLCDAUTO.EXE

GLCD.EXE를 automode로 바꾼 것 (속도가 무척 빠르다.)

AUTO_WRITE 모드를 이용하여 그림을 그린다.

그림 그리는 것 뿐만 아니라  Clear LCD 동작도 AUTO_WRITE 모드로 바꾼다.

B.  EXP4G.EXE

GLCD에 임의의 그림이나 문양을 그리고 빈 선이 위에서 아래로 훑어 나가는

모양을 만든다. (AUTO_WRITE, AUTO_READ 모드를 사용한다.)

즉 LCD 데이터를 한줄 읽어 저장하고, 그 줄을 지운뒤 잠시 기다렸다가

저장되었던 데이터를 다시 그린다. 이 과정을 위에서 아래로 해나간다.

C.  BONUS.EXE

위의  B 에서 위에서 아래가 아니라 왼쪽에서 오른쪽으로 빈 선이 지나가는

프로그램을 작성한다.