본문 바로가기

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

wemos mini 한글 출력(3)--애니메이션효과

 

 

조합형 한글 코드조합 로직입니다. 그냥 참고만 하세요.( 별 필요 없음 )

요래전 코딩이라 지금은 나도 코드를 잘 모르겠음 ㅋㅋㅋ

요즘은 UTF-8 이나  EUC-KR 코드 완성형으로 코드 조합없이 바로 사용합니다

바로 아두이노에서 사용 할수 있는 한글 1자씩 폰트를 얻는 프로그램을 이미 제작했습니다.    정리해서 올리도록 하겠숩니다.

#include "HanGulFont.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
/*  ////////////////////////////////////////////////////////////////////////
 
    WeMos 를 사용하여 LCD 1602에 한글 출력 
 
/////////////////////////////////////////////////////////////////////////// */
 
////   폰트 변수     
    
byte hanFont[32];       // 폰트 생성용 버퍼
byte lcdBuffer[8][8];   // LCD용 버퍼 
                   
int hanCodeUp,hanCodeMid,hanCodeDown;    // 초성, 중성 종성코드  예)  1(ㄱ)  
int fontUpPair,fontMidPair,fontDownPair; //초성,중성,종성 선택된 세트번호
                                         // 각각  8세트 4세트 4세트
                                         
////  기 타 변 수         
                                    
String LcdString="안영하세요. Wemos mini에서 한글 Font를 담아 LCD 1602에 출력중입니다. 아두이노는 용량이 작아 Wemos를 사용했습니다";
int cStr=0, pCs=0,lStr=LcdString.length();
int lcdSelect=0,lcdA=0,lcdB=0;      
 
////  선  언  부    
 
LiquidCrystal_I2C lcd(0x27,20,4);  //  lcd I2C  wemos mini  SDA: D2   SCL: D1
 
 
 
////  함      수      
 
 
    //  UniCode에서 한글 초성,중성,종성 코드 추출하기  //
 
 //  UTF-8코드에서 (3byte)
 
void GetHanFontSetUTF8( String buff){   
    
   int uniCode=0; 
     
   uniCode = ( buff[0] & 0x0f) << 12 | (buff[1] & 0x3f) << 6 | buff[2] & 0x3f;  
   
   uniCode-= 0xAC00;   
 
   hanCodeDown=uniCode % 28;        //종성코드
   uniCode/=28;
   hanCodeMid=uniCode % 21+1;       //중성코드
   hanCodeUp= uniCode /21+1;     //초성코드
}
 
 //  UTF-16코드에서  (2byte) 
 
void GetHanFontSetUTF16( String buff){   
  
   int uniCode=0;       
     
   uniCode = buff[0] <<8 | buff[1];  
   
   uniCode-= 0xAC00;   
 
   hanCodeDown=uniCode % 28;             
   uniCode/=28;
   hanCodeMid=uniCode % 21+1;
   hanCodeUp= uniCode /21+1; 
}
 
