조합형 한글 코드조합 로직입니다. 그냥 참고만 하세요.( 별 필요 없음 )
요래전 코딩이라 지금은 나도 코드를 잘 모르겠음 ㅋㅋㅋ
요즘은 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); } |
'프로젝트 > TFT LCD 한글 출력 (아두이노)' 카테고리의 다른 글
TFT LCD에서 한글 출력 출력소스 개선(3) (0) | 2022.08.04 |
---|---|
TFT LCD에서 특정 폰트만 추출하여 한글 출력 (2) (0) | 2022.08.01 |
TFT LCD에서 한글 출력 (1) (0) | 2022.07.30 |
LCD 16X2에 무리한 한글출력 모습 (2) (0) | 2019.06.26 |
LCD 16X2에 사용자 문자 출력 (1) 한글은 ? (0) | 2019.06.26 |