#include "Arduino.h"
#include <Wire.h> #include <SPI.h>
#include "ASCFont.h" #include "KSFont.h"
#include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>
#define OLED_PCLK 18 #define OLED_PDATA 23 #define OLED_PRESET 17 #define OLED_PCMD 16 #define OLED_PCS 5
#define LED 2
//----- Graphic define #define NUMFLAKES 10 #define DELTAY 2
byte HANFontImage[32] = {0, };
//HW SPI Adafruit_SSD1306 display(OLED_PCMD, OLED_PRESET, OLED_PCS); //DC, RST, CS String inputString;
//The setup function is called once at startup of the sketch void setup() { // Add your initialization code here pinMode(LED, OUTPUT);
Serial.begin(115200); delay(10);
//-------------------------------- //OLED OUTPUT
display.begin(SSD1306_SWITCHCAPVCC); //SPI
display.display(); //diplay output delay(2000); display.clearDisplay(); // Clear the buffer.
inputString="*--동작 시작--*" ;
char paramChar[inputString.length()+1]; inputString.toCharArray(paramChar,inputString.length()+1); matrixPrint(0,0,paramChar); display.display(); //diplay output
}
// The loop function is called in an endless loop void loop() { delay(1000);
}
//한글 라이브러리 처리 void matrixPrint(int XPOS,int YPOS,char *pChar){ //byte rg = 3; //<b1> red, <b0> green byte *pFs; //byte i, b; byte c, c2, c3;
while(*pChar){ c = *(byte*)pChar++;
//---------- �ѱ� --------- if(c >= 0x80){ c2 = *(byte*)pChar++; c3 = *(byte*)pChar++; //Serial.print(c,DEC); //Serial.print(c2,DEC); //Serial.print(c3,DEC); pFs = getHAN_font(c, c2, c3); display.drawBitmap(XPOS, YPOS, pFs, 16, 16, 1); XPOS = XPOS+16; if(XPOS > 128){ XPOS = 0; YPOS = YPOS+16; } } //---------- ASCII --------- else{ pFs = (byte*)ASCfontSet + ((byte)c - 0x20) * 16; display.drawBitmap(XPOS, YPOS, pFs, 8, 16, 1); XPOS = XPOS+8; if(XPOS > 128){ XPOS = 0; YPOS = YPOS+16; } } } }
/*============================================================================= 한글 font 처리부분 "주의 : 파일 형식을 UTF-8 로 꼭 사용해야 한다. =============================================================================*/ uint16_t utf16_d;
byte *getHAN_font(byte HAN1, byte HAN2, byte HAN3) {
const byte cho[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 3, 1, 2, 4, 4, 4, 2, 1, 3, 0 }; const byte cho2[] = { 0, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 7, 7, 6, 6, 7, 7, 7, 6, 6, 7, 5 }; const byte jong[] = { 0, 0, 2, 0, 2, 1, 2, 1, 2, 3, 0, 2, 1, 3, 3, 1, 2, 1, 3, 3, 1, 1 };
byte first, mid, lastcode; byte firstType, midType; byte last_Type = 0 ; byte i; byte *pB, *pF;
/*------------------------------ UTF-8 -> UTF-16 change UTF-8 1110xxxx 10xxxxxx 10xxxxxx */------------------------------
utf16_d = (uint16_t)((HAN1 & 0x0f) << 12) | (uint16_t)((HAN2 & 0x3f) << 6) | (uint16_t)(HAN3 & 0x3f);
/*------------------------------ 초,중,종성 코드를 분리해 낸다.
unicode = {[(초성 * 21) + 중성] * 28}+ 종성 + 0xAC00
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 초성 ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ 중성 ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ 종성 없음 ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ ------------------------------*/ utf16_d -= 0xac00; lastcode = utf16_d % 28; utf16_d /= 28; mid = utf16_d % 21; first = utf16_d / 21;
first++; mid++;
/*------------------------------ 초,중,종성 해당 폰트 타입(벌)을 결정한다. ------------------------------*/
/* 초성 19자:ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ 중성 21자:ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ 종성 27자:ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅆㅇㅈㅊㅋㅌㅍㅎ
초성 초성 1벌 : 받침없는 'ㅏㅐㅑㅒㅓㅔㅕㅖㅣ' 와 결합 초성 2벌 : 받침없는 'ㅗㅛㅡ' 초성 3벌 : 받침없는 'ㅜㅠ' 초성 4벌 : 받침없는 'ㅘㅙㅚㅢ' 초성 5벌 : 받침없는 'ㅝㅞㅟ' 초성 6벌 : 받침있는 'ㅏㅐㅑㅒㅓㅔㅕㅖㅣ' 와 결합 초성 7벌 : 받침있는 'ㅗㅛㅜㅠㅡ' 초성 8벌 : 받침있는 'ㅘㅙㅚㅢㅝㅞㅟ'
중성 중성 1벌 : 받침없는 'ㄱㅋ' 와 결합 중성 2벌 : 받침없는 'ㄱㅋ' 이외의 자음 중성 3벌 : 받침있는 'ㄱㅋ' 와 결합 중성 4벌 : 받침있는 'ㄱㅋ' 이외의 자음
종성 종성 1벌 : 중성 'ㅏㅑㅘ' 와 결합 종성 2벌 : 중성 'ㅓㅕㅚㅝㅟㅢㅣ' 종성 3벌 : 중성 'ㅐㅒㅔㅖㅙㅞ' 종성 4벌 : 중성 'ㅗㅛㅜㅠㅡ'
*/ if(!lastcode){ //��ħ ���� ��� firstType = cho[mid]; if(first == 1 || first == 24) midType = 0; else midType = 1; } else{ //��ħ �ִ� ��� firstType = cho2[mid]; if(first == 1 || first == 24) midType = 2; else midType = 3; last_Type = jong[mid]; } memset(HANFontImage, 0, 32);
//�ʼ� pB = HANFontImage; pF = (byte*)KSFont + (firstType*20 + first)*32; i = 32; while(i--) *pB++ = pgm_read_byte(pF++);
//�� pB = HANFontImage; pF = (byte*)KSFont + (8*20 + midType*22 + mid)*32; i = 32; while(i--) *pB++ |= pgm_read_byte(pF++);
//���� if(lastcode){ pB = HANFontImage; pF = ((byte*)KSFont) + ((8*20) + (4*22) + (last_Type*28) + lastcode)*32; i = 32; while(i--) *pB++ |= pgm_read_byte(pF++); }
return HANFontImage; }
static byte c1; // Last character buffer byte utf8ascii(byte ascii) { if ( ascii<128 ) // Standard ASCII-set 0..0x7F handling { c1=0; return( ascii ); }
// get previous input byte last = c1; // get last char c1=ascii; // remember actual character
switch (last) // conversion depnding on first UTF8-character { case 0xC2: return (ascii); break; case 0xC3: return (ascii | 0xC0); break; case 0x82: if(ascii==0xAC) return(0x80); // special case Euro-symbol }
return (0); // otherwise: return zero, if character has to be ignored }
String utf8ascii(String s) { String r=""; char c; for (int i=0; i<s.length(); i++) { c = utf8ascii(s.charAt(i)); if (c!=0) r+=c; } return r; } void utf8ascii(char* s) { int k=0; char c; for (int i=0; i<strlen(s); i++) { c = utf8ascii(s[i]); if (c!=0) s[k++]=c; } s[k]=0; }
|