///  초성,중성,종성 세트 구하기 
void SelectUMD()
{
      
     switch( hanCodeMid)    // 모음에 따라 초성 결정하기 예) 9번 -> ㅗ 
     {
       case  9 :  case 13 : 
       case 19 :  if( hanCodeDown==0) fontUpPair=1; //  종성이 없다면 1번세트        
                  else fontUpPair=6;             //  있다면  6번세트
                  break;
       case 14 :
       case 18 :  if( hanCodeDown==0) fontUpPair=2;          
                  else fontUpPair=6;
                  break;
       case 10 :
       case 11 :  case 12 :
       case 20 :  if( hanCodeDown==0) fontUpPair=3;         
                  else fontUpPair=7;
                  break;
       case 15 :
       case 16 :
       case 17 :  if( hanCodeDown==0) fontUpPair=4;        
                  else fontUpPair=7;
                  break;
       default :  if( hanCodeDown== 0) fontUpPair=0;          
                  else fontUpPair =5;
   }
  
    if( hanCodeUp == 1 || hanCodeUp == 16 ){    //초성이 ㄱ,ㅋ이면
           if(hanCodeDown==0) fontMidPair =0;//종성이 없다면 중성은 0번세트
           else  fontMidPair=2;           //있다면 2번세트
       }
      else{
           if(hanCodeDown==0) fontMidPair =1;
           else  fontMidPair=3;
       }   
       
   switch( hanCodeMid )     //   종성세트 고르기
    { 
        case  1 :  case  3 :
        case 10 :  fontDownPair =0;
                   break;
        case  9 :  
        case 13 :  case 14 :   case 18 :
        case 19 :  fontDownPair =3;
                   break;
        case  2 :  
        case  4 :  case  6 :   case  8 :  case 11 :
        case 16 :  fontDownPair =2;        
                   break;         
                   
        default :  fontDownPair =1;          
    }
     
} // end  SelectUMD    
 
 
/// 폰트데이타 합성
void Getfont(){
  int pUp,pMid,pDown;   //  초성,중성,종성의 폰트 데이타에서의 위치  
 
  pUp= (fontUpPair*20+hanCodeUp)*32;          // 선택된 초성세트 초성코드값
  pMid=(160 +fontMidPair*22+hanCodeMid)*32;   // 선택된 중성세트 중성코드값
  pDown=(248+fontDownPair*28+hanCodeDown)*32; // 선택된 종성세트 종성코드값
  
                                  //  HG_Font 폰트데이타 
  for( int i=0;i<32;i++ ){        // 초성,중성,종성 폰트 데이타 합치기      
      hanFont[i]= HanGulFont[pUp+i] ;   // 초성 데이타를 입력
      hanFont[i]= hanFont[i] | HanGulFont[pMid+i];  // 그위에 중성 데이타를 겹치기
      hanFont[i]= hanFont[i] | HanGulFont[pDown+i] ;//        종성 데이타를 겹치기          
  }  
}
 
 
////  LCD용으로 폰트 변경
void ConvertFont(){  
  for(int i=0;i<32;i++){
      byte code =hanFont[i], buff =0;
      buff|= ( code & B00000001) << 7;
      buff|= ( code & B00000010) << 5;
      buff|= ( code & B00000100) << 3;
      buff|= ( code & B00001000) << 1;
      buff|= ( code & B00010000) >> 1;
      buff|= ( code & B00100000) >> 3;
      buff|= ( code & B01000000) >> 5;
      buff|= ( code & B10000000) >> 7;
      hanFont[i]=buff;
  }
}
 
/// LCD에 폰트데이타로 문자생성 (0~5번 문자 사용)    012
void setDisplayBuffer(){                //     345
        
   for(int c=0;c<8;c++){               
      lcdBuffer[0][c]= hanFont[c*2] >> 2;                             //3
      lcdBuffer[1][c]= (hanFont[c*2] << 3) | (hanFont[c*2+1] >> 5);   //2   6
      lcdBuffer[2][c]= hanFont[c*2+1] ;                           // >>1        
     
      lcdBuffer[3][c]= hanFont[c*2+16] >> 2;
      lcdBuffer[4][c]=(hanFont[c*2+16] << 3) | (hanFont[c*2+17] >> 5);      
      lcdBuffer[5][c]= hanFont[c*2+17] ;
   }
 
  for( int x=0; x<6; x++)   lcd.createChar( x,lcdBuffer[x]); 
      
}
 
void setDisplayBufferA(int d ){                //     345
 
   if( d<4 ) 
     {        
        for(int c=0;c<8;c++)
           {               
            lcdBuffer[0][c]= hanFont[c*2] >> (3-d) ;                   
            lcdBuffer[1][c]= hanFont[c*2] << (d+2) |  hanFont[c*2+1] >> (6-d);                                 
            lcdBuffer[2][c]= hanFont[c*2+16] >>(3-d);
            lcdBuffer[3][c]= hanFont[c*2+16] >>(d+2) | hanFont[c*2+17] >> (6-d);   
           }
    }else
     {
         for(int c=0;c<8;c++)
           {               
            lcdBuffer[0][c]= hanFont[c*2] << (d-3) | hanFont[c*2+1] >>(11-d) ;                   
            lcdBuffer[1][c]= hanFont[c*2+1] >>(6 -d);                                 
            lcdBuffer[2][c]= hanFont[c*2+16] << (d-3) | hanFont[c*2+17] >>(11-d) ; 
            lcdBuffer[3][c]= hanFont[c*2+17] >>(6 -d); 
           } 
     }
  lcd.setCursor(lcdA,0);
  lcd.print("  ");
  lcd.setCursor(lcdA,1);
  lcd.print("  ");  
  for( int x=0; x<4; x++)  
    lcd.createChar( x,lcdBuffer[x]); 
        
}
 
