2. ARM_LCD에 한글 띄우기

2013. 7. 19. 13:29스마트콘트롤러/AVR

▶ Main.c


#include "Lcd.h"

int main(void)
{  
  LCD_Init();
  
  volatile unsigned int iCnt;  // 2byte int  
  volatile unsigned int iCnt1;
  volatile unsigned int i;
  volatile unsigned int j;

  unsigned int pName[] = {
    0x090x170x150x010x000x020x050x02,    // '성' 0x00
    0x010x0B, 0x150x0B, 0x050x070x050x07,    // '엽' 0x01
    0x010x090x150x150x090x010x010x01,    // '이' 0x02
    0x050x070x020x000x0A, 0x0E, 0x040x00,    // '하트' 0x03    
    0x000x0A, 0x0E, 0x040x000x140x1C, 0x08};    // '하트' 0x04

  
    LCD_cmd_write(0x40);

      for(iCnt=0; iCnt<40; ++iCnt)
      {
        LCD_data_write(pName[iCnt]);
      }

        LCD_cmd_write(0x80);  // DD RAM Address (첫라인 첫위치)
        LCD_data_write(0x00);      // '성'

      LCD_cmd_write(0x81);  //
      LCD_data_write(0x01);      // '엽'

      LCD_cmd_write(0x82);  
      LCD_data_write(0x02);      // '이' 
  
      LCD_cmd_write(0x83);  
      LCD_data_write(0x03);      // '하트'

      LCD_cmd_write(0x84);
      LCD_data_write(0x04);      // '하트' 

    while(1)
    {  
      for(i=0 ;i<16;i++)
      {
        for(iCnt=0; iCnt<1000 ; iCnt++)
          for(iCnt1=0; iCnt1<300 ; iCnt1++);
        LCD_cmd_write(0x1C);
      }
      for(j=0; j<16;j++)
      {
        for(iCnt=0; iCnt<1000 ; iCnt++)
          for(iCnt1=0; iCnt1<300 ; iCnt1++);
        LCD_cmd_write(0x18);
      }

    }

  while(1) ;
  return 0;  
}




▶ Lcd.c


#include "Lcd.h"

void LCD_cmd_write(unsigned char ucdata)  // instruction data input
{
  volatile unsigned int iCnt;

  PORTD = ((PORTD) & (~LCD_EN));  // LCD_EN, LCD_RS, LCD_RW 모두 Low 시킴.
  PORTD = ((PORTD) & (~LCD_RS));
  PORTD = ((PORTD) & (~LCD_RW));
  
  for(iCnt=0;iCnt<LCD_DELAY-LCD_DELAY1;++iCnt);  // RS, RW 가 Low로 가기전까지, 15ns
                        // EN 이 High 되는 순간 전까지 딜레이
  PORTD = (PORTD | LCD_EN);  // LCD_EN을 High

  for(iCnt=0;iCnt<LCD_DELAY-LCD_DELAY2;++iCnt);  // EN이 올라가고 나서 DB가 변화를 가진다, 160ns

  PORTC = ucdata;  // 0x10101010, DB에 입력을 해줌!

  for(iCnt=0;iCnt<LCD_DELAY-LCD_DELAY3;++iCnt);  // DB에서 Input 되기전 까지 EN 을 유지, 60ns 

  PORTD = ((PORTD) & (~LCD_EN));  // EN 을 다시 Low 시켜준다.

  for(iCnt=0;iCnt<LCD_DELAY-LCD_DELAY4;++iCnt); // EN 을 제외한 나머지 RS,RW,DB는 유지, 35ns

  return ;
}


