본문 바로가기

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

Arduino TFT LCD 한글 출력 소스 CODE(1)

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

#define  _TFTLCD      LcdName   //  LcdName을 원하시는 이름으로 변경 하시면 됩니다.                                                                                                                                 


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                         //   필요한 색만 copy하시면 ......
0xFFFF                        //   문자 줄 맞추기 힘들어 표로 작성 아직도 개선이 안된다는.....
0xF800
0x0400
0x001F
0xC618
0x8410
0x8000
0xFFE0
0x8400
0x07E0
0x07FF
0x0410
0x0010
0xF81F
0x8010
0xFFFFFFFF
//---- 폰트 만들기 프로그램 ver 1.5 로 만든 코드임------------                                                                                                      

struct Font  // 폰트구조체
{                                                                                                   
     String         s;     //  폰트글자  Key값으로                                   //  이곳은 아두이노 한글폰트 Code 만들기 프로그램으로
     unsigned short f[16]; //  폰트                                                    //   만든  Code를 복사하여 사용 하세요.                                
}; 
Font font[]={     //  한글 코드가 다양해서 그냥 문자로  Key값을 했습니다. 만들때는 UniCode  사용할때는 UTF-8이라서
"나",{ 0x0000, 0x0008, 0x2008, 0x2008, 0x2008, ......................................................, 0x0008, 0x0000 },
                                               :
                                              :           
"한",{ 0x0000, 0x1F08, 0x0008, 0x7FC8, 0x0008, -------------------------------------------, 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
              _TFTLCD.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 )                // 오버로드 함수                
{ printFont( s,  x,  y ,1); }


void printFont( String s, int x, int y , int m )      //   x,y 좌표에 m배로 출력
{  
 _TFTLCD.setTextSize(2*m);
  
  
   for( int p=0; p <s.length() ;p++)
 {     
     int size=sizeof(font) /sizeof(Font);    // font의 갯수를 구함   C#의 length 같은 것이 없어서
                                                              //  전체 font의크기 / Font 구조체 사이즈 = font갯수
     if(  isAscii(s[p]) )//Byte가 ASCII이면(최상위 bit가 0(양수) : 최상위 비트 1 (음수)이면  한글 첫Byte
     {                                                                                      // 그다음2byte와 3Byte로 한글 UTF-8코드   
     _TFTLCD.setCursor(x,y);                                               // 참고로 한글 UniCode는 2Byte                      
     _TFTLCD.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;
                        break;
                       }
  }

}
//---------------------------------------------------------------------------------------------                           

void setup()
{
 
  pinMode(A0, OUTPUT);   
  digitalWrite(A0, HIGH);     
                                             
 _TFTLCD.InitLCD();            
 _TFTLCD.setRotation(3);    
 _TFTLCD.clrScr();               
  
  //  아두이노 한글 출력 부분  대충 묶어 복사
  
 _TFTLCD.setColor(cYELLOW);                                           
  printFont("학교종이 땡땡땡 어서 모이자",5,5);                    
  printFont("선생님이 우리를 기다리신다",5,25);                    
  printFont("솔솔 부는 봄바람 쌓인 눈 녹이고",5,45);             
  _TFTLCD.setColor(cRED);                                                   
                                                                                           
}
                                                                                              
void loop()                                                                              
{
 
}

 Uno는 용량이 넘 적어서  / 딱 한글  30자 사용(  참고로 Mega 메모리는 Uno의 4배  )

 1~2자 넘어 가면 작동이 이상해지고 더 넘어가면 컴파일  에러 남
 Wemos가 용량이 좋은데 쉴드 연결이 안되고....연결 가능한 TFT LCD를 구 하면 될 듯 
여기 사용하는 제 TFT LCD는 구형이라 핀이 많이 필요
담에는 SD카드에 폰트를 저장 하여 사용 하는 프로그램으로.. 근데 속도가 문제인데 .....

가급적 같은 글자 사용 ㅎㅎ