본문 바로가기
코스웨어/13년 스마트컨트롤러

[LCD 사용자정의와 롬에 저장된 폰트 조합]by 남경

by 알 수 없는 사용자 2013. 5. 29.
728x90
반응형

text LCD에 사용자정의 한글 띄우기


LCD모듈 datasheet에 보면 CG RAM 주소를 지정하여  5 * 7 도트 크기의 사용자정의 글자를 8개 저장할 수 있으며,

5 * 10 크기는 4개까지 저장할 수 있다.


저장 후에 LCD모듈에 데이터를 쓰기 위해 RS와 연결된 핀을 활성화(LCD_DATA_write)하고,

LCD 모듈의 데이터 버스에 1~8까지의 값을 넣으면 우리가 저장한 글자 중 한 개를 출력할 수 있다.


하지만, 한글을 여러개 출력하고 싶을 때는 8글자 가지고는 부족하기 때문에,

LCD모듈의 롬에 저장되어 있는 폰트 섞어서 씀으로서 이를 해결하였다.


그 결과, 어설프게나마 긴 문장을 표현할 수 있었다~


소스코드

#include <stdio.h>

void LCD_Init()
{
  PIO_OER = LCD_RS|LCD_RW|LCD_EN|LCD_BS;
  PIO_PER = LCD_RS|LCD_RW|LCD_EN|LCD_BS;
  LCD_CMD_Write(LCD_Func);  
  LCD_CMD_Write(LCD_Entry);
  LCD_CMD_Write(LCD_Cursir);
  LCD_CMD_Write(LCD_Display);
  LCD_CMD_Write(LCD_Clear);
  LCD_CMD_Write(LCD_Home);

  return;
}

void LCD_CMD_Write(unsigned char ucDATA)
{
  volatile unsigned int icnt;
  PIO_CODR = LCD_EN;                  //CODR이므로 EN을 0V로
  PIO_CODR = LCD_RS;                  //        RS를 0V로
  PIO_CODR = LCD_RW;                  //        RW를 0V로
  for(icnt = 0; icnt < LCD_delay-LCD_delay1; ++icnt);
  PIO_SODR = LCD_EN;                  //CODR이므로 EN을 3.3V로
  for(icnt = 0; icnt < LCD_delay-LCD_delay2; ++icnt);
  PIO_CODR = LCD_BS;
  PIO_SODR = ucDATA << 16;
  for(icnt = 0; icnt < LCD_delay-LCD_delay3; ++icnt);
  PIO_CODR = LCD_EN;
  for(icnt = 0; icnt < LCD_delay-LCD_delay4; ++icnt);
  
  return;
}


void LCD_DATA_Write(unsigned char ucDATA)
{
  volatile unsigned int icnt;
  PIO_CODR = LCD_EN;                  //CODR이므로 EN을 0V로
  PIO_SODR = LCD_RS;                  //        RS를 3.3V로
  PIO_CODR = LCD_RW;                  //        RW를 0V로
  for(icnt = 0; icnt < LCD_delay-LCD_delay1; ++icnt);
  PIO_SODR = LCD_EN;                  //CODR이므로 EN을 3.3V로
  for(icnt = 0; icnt < LCD_delay-LCD_delay2; ++icnt);
  PIO_CODR = LCD_BS;
  PIO_SODR = ucDATA << 16;
  for(icnt = 0; icnt < LCD_delay-LCD_delay3; ++icnt);
  PIO_CODR = LCD_EN;
  for(icnt = 0; icnt < LCD_delay-LCD_delay4; ++icnt);

  
  return;
}
void LCD_Run()
{
  volatile unsigned int iCnt;
  volatile unsigned int Han_gul[]={
    0x000x040x1f, 0x000x040x0a, 0x0a, 0x04,        //ㅎ
    0x000x080x080x080x180x080x180x08,        //ㅕ
    0x000x000x000x0e, 0x020x0e, 0x080x0e,        //ㄹ
    0x000x040x040x0a, 0x110x110x000x00,        //ㅅ
    0x000x080x080x080x0e, 0x080x080x08,        //ㅏ
    0x1f, 0x000x0e, 0x020x0e, 0x080x0e, 0x00,        //를
    0x1c, 0x040x1c, 0x100x1c, 0x000x000x00,        //ㄹ
    0x1f, 0x040x140x140x1f, 0x000x000x00};        ?//문

  LCD_Init();
  LCD_CMD_Write(0x40);
  for (iCnt = 0; iCnt < 64; ++iCnt)
  {
    LCD_DATA_Write(Han_gul[iCnt]);
  }

  // 윗줄
  LCD_CMD_Write(0x80);
  LCD_DATA_Write(0x00);     // ㅎ
  LCD_CMD_Write(0x81);
  LCD_DATA_Write(0x01);     // ㅕ
  LCD_CMD_Write(0x82);
  LCD_DATA_Write(0xbd);     // 사용자정의 아님 : ㅈ
  LCD_CMD_Write(0x83);
  LCD_DATA_Write(0x48);     // 사용자정의 아님 : H
  LCD_CMD_Write(0x84);
  LCD_DATA_Write(0x02);     // ㄹ
  LCD_CMD_Write(0x86);
  LCD_DATA_Write(0x03);     // ㅅ
  LCD_CMD_Write(0x87);
  LCD_DATA_Write(0x04);     // ㅏ
  LCD_CMD_Write(0x88);
  LCD_DATA_Write(0xbd);     // 사용자정의 아님 :
  LCD_CMD_Write(0x89);
  LCD_DATA_Write(0x04);     // ㅏ
  LCD_CMD_Write(0x8a);
  LCD_DATA_Write(0x21);     // 사용자정의 아님 : !
  LCD_CMD_Write(0x8b);
  LCD_DATA_Write(0xdb);     // 사용자정의 아님 : 
  LCD_CMD_Write(0x8c);
  LCD_DATA_Write(0x4c);     // 사용자정의 아님 : L
  LCD_CMD_Write(0x8d);
  LCD_DATA_Write(0x04);     // ㅏ
  LCD_CMD_Write(0x8e);
  LCD_DATA_Write(0xcc);     // 사용자정의 아님 : 
  LCD_CMD_Write(0x8f);
  LCD_DATA_Write(0x01);     // ㅕ

  // 아랫줄
  LCD_CMD_Write(0xc1);     
  LCD_DATA_Write(0x4c);    // 사용자정의 아님 : L
  LCD_CMD_Write(0xc4);
  LCD_DATA_Write(0x05);    // 를
  LCD_CMD_Write(0xc7);
  LCD_DATA_Write(0x06);    // ㄹ
  LCD_CMD_Write(0xcb);
  LCD_DATA_Write(0x07);    // 문
  LCD_CMD_Write(0xcd);
  LCD_DATA_Write(0xdf);    // 사용자정의 아님 : 
  LCD_CMD_Write(0xcf);
  LCD_DATA_Write(0x6f);    // 사용자정의 아님 : 
  
  

  return;
}
int main()
{
  
void LCD_Run();
  return 0;
}


728x90