본문 바로가기

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

TFT LCD에서 한글 영문 같이 출력(4)

이제는 다음과 같은 함수로 간단이 화면에 한글과 영문을 같이 표현 한다.

printFont( "아름다운 KOREA 한글",5,100,1);

void printFont( String s, int x, int y , int m )    //  m은 배율이다.
{
  
  myGLCD.setTextSize(2*m);  
  int size=sizeof(font) /sizeof(Font);    // font의 갯수를 구함   C#의 length 같은 것이 없어서
                                                              //  전체 font의크기 / Font 구조체 사이즈 = font갯수

  for( int p=0; p <s.length() ;p++)
 {     
     
     if(  isAscii(s[p]) )          //  Byte가 ASCII이면    ( 최상위 bit가 0(양수)  :  최상위 비트 1 (음수)이면  한글 첫Byte
     {                                  //                                                                          그다음2byte와  3Byte로  한글 UTF-8코드   
      myGLCD.setCursor(x,y);           //                                                          참고로 한글 UniCode는 2Byte                      
      myGLCD.println(s[p]);               // 기존 함수로 영문출력                       참고로 한극 EUC-KR(CP949)은 2Byte
      x+=16*m;         
     }
     else   for( int f=0; f < size; f++)                              //  폰트 수 만큼 검색
                if( font[f].s== s.substring(p,p+3) )              //  Arduino 스케치는 UTF-8( 한글 3byte ) 사용
                       {                                                          // /p, p+1 ,p+2 가 한글 UTF-8코드 
                        drawFont( font[f].f ,  x,  y, m) ;
                        x+=16*m;
                       }
  }
}

그리고 폰트 저장도 포인터 배열 대신 구조체를 사용 했습니다. -

struct Font
{
     String s;                          // 폰트글자
     unsigned short f[16] ;     // 폰트     
};

폰트 만드는 영상입니다.(클릭)  폰트메이커 ver 1.5    (   ver 2.0으로 업데이트됨 )

출력영상입니다. 한글영문이 같이 출력됩니다.


두이노 소스코드입니다.

#include <Adafruit_GFX.h>        // TFT LCD 사용을 위해 그냥 Copy하여 사용할 코드들 입니다.                                        
#include <UTFTGLUE.h>                                                                                                                                                     

UTFTGLUE myGLCD(0x9488,A2,A1,A3,A4,A0); ///////////////////// TFT 

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

//---- 폰트 만들기 프로그램 ver 1.5 로 만든 코드임------------                                                                                                      

