본문 바로가기
기술정보 및 자료/EBTB500

1.77 inch 160*128 TFT LCD 제어하기


ILLUMIINANT사의 1.77 inch TFT LCD를 제어하는 방법에 대해 알아 보도록 하겠습니다.


TFT LCD 패널에서는 보통 HSYNC, VSYNC, PCLK, DATA(n)등의 핀이 있습니다.
이 핀들을 제어하기 위해서는 PCLK 수십MHz 와 HSYNC, VSYNC에 동기된 각픽셀의 데이타를 계속 입력해야 합니다. 그래서 일반적인 MPU에서 컨트롤 하기 적합 하지 않습니다.

그래서 TFT LCD 컨트롤러가 내장된 LCD를 사용합니다.
EBTB500의 TFT LCD에 내장되어 있는 컨트롤러는 ILI9163B라는 칩 입니다.


첨부파일 'I1813-6IPN1216A.pdf'은 LCD DATASHEET입니다.
첨부파일 'ILI9163B_DS_V01.pdf'은 컨트롤러 DATASHEET입니다.

LCD DATASHEET를 보면 Supply voltage가 2.6V~3.3V입니다.
EBTB500은 CPU에 LCD를 바로 연결하기 위해 ATmega128L을 사용하였습니다.
보드 전원 입력시 3V ~ 3.3V로 입력 하십시오. 주의하시기 바랍니다.

ILI9163의 인터페이스 방식은 Serial interface/ 8080 Parallel / 6800 Parallel 이렇게 3가지 방식을 지원합니다.
8080과 6800의 차이점은 8080은 /RD와 /WR을 사용하고 6800은 R/W와 /E 방식을 사용합니다.
8080의 Read
/RD=0    /WR=1
8080의 Write
/RD=1    /WR=0
6800의 Read
R/W=1   E=Active
6800의 Write
R/W=0   E=Active

LCD에는 8080인터페이스로 핀이 나와 있으니 8080인터페이스에 맞게 제어를 하면 되겠습니다.

아래는 LCD의 8080 wrtie cycle 타이밍도 입니다.

CSX는 CS핀, D/CX는 RS핀, RDX는 /RD핀, WRX는 /WR핀을 의미 합니다.
command만 있을 경우(1byte), command + Parameter(2byte)가 있을 경우 , nbyte command가 있을 경우에 대해서 타이밍도를 그려놓은 것입니다.
타이밍도에 따르면.. 
COMMAND_WRITE는 /CS를 low active하고 RS를 low(command)로 두고 D0~D15에 command 출력 한 뒤 /WR 를 low후 high로 두면 되겠습니다.
COMMAND_WRITE에 따르는 PARAMETER_WIRTE는 /CS를 low active하고 RS를 high(parameter)로 두고 D0~D15에 parameter 출력 한 뒤 /WR 를 low후 high로 두면 되겠습니다.

어떤 COMMAND을 사용하는냐에 따라 뒤에 따라 오는 PARAMETER 수가 결정 되니 데이타시트를 참고하시기 바랍니다.

위의 타이밍에 따르는 c언어 WRITE함수를 아래와 같이 만들 수 있습니다.

#define LcdBl(X)      PORTE.4=X  

#define LcdRd(X)      PORTA.7=(!X)
#define LcdWr(X)      PORTA.6=(!X)
#define LcdRs(X)      PORTA.5=X
#define LcdCs(X)      PORTA.4=(!X)

#define LcdDataH(X)   PORTC=X
#define LcdDataL(X)   PORTB=X

void LcdWrCmd(unsigned char cmd)   // Write Command
{           
  LcdCs(1);

  LcdRs(0);   //command
  LcdDataH(0x00);
  LcdDataL(cmd);
  LcdWr(1);
  LcdWr(0);
 
  LcdCs(0);
}

void LcdWrPar(unsigned char par)  // Write Parameter
{
  LcdCs(1);

  LcdRs(1);   //parameter
  LcdDataH(0x00);
  LcdDataL(par);
  LcdWr(1);
  LcdWr(0);
 
  LcdCs(0);
}


