이제는 다음과 같은 함수로 간단이 화면에 한글과 영문을 같이 표현 한다.
printFont( "아름다운 KOREA 한글",5,100,1);
void printFont( String s, int x, int y , int m ) // m은 배율이다. { myGLCD.setTextSize(2*m); int size=sizeof(font) /sizeof(Font); // font의 갯수를 구함 C#의 length 같은 것이 없어서 // 전체 font의크기 / Font 구조체 사이즈 = font갯수 for( int p=0; p <s.length() ;p++) { if( isAscii(s[p]) ) // Byte가 ASCII이면 ( 최상위 bit가 0(양수) : 최상위 비트 1 (음수)이면 한글 첫Byte { // 그다음2byte와 3Byte로 한글 UTF-8코드 myGLCD.setCursor(x,y); // 참고로 한글 UniCode는 2Byte myGLCD.println(s[p]); // 기존 함수로 영문출력 참고로 한극 EUC-KR(CP949)은 2Byte x+=16*m; } else for( int f=0; f < size; f++) // 폰트 수 만큼 검색 if( font[f].s== s.substring(p,p+3) ) // Arduino 스케치는 UTF-8( 한글 3byte ) 사용 { // /p, p+1 ,p+2 가 한글 UTF-8코드 drawFont( font[f].f , x, y, m) ; x+=16*m; } } } |
그리고 폰트 저장도 포인터 배열 대신 구조체를 사용 했습니다. -
struct Font { String s; // 폰트글자 unsigned short f[16] ; // 폰트 }; |
폰트 만드는 영상입니다.(클릭) 폰트메이커 ver 1.5 ( ver 2.0으로 업데이트됨 )
출력영상입니다. 한글영문이 같이 출력됩니다.
아두이노 소스코드입니다.
#include <Adafruit_GFX.h> // TFT LCD 사용을 위해 그냥 Copy하여 사용할 코드들 입니다. #include <UTFTGLUE.h> UTFTGLUE myGLCD(0x9488,A2,A1,A3,A4,A0); ///////////////////// TFT |
|
#define cBLACK #define cWHITE #define cRED #define cGREEN #define cBLUE #define cSILVER #define cGRAY #define cMAROON #define cYELLOW #define cOLIVE #define cLIME #define cAQUA #define cTEAL #define cNAVY #define cFUCHSIA #define cPURPLE #define cTRANSPARENT |
0x0000 0xFFFF 0xF800 0x0400 0x001F 0xC618 0x8410 0x8000 0xFFE0 0x8400 0x07E0 0x07FF 0x0410 0x0010 0xF81F 0x8010 0xFFFFFFFF |
//---- 폰트 만들기 프로그램 ver 1.5 로 만든 코드임------------ struct Font // 폰트구조체 { String s; // 폰트글자 unsigned short f[16]; // 폰트 }; Font font[]={ "강",{ 0x0000, 0x3F08, 0x0088, 0x0088, 0x008E, 0x0108, 0x0608, 0x7808, 0x0008, 0x03C0, 0x0C30, 0x1008, 0x1008, 0x0C30, 0x03C0, 0x0000 }, "국",{ 0x0000, 0x1FF8, 0x0004, 0x0004, 0x0004, 0x0008, 0x3FFE, 0x0080, 0x0080, 0x0080, 0x1FF8, 0x0004, 0x0004, 0x0004, 0x0004, 0x0000 }, "나",{ 0x0000, 0x0008, 0x2008, 0x2008, 0x2008, 0x2008, 0x200E, 0x2008, 0x2008, 0x2008, 0x2068, 0x1F88, 0x0008, 0x0008, 0x0008, 0x0000 }, "다",{ 0x0000, 0x0008, 0x1F88, 0x2008, 0x2008, 0x2008, 0x200E, 0x2008, 0x2008, 0x2008, 0x2008, 0x2068, 0x1F88, 0x0008, 0x0008, 0x0000 }, "대",{ 0x0000, 0x0024, 0x1F24, 0x2024, 0x2024, 0x2024, 0x2024, 0x203C, 0x2024, 0x2024, 0x2024, 0x21A4, 0x1E24, 0x0024, 0x0024, 0x0000 }, "라",{ 0x0000, 0x0008, 0x3F08, 0x0088, 0x0088, 0x0088, 0x008E, 0x1F08, 0x2008, 0x2008, 0x2008, 0x2038, 0x1FC8, 0x0008, 0x0008, 0x0000 }, "름",{ 0x0000, 0x1FF8, 0x0004, 0x0FF8, 0x1000, 0x0FFC, 0x0000, 0x3FFE, 0x0000, 0x0000, 0x1FFC, 0x1004, 0x1004, 0x1004, 0x0FF8, 0x0000 }, "리",{ 0x0000, 0x0008, 0x3F08, 0x0088, 0x0088, 0x0088, 0x0088, 0x1F08, 0x2008, 0x2008, 0x2008, 0x2038, 0x1FC8, 0x0008, 0x0008, 0x0000 }, "민",{ 0x0000, 0x3F88, 0x2088, 0x2088, 0x2088, 0x2088, 0x2088, 0x2088, 0x3F88, 0x0008, 0x0008, 0x1000, 0x1000, 0x1000, 0x0FF8, 0x0000 }, "산",{ 0x0000, 0x0408, 0x0408, 0x0408, 0x0C08, 0x0A0E, 0x1108, 0x2088, 0x4048, 0x0008, 0x0008, 0x1000, 0x1000, 0x1000, 0x0FF8, 0x0000 }, "아",{ 0x0000, 0x0008, 0x0E08, 0x1108, 0x1108, 0x2088, 0x208E, 0x2088, 0x2088, 0x2088, 0x1108, 0x1108, 0x0E08, 0x0008, 0x0008, 0x0000 }, "우",{ 0x0000, 0x03E0, 0x0C18, 0x1004, 0x1004, 0x0C18, 0x03E0, 0x0000, 0x3FFE, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0000 }, "운",{ 0x0000, 0x03E0, 0x0C18, 0x1004, 0x0C18, 0x03E0, 0x0000, 0x0000, 0x3FFE, 0x0080, 0x0080, 0x1080, 0x1000, 0x1000, 0x0FFC, 0x0000 }, "한",{ 0x0000, 0x1F08, 0x0008, 0x7FC8, 0x0008, 0x1F0E, 0x2088, 0x2088, 0x2088, 0x1F08, 0x0008, 0x1000, 0x1000, 0x1000, 0x0FF8, 0x0000 } }; // -------폰 트 끝----------------------------------------- |
|
void setDot( int col, int row, int x, int y,int mx,int my) { // (문자좌표)x,y (bit 행열좌표) col,row에 가로 mx개의 점, 세로 my개의 점 그리기 // 시작점 TopLeft 좌표는 x+col*mx y+row*my임 for(int dx=0 ; dx< mx ;dx++) // 사각형의 가로 bit(dot) for( int dy=0;dy<my;dy++) // 사각형의 세로 bit myGLCD.drawPixel( x+col*mx+dx ,y+row*my+dy ); } void drawFont(unsigned short font[], int x, int y, int m) //오버로드 함수 { drawFont( font, x, y, m , m, true);} void drawFont(unsigned short font[], int x, int y ) //오버로드 함수 { drawFont( font, x, y, 1 , 1, true);} void drawFont(unsigned short font[], int x, int y, int mx ,int my) //오버로드 함수 { drawFont( font, x, y, mx , my, true);} void drawFont(unsigned short font[], int x, int y, int mx , int my, bool Direction) { // x,y에 가로 mx배 세로 my배로 Direction이 true이면 정상 false이면 역상으로 출력 unsigned int buff; for( int row=0; row<16; row++) // 폰트 bit의 행 { if( Direction ) buff=font[row]; else buff=font[15-row]; for(int col=0;col<16;col++) // 폰트 bit의 열 { if( buff & 0b1000000000000000 ) setDot( col, row, x,y, mx, my); buff <<= 1; // 열 , 행 , 가로표시좌표, 세로표시좌표, 가로배율, 세로배율 } } } void printFont( String s, int x, int y , int m ) { myGLCD.setTextSize(2*m); int size=sizeof(font) /sizeof(Font); // font의 갯수를 구함 C#의 length 같은 것이 없어서 // 전체 font의크기 / Font 구조체 사이즈 = font갯수 for( int p=0; p <s.length() ;p++) // 글자수 만큼 byte 검색 { if( isAscii(s[p]) ) // Byte가 ASCII이면 ( 최상위 bit가 0(양수) : 최상위 비트 1 (음수)이면 한글 첫Byte { // 그다음2byte와 3Byte로 한글 UTF-8코드 myGLCD.setCursor(x,y); // 참고로 한글 UniCode는 2Byte myGLCD.println(s[p]); // 기존 함수로 영문출력 참고로 한극 EUC-KR(CP949)은 2Byte x+=16*m; } else for( int f=0; f < size; f++) // 폰트 수 만큼 검색 if( font[f].s== s.substring(p,p+3) ) // Arduino 스케치는 UTF-8( 한글 3byte ) 사용 { // p, p+1 ,p+2 가 한글 UTF-8코드 drawFont( font[f].f , x, y, m) ; x+=16*m; p+=2; // 2byte 이동 break; // for f 탈출 } } } //--------------------------------------------------------------------------------------------- void setup() { pinMode(A0, OUTPUT); digitalWrite(A0, HIGH); myGLCD.InitLCD(); myGLCD.setRotation(3); myGLCD.clrScr(); myGLCD.setColor(cYELLOW); printFont( "아름다운 Korea 강산",5,100,1); myGLCD.setColor(cRED); printFont( "우리나라Korea대한민국 ",5,200,2); } void loop() { } |
'프로젝트 > TFT LCD 한글 출력 (아두이노)' 카테고리의 다른 글
Arduino TFT LCD 한글 출력 소스 CODE(1) (0) | 2022.08.06 |
---|---|
아두이노 한글 폰트 Code 자동생성 프로그램 ver 2.5 (0) | 2022.08.06 |
TFT LCD에서 한글 출력 출력소스 개선(3) (0) | 2022.08.04 |
TFT LCD에서 특정 폰트만 추출하여 한글 출력 (2) (0) | 2022.08.01 |
TFT LCD에서 한글 출력 (1) (0) | 2022.07.30 |