struct Font  // 폰트구조체

     String         s;     //  폰트글자 
     unsigned short f[16]; //  폰트 
}; 
Font font[]={ 
"강",{ 0x0000, 0x3F08, 0x0088, 0x0088, 0x008E, 0x0108, 0x0608, 0x7808, 
                           0x0008, 0x03C0, 0x0C30, 0x1008, 0x1008, 0x0C30, 0x03C0, 0x0000 },
"국",{ 0x0000, 0x1FF8, 0x0004, 0x0004, 0x0004, 0x0008, 0x3FFE, 0x0080, 
                           0x0080, 0x0080, 0x1FF8, 0x0004, 0x0004, 0x0004, 0x0004, 0x0000 },
"나",{ 0x0000, 0x0008, 0x2008, 0x2008, 0x2008, 0x2008, 0x200E, 0x2008, 
                           0x2008, 0x2008, 0x2068, 0x1F88, 0x0008, 0x0008, 0x0008, 0x0000 },
"다",{ 0x0000, 0x0008, 0x1F88, 0x2008, 0x2008, 0x2008, 0x200E, 0x2008, 
                           0x2008, 0x2008, 0x2008, 0x2068, 0x1F88, 0x0008, 0x0008, 0x0000 },
"대",{ 0x0000, 0x0024, 0x1F24, 0x2024, 0x2024, 0x2024, 0x2024, 0x203C, 
                           0x2024, 0x2024, 0x2024, 0x21A4, 0x1E24, 0x0024, 0x0024, 0x0000 },
"라",{ 0x0000, 0x0008, 0x3F08, 0x0088, 0x0088, 0x0088, 0x008E, 0x1F08, 
                           0x2008, 0x2008, 0x2008, 0x2038, 0x1FC8, 0x0008, 0x0008, 0x0000 },
"름",{ 0x0000, 0x1FF8, 0x0004, 0x0FF8, 0x1000, 0x0FFC, 0x0000, 0x3FFE, 
                           0x0000, 0x0000, 0x1FFC, 0x1004, 0x1004, 0x1004, 0x0FF8, 0x0000 },
"리",{ 0x0000, 0x0008, 0x3F08, 0x0088, 0x0088, 0x0088, 0x0088, 0x1F08, 
                           0x2008, 0x2008, 0x2008, 0x2038, 0x1FC8, 0x0008, 0x0008, 0x0000 },
"민",{ 0x0000, 0x3F88, 0x2088, 0x2088, 0x2088, 0x2088, 0x2088, 0x2088, 
                           0x3F88, 0x0008, 0x0008, 0x1000, 0x1000, 0x1000, 0x0FF8, 0x0000 },
"산",{ 0x0000, 0x0408, 0x0408, 0x0408, 0x0C08, 0x0A0E, 0x1108, 0x2088, 
                           0x4048, 0x0008, 0x0008, 0x1000, 0x1000, 0x1000, 0x0FF8, 0x0000 },
"아",{ 0x0000, 0x0008, 0x0E08, 0x1108, 0x1108, 0x2088, 0x208E, 0x2088, 
                           0x2088, 0x2088, 0x1108, 0x1108, 0x0E08, 0x0008, 0x0008, 0x0000 },
"우",{ 0x0000, 0x03E0, 0x0C18, 0x1004, 0x1004, 0x0C18, 0x03E0, 0x0000, 
                           0x3FFE, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0000 },
"운",{ 0x0000, 0x03E0, 0x0C18, 0x1004, 0x0C18, 0x03E0, 0x0000, 0x0000, 
                           0x3FFE, 0x0080, 0x0080, 0x1080, 0x1000, 0x1000, 0x0FFC, 0x0000 },
"한",{ 0x0000, 0x1F08, 0x0008, 0x7FC8, 0x0008, 0x1F0E, 0x2088, 0x2088, 
                           0x2088, 0x1F08, 0x0008, 0x1000, 0x1000, 0x1000, 0x0FF8, 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 m)                     //오버로드 함수
{  drawFont( font, x,  y, m , m, true);}

void drawFont(unsigned short font[], int x, int y  )                                //오버로드 함수
{  drawFont( font, x,  y, 1 , 1, true);}

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( Direction ) 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 printFont( String s, int x, int y , int m )

  myGLCD.setTextSize(2*m);  
  int size=sizeof(font) /sizeof(Font);    // font의 갯수를 구함   C#의 length 같은 것이 없어서
                                                              //  전체 font의크기 / Font 구조체 사이즈 = font갯수
  for( int p=0; p <s.length() ;p++)    //  글자수 만큼 byte 검색
  {    
     if(  isAscii(s[p]) )            //  Byte가 ASCII이면    ( 최상위 bit가 0(양수)  :  최상위 비트 1 (음수)이면  한글 첫Byte
     {                                                                                                                       //     그다음2byte와  3Byte로  한글 UTF-8코드   
        myGLCD.setCursor(x,y);                                                                   //      참고로 한글 UniCode는 2Byte                      
        myGLCD.println(s[p]);               // 기존 함수로 영문출력                       참고로 한극 EUC-KR(CP949)은 2Byte
        x+=16*m;         
     }
     else   for( int f=0; f < size; f++)    //  폰트 수 만큼 검색
                              if( font[f].s== s.substring(p,p+3) )              //  Arduino 스케치는 UTF-8( 한글 3byte ) 사용
                                {                                                                             //    p, p+1 ,p+2 가 한글 UTF-8코드 
                                     drawFont( font[f].f ,  x,  y, m) ;
                                     x+=16*m;
                                     p+=2;              // 2byte 이동 
                                    break;            //  for f 탈출
                                  }
  }
}
//---------------------------------------------------------------------------------------------                           

void setup()
{
 
  pinMode(A0, OUTPUT);   
  digitalWrite(A0, HIGH);     
                                             
  myGLCD.InitLCD();            
  myGLCD.setRotation(3);    
  myGLCD.clrScr();               
  
  
  myGLCD.setColor(cYELLOW);  
  printFont( "아름다운 Korea 강산",5,100,1);
  myGLCD.setColor(cRED);  
  printFont( "우리나라Korea대한민국 ",5,200,2);
}


void loop()
{
 
}