Advertisement
yclee126

아두이노 한글 타이핑 코드

Apr 22nd, 2019
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Created by yclee126 for maniaboard project V2.0
  2. #include <Keyboard.h>
  3. const int strbuffersize = 100; //최소 40 이상
  4. char strbuffer[strbuffersize];
  5. #define korPrint_P(stw) strlen(stw) < strbuffersize ? strcpy_P(strbuffer, PSTR(stw)) : strcpy_P(strbuffer, PSTR("**오류 : 문장이 너무 깁니다!!")), korPrint(strbuffer)
  6. #define korPrintln_P(stw) korPrint_P(stw), Keyboard.write(KEY_RETURN)
  7. void setup() {
  8.   Keyboard.begin();
  9. }
  10. void loop() {
  11.   delay(5000);
  12.   korPrintln_P("입력과 출력이 모두");
  13.   korPrintln_P("UTF-8 한글로 이루어진");
  14.   korPrint_P("한글 타이핑 함수");
  15.   while(1);
  16. }
  17. boolean hangulLatch = false;
  18. void korPrint(char* userstring){
  19.   for(int i = 0; i < strlen(userstring); i ++){
  20.    
  21.     if((byte)userstring[i] > 0b11100000){//현재 글자가 3바이트 UTF-8 글자의 첫부분이면 한글
  22.       if(!hangulLatch){
  23.         Keyboard.write(KEY_RIGHT_ALT);
  24.         hangulLatch = true;
  25.       }
  26.       korWrite(&userstring[i]);
  27.       i += 2;
  28.     }
  29.     else if(userstring[i] == ' '){ //가상 줄바꿈 문자
  30.       Keyboard.write(KEY_RETURN);
  31.     }
  32.    
  33.     else{ //그 외(영어)
  34.       if(hangulLatch){
  35.         Keyboard.write(KEY_RIGHT_ALT);
  36.         hangulLatch = false;
  37.       }
  38.       Keyboard.write(userstring[i]);
  39.     }
  40.    
  41.   }
  42. }
  43. void korPrintln(char* userstring){
  44.   korPrint(userstring);
  45.   Keyboard.write(KEY_RETURN);
  46. }
  47. void korWrite(char* userstring){
  48.   unsigned int unichar = 0;
  49.   byte utfchar[3] = {0,};
  50.  
  51.   utfchar[0] |= *(userstring+0);
  52.   utfchar[1] |= *(userstring+1);
  53.   utfchar[2] |= *(userstring+2);
  54.   utfchar[0] &= 0b00001111;
  55.   utfchar[1] &= 0b00111111;
  56.   utfchar[2] &= 0b00111111;
  57.  
  58.   unichar += utfchar[0];
  59.   unichar <<= 6;
  60.   unichar += utfchar[1];
  61.   unichar <<= 6;
  62.   unichar += utfchar[2];
  63.   if(unichar < 0xAC00){ //한글 자모
  64.     unichar -= 0x3131;
  65.    
  66.     char jamo[51][3] = {"r", "R", "rt", "s", "sw", "sg", "e", "E", "f", "fr", "fa", "fq", "ft", "fx", "fv", "fg", "a", "q", "Q", "qt", "t", "T", "d", "w", "W", "c", "z", "x", "v", "g", "k", "o", "i", "O", "j", "p", "u", "P", "h", "hk", "ho", "hl", "y", "n", "nj", "np", "nl", "b", "m", "ml", "l"};
  67.     //한글 자모          ㄱ   ㄲ   ㄳ    ㄴ   ㄵ    ㄶ    ㄷ   ㄸ   ㄹ   ㄺ    ㄻ    ㄼ    ㄽ    ㄾ    ㄿ    ㅀ    ㅁ   ㅂ   ㅃ   ㅄ    ㅅ   ㅆ   ㅇ   ㅈ   ㅉ   ㅊ   ㅋ   ㅌ   ㅍ   ㅎ   ㅏ   ㅐ   ㅑ   ㅒ   ㅓ   ㅔ   ㅕ   ㅖ   ㅗ   ㅘ    ㅙ    ㅚ    ㅛ   ㅜ   ㅝ    ㅞ    ㅟ    ㅠ   ㅡ   ㅢ    ㅣ  
  68.    
  69.     Keyboard.print(jamo[unichar]);
  70.   }
  71.  
  72.   else{ //완성형 한글
  73.     unichar -= 0xAC00;
  74.    
  75.     char chosung[19][2] = {"r", "R", "s", "e", "E", "f", "a", "q", "Q", "t", "T", "d", "w", "W", "c", "z", "x", "v", "g"};
  76.     //한글 초성             ㄱ   ㄲ   ㄴ   ㄷ   ㄸ   ㄹ   ㅁ   ㅂ   ㅃ   ㅅ   ㅆ   ㅇ   ㅈ   ㅉ   ㅊ   ㅋ   ㅌ   ㅍ   ㅎ
  77.     char jungsung[21][3] = {"k", "o", "i", "O", "j", "p", "u", "P", "h", "hk", "ho", "hl", "y", "n", "nj", "np", "nl", "b", "m", "ml", "l"};
  78.     //한글 중성              ㅏ   ㅐ   ㅑ   ㅒ   ㅓ   ㅔ   ㅕ   ㅖ   ㅗ   ㅘ    ㅙ    ㅚ    ㅛ   ㅜ   ㅝ    ㅞ    ㅟ    ㅠ   ㅡ   ㅢ    ㅣ
  79.     char jongsung[28][3] = {"", "r", "R", "rt", "s", "sw", "sg", "e", "f", "fr", "fa", "fq", "ft", "fx", "fv", "fg", "a", "q", "qt", "t", "T", "d", "w", "c", "z", "x", "v", "g"};
  80.     //한글 종성           (없음) ㄱ   ㄲ   ㄳ    ㄴ   ㄵ    ㄶ    ㄷ   ㄹ   ㄺ    ㄻ    ㄼ    ㄽ    ㄾ    ㄿ    ㅀ    ㅁ   ㅂ   ㅄ    ㅅ   ㅆ   ㅇ   ㅈ   ㅊ   ㅋ   ㅌ   ㅍ   ㅎ
  81.     //Chosung
  82.     Keyboard.print(chosung[unichar/588]); //초성 = unichar / 588
  83.    
  84.     //Jungsung
  85.     unichar %= 588;
  86.     Keyboard.print(jungsung[unichar/28]); //중성 = unichar / 28
  87.    
  88.     //Jongsung
  89.     unichar %= 28;
  90.     Keyboard.print(jongsung[unichar]); //종성 = unichar % 28
  91.   }
  92.   Keyboard.write(' ');
  93.   Keyboard.write(KEY_BACKSPACE);
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement