LuvSea

텍스트형 LCD 모듈 응용 프로그램을 이용한 사용자 정의문자 출력 본문

sTudy

텍스트형 LCD 모듈 응용 프로그램을 이용한 사용자 정의문자 출력

사랑海 2009. 6. 4. 19:49
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[CG ROM에 저장되어 있는 기본 문자 폰트]
▶ 사용자가 화면에 표시하고자 하는 문자 코드를 DD RAM에 써주기만 하면 이것에 해당하는 폰트가 자동으로 CG ROM에서 찾아져서 화면에 디스플레이 된다.
            ▶상위비트 하위비트 H=1 L=0
   ex)A = LHLL LLLH 》0100 0001 》65(A의 ASCII값과 일치)

☞기본 문자 이외의 문자(한글)를 화면에 표시 하려면 사용자 정의 문자를 만들어 사용
 CG RAM을 사용하며 5*7 도트를 사용하는 경우 최대 8문자까지 정의
 5*10 도트를 사용하는 경우 최대 4문자까지 정의

▶사용자 정의 문자 지정방법◀
16진수로 0x08, 0x0c, 0x0e, 0x0f, 0x0e, 0x0c, 0x08, 0x00으로 배열로 찍어주면 되는데
원리는 아래와 같다.
x x x 0 1 0 0 0                 8bit 중 5bit만 사용
x x x 0 1 1 0 0                 x는 don't care
x x x 0 1 1 1 0                 
x x x 0 1 1 1 1 
x x x 0 1 1 1 0                 '▶' 이렇게 나옴
x x x 0 1 1 0 0
x x x 0 1 0 0 0
x x x 0 0 0 0 0

▶사용자 정의 문자를 사용한 예제◀


#include "project.h"

void LCD_Instruction(unsigned char ins);
void LCD_Data(unsigned char data);
void LCD_Init();
void LCD_Myfont();

volatile unsigned int iCount = 0;
volatile unsigned int uiCount = 0;

int main()
{  
  LCD_Init();
  LCD_Instruction(0x80);    // DDRAM Address
  
  LCD_Data(0x00);
  LCD_Data(0x01);
  LCD_Data(0x02);
  LCD_Data(0x03);
    
  return 0;
  
}

void LCD_Myfont()
{
  unsigned int i;
 
 // LCD의 첫번째 라인의 시작위치는 기본 0x80이며 시작 문자의 위치는 조절 가능하다.
  // 두번째 라인의 시작위치는 0xC0이며, 이것 역시 시작위치의 조절이 가능하다.
  unsigned int font[] = {
    0x090x150x150x150x000x080x0F, 0x00,      // '신' 0x00
    0x000x1F, 0x040x040x0A, 0x110x000x00,      // 'ㅈ' 0x01
    0x000x140x140x1C, 0x140x140x000x00,      // 'ㅐ' 0x02
    0x040x1F, 0x0E, 0x110x0E, 0x040x1F, 0x00 };    // '호' 0x03
    
// 배열에 저장된 문자를 출력하기 위한 반복문
  LCD_Instruction(0x40);
  for(i = 0; i < 32; i++)
  {
    LCD_Data(font[i]);
  }
}

void LCD_Init()
{
  *PIO_PER = DBUS | RS | RW | EN | BL;  // 병렬입력 활성화
  *PIO_OER = DBUS | RS | RW | EN | BL;  // 병렬출력 활성화
  
  LCD_Myfont();
  LCD_Instruction(0x01);    // Clear Display 
  LCD_Instruction(0x0C);    // Display On
  LCD_Instruction(0x38);    // Function Set.. 5x7
  LCD_Instruction(0x06);    // Entry Mode On
}

void LCD_Instruction(unsigned char ins)
{

    *PIO_CODR = EN;      // 클리어비트에 1을 넣어 LCD비활성화
    *PIO_CODR = RS;      // 인스트럭션 레지스터 사용        
                // High : Data,    Low : Instruction
    *PIO_CODR = RW;      // Write 선택

    for(uiCount = 0; uiCount < 100000; uiCount++);  // 딜레이
    
    *PIO_SODR = EN;      // LCD 활성화

    for(uiCount = 0; uiCount < 100000; uiCount++);  // 딜레이

    *PIO_CODR = DBUS;    // DBUS Clear
    *PIO_SODR = ins;    // BUS에 8Bit를 쓴다.

    for(uiCount = 0; uiCount < 100000; uiCount++);  // 딜레이

    *PIO_CODR = EN;      // EN을 High에서 Low로 LCD 비활성화
    
    for(uiCount = 0; uiCount < 100000; uiCount++);  // 딜레이
}

void LCD_Data(unsigned char data)
{

    *PIO_CODR = EN;      // 클리어비트에 1을 넣어 LCD비활성화
    *PIO_SODR = RS;      // 인스트럭션 레지스터 사용        
                // High : Data,    Low : Instruction
    *PIO_CODR = RW;      // Write 선택

    for(uiCount = 0; uiCount < 10000; uiCount++);  // 딜레이
    
    *PIO_SODR = EN;      // LCD 활성화

    for(uiCount = 0; uiCount < 10000; uiCount++);  // 딜레이

    *PIO_CODR = DBUS;    
    *PIO_SODR = data;

    for(uiCount = 0; uiCount < 10000; uiCount++);  // 딜레이

    *PIO_CODR = EN;
    
    for(uiCount = 0; uiCount < 10000; uiCount++);  // 딜레이
}
Comments