LCD의 8080 read cycle 타이밍은 아래와 같습니다.



읽고자 하는 COMMAND를 wirte한후 RS를 high(data)로 둔후 /RD를 low active하여 D0~D15로 데이타를 읽어 내면 되겠습니다.


LCD 컨트롤러 칩인 ILI9163의 데이타포트는 D0~D17까지 있으나 LCD에는 D0~D15로 총 16bit 만 나와 있습니다.
데이타 출력시 16bit로 1pixel출력하는 포맷은 아래 그림과 같습니다.

위의 그림과 같이 RGB565 포맷으로 출력 하면 되겠습니다.


이제 화면으로 데이타를 출력하는 방법에 대해 알아 보겠습니다.
우선 현재 LCD에 맞게 컨트롤러 칩을 설정해야 됩니다.
대부분의 LCD판매처에서 initial코드라고 하여 컨트롤러 설정 소스를 제공하며,
LCD사이즈, 파워설정, Gamma설정 등에 대한 코드가 포함되어 있습니다.

이제 원하는 영역에 데이타를 write하기만 하면 됩니다.
우선 write하기 원하는 영역을 설정해야 합니다.


컨트롤러 데이타시트에 'Column Address Set'레지스터와 'Page Address Set'레지스터가 있습니다.
write하기 원하는 영역을 설정하기 위해 위의 두 레지스터를 설정합니다.

예를 들어 LCD의 (5,10)에서 부터 (15,20)까지의 영역에 데이타를 write하고 싶다면,
'Column Address Set'레지스터에 XS=5, XE=15를 설정하고
'Page Address Set'레지스터에 YS=10, YE=20를 설정 하면 되겠습니다.
이것을 보통 LCD 윈도우(window) 설정이라 합니다.

위의 내용을 C함수로 아래와 같이 구현 할 수 있습니다.

void LcdSetWindow(unsigned char x, unsigned char y, unsigned char width, unsigned char height)
{         
  LcdWrCmd(0x2A);  //Set Column Address
  LcdWrPar(0x00);
  LcdWrPar(x);
  LcdWrPar(0x00);
  LcdWrPar(x+width-1);

  LcdWrCmd(0x2B);  //Set Page Address
  LcdWrPar(0x00);
  LcdWrPar(y);
  LcdWrPar(0x00);
  LcdWrPar(y+height-1);
}

윈도우 설정 후 'Memory Write'레지스터에 윈도우 사이즈 만큼 데이터를 써 넣으면 됩니다.

다음은 데이터를 써 넣을 경우 wirte되는 방향 설정에 대해 알아 보겠습니다.



위의 그림과 같이 MY, MX, MV의 값을 변경하여 LCD의 write방향을 정할 수 있습니다.

C함수로 아래와 같이 구현 할 수 있습니다.

void LcdSetDirection(unsigned short angle) // 0,90,180,270

   switch(angle)
    {
      case 0:
      LcdWrCmd(0x36);
      LcdWrPar(0xC8);
      break;
     
      case 90:
      LcdWrCmd(0x36);
      LcdWrPar(0xa8);
      break;
     
      case 180:
      LcdWrCmd(0x36);
      LcdWrPar(0x08);
      break;
     
      case 270:
      LcdWrCmd(0x36);
      LcdWrPar(0x68);
      break;
     
      default:
      LcdWrCmd(0x36);
      LcdWrPar(0xC8);
      break;
    }
}

정리하면
1. LCD Reset & BackLight On
2. LCD컨트롤러 설정(initial code)
3. LCD 쓰기방향 설정
4. 윈도우설정 후 데이타 write
가 되겠습니다.

* BackLight 밝기 조정
EBTB500 회로도를 보면 2N7002 FET를 통해 LCD BackLight On/Off를 할 수 있도록 되어 있습니다.
포트로 단순 On/Off가 아닌 밝기 조정을 PWM방식으로 할 수 있습니다.
BackLight 제어 신호가 AVR의 OC3B 포트에 연결 되어 있으므로 포트를 PWM 출력으로 설정하고 DutyRatio를 조정하여 밝기를 변경 할 수 있겠습니다.