void LCD_Init(void)
{  
  DDRD = LCD_RS | LCD_RW | LCD_EN;    // RS, RW, EN 이 High
  DDRC = 0xFF;                      // 버스 열어둠.

  LCD_cmd_write(LCD_FUNC);  // DL 8bit High, N 2line High, F 5*7 dot High  
  LCD_cmd_write(LCD_ENTRY);  // 커서는 오른쪽 쉬프트, 화면은 고정
  LCD_cmd_write(LCD_CURSOR);  // S/C 커서 보이게, R/L 커서를 오른쪽으로
  LCD_cmd_write(LCD_DISPLAY);  // D 화면 ON, C 커서 OFF, B 커서자리블링크 커서 OFF
  LCD_cmd_write(LCD_CLEAR);  // 화면지우기
  LCD_cmd_write(LCD_HOME);  // 커서를 제일 앞으로
  

  return ;
}

void LCD_data_write(unsigned char ucdata)  // data input
{
  volatile unsigned int iCnt;
  
  PORTD = (PORTD | LCD_RS);           // 1을 넣어주면 LCD_RS 가 High 가 된다.
  PORTD = ((PORTD) & (~LCD_EN));
  PORTD = ((PORTD) & (~LCD_RW));
  
  for(iCnt=0;iCnt<LCD_DELAY-LCD_DELAY1;++iCnt);  // RS, RW 가 Low로 가기전까지,
                        // EN 이 High 되는 순간 전까지 딜레이
  PORTD = (PORTD | LCD_EN);          // EN을 High

  for(iCnt=0;iCnt<LCD_DELAY-LCD_DELAY2;++iCnt);  // EN이 올라가고 나서 DB가 변화를 가진다.

  PORTC = ucdata;          // DB에 입력을 해줌!

  for(iCnt=0;iCnt<LCD_DELAY-LCD_DELAY3;++iCnt);  // DB에서 Input 되기전 까지 EN 을 유지 

  PORTD = ((PORTD) & (~LCD_EN));    // EN 을 다시 Low 시켜준다.

  for(iCnt=0;iCnt<LCD_DELAY-LCD_DELAY4;++iCnt); // EN 을 제외한 나머지 RS,RW,DB는 유지

  return ;
}



▶ Lcd.h


#ifndef  _LCD_H_ 
#define  _LCD_H_

#define PINC    (*((volatile unsigned char *)0x26))
#define DDRC    (*((volatile unsigned char *)0x27))
#define PORTC  (*((volatile unsigned char *)0x28))
#define PIND    (*((volatile unsigned char *)0x29))
#define DDRD    (*((volatile unsigned char *)0x2A))
#define PORTD  (*((volatile unsigned char *)0x2B))

#define LCD_RS    (1<<7)   // PD7
#define LCD_RW    (1<<6)  // PD6
#define LCD_EN    (1<<5)  // PD5

#define LCD_CLEAR     0x01   // 0000 0001 (Lcd page13) 
#define LCD_HOME     0x02   // 0000 0010 (Lcd page13)
#define LCD_ENTRY     0x06   // 0000 0110 (Lcd page13) 글자 오른쪽 이동 (화면은 고정)
#define LCD_DISPLAY    0x0C  // 0000 1100 (Lcd page13) display ON, cursor OFF, Blink OFF
#define LCD_CURSOR     0x1C  // 0001 1100 (Lcd page13) 
#define LCD_FUNC     0x38  // 0011 1000 (Lcd page13) 8bit bus 1, 2 line 1, small font 0

#define LCD_DELAY     4000  // Max 160 ns
#define LCD_DELAY1     0  
#define LCD_DELAY2    0     
#define LCD_DELAY3     150  
#define LCD_DELAY4     50  

void LCD_init(void);
void LCD_cmd_write(unsigned char);
void LCD_data_write(unsigned char);

#endif // _LCD_H_ 


// p35 - p155 까지 AVR ATmega1280/2560 정복 밑줄 좍

'스마트콘트롤러 > AVR' 카테고리의 다른 글

0.AVR 초기설정  (0) 2013.07.19
1. AVR의 구조와 결선  (0) 2013.07.19
[ATmega 2560]LED 깜빡이기  (0) 2013.05.29