코스웨어/13년 스마트컨트롤러
[LCD 사용자정의와 롬에 저장된 폰트 조합]by 남경
알 수 없는 사용자
2013. 5. 29. 13:52
text LCD에 사용자정의 한글 띄우기

LCD모듈 datasheet에 보면 CG RAM 주소를 지정하여 5 * 7 도트 크기의 사용자정의 글자를 8개 저장할 수 있으며,
5 * 10 크기는 4개까지 저장할 수 있다.
저장 후에 LCD모듈에 데이터를 쓰기 위해 RS와 연결된 핀을 활성화(LCD_DATA_write)하고,
LCD 모듈의 데이터 버스에 1~8까지의 값을 넣으면 우리가 저장한 글자 중 한 개를 출력할 수 있다.
하지만, 한글을 여러개 출력하고 싶을 때는 8글자 가지고는 부족하기 때문에,
LCD모듈의 롬에 저장되어 있는 폰트 섞어서 씀으로서 이를 해결하였다.
그 결과, 어설프게나마 긴 문장을 표현할 수 있었다~

소스코드
#include <stdio.h>
void LCD_Init() { PIO_OER = LCD_RS|LCD_RW|LCD_EN|LCD_BS; PIO_PER = LCD_RS|LCD_RW|LCD_EN|LCD_BS; LCD_CMD_Write(LCD_Func); LCD_CMD_Write(LCD_Entry); LCD_CMD_Write(LCD_Cursir); LCD_CMD_Write(LCD_Display); LCD_CMD_Write(LCD_Clear); LCD_CMD_Write(LCD_Home);
return; }
void LCD_CMD_Write(unsigned char ucDATA) { volatile unsigned int icnt; PIO_CODR = LCD_EN; //CODR이므로 EN을 0V로 PIO_CODR = LCD_RS; // RS를 0V로 PIO_CODR = LCD_RW; // RW를 0V로 for(icnt = 0; icnt < LCD_delay-LCD_delay1; ++icnt); PIO_SODR = LCD_EN; //CODR이므로 EN을 3.3V로 for(icnt = 0; icnt < LCD_delay-LCD_delay2; ++icnt); PIO_CODR = LCD_BS; PIO_SODR = ucDATA << 16; for(icnt = 0; icnt < LCD_delay-LCD_delay3; ++icnt); PIO_CODR = LCD_EN; for(icnt = 0; icnt < LCD_delay-LCD_delay4; ++icnt); return; }
void LCD_DATA_Write(unsigned char ucDATA) { volatile unsigned int icnt; PIO_CODR = LCD_EN; //CODR이므로 EN을 0V로 PIO_SODR = LCD_RS; // RS를 3.3V로 PIO_CODR = LCD_RW; // RW를 0V로 for(icnt = 0; icnt < LCD_delay-LCD_delay1; ++icnt); PIO_SODR = LCD_EN; //CODR이므로 EN을 3.3V로 for(icnt = 0; icnt < LCD_delay-LCD_delay2; ++icnt); PIO_CODR = LCD_BS; PIO_SODR = ucDATA << 16; for(icnt = 0; icnt < LCD_delay-LCD_delay3; ++icnt); PIO_CODR = LCD_EN; for(icnt = 0; icnt < LCD_delay-LCD_delay4; ++icnt);
return; } void LCD_Run() { volatile unsigned int iCnt; volatile unsigned int Han_gul[]={ 0x00, 0x04, 0x1f, 0x00, 0x04, 0x0a, 0x0a, 0x04, //ㅎ 0x00, 0x08, 0x08, 0x08, 0x18, 0x08, 0x18, 0x08, //ㅕ 0x00, 0x00, 0x00, 0x0e, 0x02, 0x0e, 0x08, 0x0e, //ㄹ 0x00, 0x04, 0x04, 0x0a, 0x11, 0x11, 0x00, 0x00, //ㅅ 0x00, 0x08, 0x08, 0x08, 0x0e, 0x08, 0x08, 0x08, //ㅏ 0x1f, 0x00, 0x0e, 0x02, 0x0e, 0x08, 0x0e, 0x00, //를 0x1c, 0x04, 0x1c, 0x10, 0x1c, 0x00, 0x00, 0x00, //ㄹ 0x1f, 0x04, 0x14, 0x14, 0x1f, 0x00, 0x00, 0x00}; ?//문
LCD_Init(); LCD_CMD_Write(0x40); for (iCnt = 0; iCnt < 64; ++iCnt) { LCD_DATA_Write(Han_gul[iCnt]); }
// 윗줄 LCD_CMD_Write(0x80); LCD_DATA_Write(0x00); // ㅎ LCD_CMD_Write(0x81); LCD_DATA_Write(0x01); // ㅕ LCD_CMD_Write(0x82); LCD_DATA_Write(0xbd); // 사용자정의 아님 : ㅈ LCD_CMD_Write(0x83); LCD_DATA_Write(0x48); // 사용자정의 아님 : H LCD_CMD_Write(0x84); LCD_DATA_Write(0x02); // ㄹ LCD_CMD_Write(0x86); LCD_DATA_Write(0x03); // ㅅ LCD_CMD_Write(0x87); LCD_DATA_Write(0x04); // ㅏ LCD_CMD_Write(0x88); LCD_DATA_Write(0xbd); // 사용자정의 아님 :ㅈ LCD_CMD_Write(0x89); LCD_DATA_Write(0x04); // ㅏ LCD_CMD_Write(0x8a); LCD_DATA_Write(0x21); // 사용자정의 아님 : ! LCD_CMD_Write(0x8b); LCD_DATA_Write(0xdb); // 사용자정의 아님 : ㅁ LCD_CMD_Write(0x8c); LCD_DATA_Write(0x4c); // 사용자정의 아님 : L LCD_CMD_Write(0x8d); LCD_DATA_Write(0x04); // ㅏ LCD_CMD_Write(0x8e); LCD_DATA_Write(0xcc); // 사용자정의 아님 : ㄱ LCD_CMD_Write(0x8f); LCD_DATA_Write(0x01); // ㅕ
// 아랫줄 LCD_CMD_Write(0xc1); LCD_DATA_Write(0x4c); // 사용자정의 아님 : L LCD_CMD_Write(0xc4); LCD_DATA_Write(0x05); // 를 LCD_CMD_Write(0xc7); LCD_DATA_Write(0x06); // ㄹ LCD_CMD_Write(0xcb); LCD_DATA_Write(0x07); // 문 LCD_CMD_Write(0xcd); LCD_DATA_Write(0xdf); // 사용자정의 아님 : ㅁ LCD_CMD_Write(0xcf); LCD_DATA_Write(0x6f); // 사용자정의 아님 : ㅇ
return; } int main() { void LCD_Run(); return 0; } |