void setDisplayBufferB(int d ){                //     345
 
   if( d<4 ) 
     {        
        for(int c=0;c<8;c++)
           {               
            lcdBuffer[4][c]= hanFont[c*2] >> (3-d) ;                   
            lcdBuffer[5][c]= hanFont[c*2] << (d+2) |  hanFont[c*2+1] >> (6-d);                                 
            lcdBuffer[6][c]= hanFont[c*2+16] >>(3-d);
            lcdBuffer[7][c]= hanFont[c*2+16] >>(d+2) | hanFont[c*2+17] >> (6-d);   
           }
    }else
     {
         for(int c=0;c<8;c++)
           {               
            lcdBuffer[4][c]= hanFont[c*2] << (d-3) | hanFont[c*2+1] >>(11-d) ;                   
            lcdBuffer[5][c]= hanFont[c*2+1] >>(6 -d);                                 
            lcdBuffer[6][c]= hanFont[c*2+16] << (d-3) | hanFont[c*2+17] >>(11-d) ; 
            lcdBuffer[7][c]= hanFont[c*2+17] >>(6 -d); 
           } 
     }
  lcd.setCursor(lcdB,0);
  lcd.print("  ");
  lcd.setCursor(lcdB,1);
  lcd.print("  ");  
  for( int x=4; x<8; x++)  
    lcd.createChar( x,lcdBuffer[x]); 
        
}
//// LCD에 한글표시               ////////////////////////////
void showHanfont()
{

 
  if ( lcdSelect == 0 )
  { 
     for(int d=1;d<6;d++)
        {
          setDisplayBufferA(d);
     
          lcd.setCursor(pCs,0); 
          for( byte x=0; x<2; x++)
              lcd.write(x);
              lcd.setCursor(pCs,1); 
          for( byte x=2; x<4; x++)
              lcd.write(x);  
          delay(100);                   
        }
     lcdA=pCs;  
     lcdSelect=1;         
  } else 
      {
        for(int d=1;d<6;d++)
        {
          setDisplayBufferB(d);
     
          lcd.setCursor(pCs,0); 
          for( byte x=4; x<6; x++)
              lcd.write(x);
              lcd.setCursor(pCs,1); 
          for( byte x=6; x<8; x++)
              lcd.write(x);    
         delay(100);     
        } 
        lcdB=pCs;
        lcdSelect=0;         
      }
}
/////////////  테스트 용   ////////////////////////////
 
 
//////     SET UP ////// 
void setup()
{
  
  Serial.begin(115200); 
                        // initialize the lcd     
  
  lcd.init(); 
  lcd.clear();
  lcd.backlight();
  lcd.print("LCD16x2 <WhyHow>");
  lcd.setCursor(1,1);
  lcd.print("Start Hangul"); 
  for(int i=0;i<3;i++)
     {
        lcd.print(".");
        delay(100); 
     }  
  lcd.init(); 
       
 }  
 
 
/////          LOOP  //////////////////////
void loop() { 
   String buff;
   
   if( cStr >= lStr-1 ) cStr=0;
   if( pCs > 14){
      pCs=0;   
      lcd.clear();
   }
       
      buff= LcdString.substring(cStr,cStr+3); 
 
                            
      if( (byte) buff[0] <= 128 )
        { 
          lcd.setCursor(pCs,1);
          lcd.print(buff[0]);
          pCs++;
          cStr++;
          delay(200);
        } else{
             GetHanFontSetUTF8(buff);
             SelectUMD();
             Getfont();
             ConvertFont();     
             showHanfont();
             cStr+=3;
            pCs+=2; 
        } 
  //delay(100);         
}