본문 바로가기

프로젝트/TFT LCD 한글 출력 (아두이노)

TFT LCD에서 특정 폰트만 추출하여 한글 출력 (2)

동영상보기

 

 

보다 다양하게 한글을 출력한 모습입니다.

 

한글 폰트 만들기 프로그램으로  추출한 폰트 를 사용했습니다.

필요한 폰트만 아두이노 코드에 올려 사용합니다.

속도가 빠르지만 많은 문자는 아두이노 용량때문에 제한 됩니다.

아두이노 Uno에서는 30자 이상은 무리...에러 또는 다운됨

프로그램 길이에 따라 메모리가 부족 할수도 있습니다.

아두이노 메가에도 TFTLCD쉴드를 사용 할수 있습니다.

메가는 아두이노의 4배용량입니다. 그래서 메가 추천

 

 

 

 필요한 폰트만 가져오면 용량이 작은 아두이노에서도 문제 없습니다.


아두이노 소스 코드

#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>
UTFTGLUE myGLCD(0x9488,A2,A1,A3,A4,A0); ///////////////////// TFT 

#define cBLACK          0x0000
#define cWHITE          0xFFFF
#define cRED               0xF800
#define cGREEN         0x0400
#define cBLUE            0x001F
#define cSILVER         0xC618
#define cGRAY            0x8410
#define cMAROON    0x8000
#define cYELLOW      0xFFE0
#define cOLIVE          0x8400
#define cLIME            0x07E0
#define cAQUA          0x07FF
#define cTEAL           0x0410
#define cNAVY           0x0010
#define cFUCHSIA    0xF81F
#define cPURPLE      0x8010
#define cTRANSPARENT      0xFFFFFFFF

// '' BitMap Font 
unsigned short fontA[16] ={ 0x0000, 0x0008, 0x0E08, 0x1108, 0x1108, 0x2088, 0x208E, 0x2088, 
                           0x2088, 0x2088, 0x1108, 0x1108, 0x0E08, 0x0008, 0x0008, 0x0000 };
// '' BitMap Font 
unsigned short fontRum[16] ={ 0x0000, 0x1FF8, 0x0004, 0x0FF8, 0x1000, 0x0FFC, 0x0000, 0x3FFE, 
                           0x0000, 0x0000, 0x1FFC, 0x1004, 0x1004, 0x1004, 0x0FF8, 0x0000 };
// '' BitMap Font 
unsigned short fontDa[16] ={ 0x0000, 0x0008, 0x1F88, 0x2008, 0x2008, 0x2008, 0x200E, 0x2008, 
                           0x2008, 0x2008, 0x2008, 0x2068, 0x1F88, 0x0008, 0x0008, 0x0000 }; 
// '' BitMap Font 
unsigned short fontUn[16] ={ 0x0000, 0x03E0, 0x0C18, 0x1004, 0x0C18, 0x03E0, 0x0000, 0x0000, 
                           0x3FFE, 0x0080, 0x0080, 0x1080, 0x1000, 0x1000, 0x0FFC, 0x0000 };
// '' BitMap Font 
unsigned short fontHan[16] ={ 0x0000, 0x1F08, 0x0008, 0x7FC8, 0x0008, 0x1F0E, 0x2088, 0x2088, 
                           0x2088, 0x1F08, 0x0008, 0x1000, 0x1000, 0x1000, 0x0FF8, 0x0000 };
 // '' BitMap Font                                                                       

unsigned short fontGul[16] ={ 0x0000, 0x1FF8, 0x0004, 0x0004, 0x0004, 0x0008, 0x3FFE, 0x0000, 
                           0x0000, 0x1FF8, 0x0004, 0x0FF8, 0x1000, 0x1000, 0x0FFC, 0x0000 };


                           
void setDot( int col, int row, int x, int y,int mx,int my)

{       //   (문자좌표)x,y  (bit 행열좌표) col,row에 가로 mx개의 점, 세로 my개의 점 그리기

        //    시작점 TopLeft 좌표는 x+col*mx    y+row*my임
    for(int dx=0 ; dx< mx ;dx++)       //  사각형의 가로 bit(dot)  
            for( int dy=0;dy<my;dy++)  //  사각형의 세로 bit
                   myGLCD.drawPixel(   x+col*mx+dx   ,y+row*my+dy  );
}

void drawFont(unsigned short font[], int x, int y, int mx ,int my)  // 함수 오버로드

{  drawFont( font, x,  y, mx , my, true);  }

void drawFont(unsigned short font[], int x, int y,  int mx , int my, bool Direction)
{     //  x,y에 가로 mx배 세로 my배로 Direction이 true이면 정상 false이면 역상으로 출력

 

  unsigned  int buff;

 

  for( int row=0; row<16; row++)        // 폰트 bit의 행 
  {           
      if( Dirextion ) buff=font[row];
      else buff=font[15-row];
      for(int col=0;col<16;col++)     // 폰트 bit의 열
      {                                    
             if( buff & 0b1000000000000000 ) setDot(  col,  row, x,y, mx, my);
             buff <<= 1;              //  열 , 행 , 가로표시좌표, 세로표시좌표, 가로배율, 세로배율
      } 
  }   
}

void setup()
{
    pinMode(A0, OUTPUT);   
    digitalWrite(A0, HIGH);
  
  myGLCD.InitLCD();
  myGLCD.setRotation(3);
  myGLCD.clrScr();
  
  myGLCD.setColor(255, 255, 255);

  int y=50; 
  int x;
  int fSize;  // 글자 dot크기   
  
  for( int i =3; i >=1 ;i--)
  {
      x=50;
      fSize=i*16;         // 1배는 16 dot  2배는 32 dot  n배는 n*16 dot
        
      if( i == 2  )  myGLCD.setColor( cRED ) ;
      if( i == 1  )  myGLCD.setColor( cYELLOW);
      
      drawFont(fontA,x,y,i,i);   x+=fSize;         //   폰트를 배열로 하면 코드가 훨씬 간단해 질 것이다.    
      drawFont(fontRum,x,y,i,i); x+=fSize;          //                          보러가기
      drawFont(fontDa,x,y,i,i);    x+=fSize;
      drawFont(fontUn,x,y,i,i);    x+=fSize*2;   // 공백 넣기
      drawFont(fontHan,x,y,i,i);  x+=fSize;
      drawFont(fontGul,x,y,i,i);   x+=fSize;
      y=y+fSize;
  }

   for( int i =1; i <=3 ;i++)
  {
      x=50;
      fSize=i*16;         
        
      if( i ==2  )  myGLCD.setColor( cRED);
      if( i == 1  )  myGLCD.setColor( cYELLOW);
      
      drawFont(fontA,x,y,i,i,false);  x+=fSize;
      drawFont(fontRum,x,y,i,i,false); x+=fSize;
      drawFont(fontDa,x,y,i,i,false);    x+=fSize;
      drawFont(fontUn,x,y,i,i,false);    x+=fSize*2;
      drawFont(fontHan,x,y,i,i,false);  x+=fSize;
      drawFont(fontGul,x,y,i,i,false);   x+=fSize;
      y=y+fSize;
  }
}

void loop(){}