wemos mini 한글출력(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="안영하세요위모스에한글폰트를담아엘씨디에출력중입니다아두이노는용량이작아위모스를사용했습니다";
int cStr=0, pCs=0,lStr=LcdString.length();
//// 선 언 부
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~7번 문자 가능)
void setDisplayBuffer(){
for(int c=0;c<8;c++){
lcdBuffer[0][c]= hanFont[c*2] >> 3;
lcdBuffer[1][c]= (hanFont[c*2] << 2) | (hanFont[c*2+1] >> 6);
lcdBuffer[2][c]= hanFont[c*2+1] >> 1;
lcdBuffer[3][c]= hanFont[c*2+1] << 4;
lcdBuffer[4][c]= hanFont[c*2+16] >> 3;
lcdBuffer[5][c]=(hanFont[c*2+16] << 2) | (hanFont[c*2+17] >> 6);
lcdBuffer[6][c]= hanFont[c*2+17] >> 1;
lcdBuffer[7][c]= hanFont[c*2+17] << 4;
}
for( int x=0; x<8; x++) lcd.createChar( x,lcdBuffer[x]);
}
//// LCD에 한글표시 ////////////////////////////
void showHanfont(){
setDisplayBuffer();
lcd.setCursor(pCs,0);
for( byte x=0; x<4; x++)
lcd.write(x);
lcd.setCursor(pCs,1);
for( byte x=4; x<8; x++)
lcd.write(x);
}
////// 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(1000);
}
}
///// LOOP //////////////////////
void loop() {
String buff;
if( cStr >= lStr-1 ) cStr=0;
if( pCs > 12) pCs=0;
buff= LcdString.substring(cStr,cStr+3);
GetHanFontSetUTF8(buff);
SelectUMD();
Getfont();
ConvertFont();
lcd.init();
lcd.clear();
showHanfont();
cStr+=3;
pCs++;
}