본문 바로가기

AVR

TEXT LCD 제어 실습

나만의 소스를 만들어 보았다.
다른 인터넷에 있는 소스와 별로 다른 것은 없지만
그래도 내가 알아보기 쉽도록 소스를 수정하고
다시 만들어 보았다.



#include <avr/io.h>
#include <stdio.h>

/***** 포트가 바뀔 경우 여기에서 수정 ******/

//LCD의 4,5,6번의 포트
#define LCD_PORT_CONTROL PORTA
#define LCD_DDR_CONTROL DDRA

//LCD의 7~14번의 포트
#define LCD_PORT_DATA PORTB
#define LCD_DDR_DATA DDRB

/***** Delay 함수 ******/

//delay 함수로 #include<avr/delay.h> 보다 나은것 같음
//이 소스는 윤덕용 선생님의 책을 인용한 것임

void Delay_us(int time_us)
{
 int volatile i;

 for(i=0; i<time_us; i++){ // 4 cycle +
  asm volatile("PUSH R0"); // 2 cycle +
  asm volatile("POP R0"); // 2 cycle + = 8 cycle = 1us for 8Mhz
  asm volatile("PUSH R0"); // 2 cycle +
  asm volatile("POP R0"); // 2 cycle + = 12 cycle for 11.0592MHZ
  asm volatile("PUSH R0"); // 2 cycle +
  asm volatile("POP R0"); // 2 cycle = 16 cycle = 1us for 16MHz
 }
}

void Delay_ms(int time_ms)
{
 int volatile i;

 for(i=0; i<time_ms; i++)
  Delay_us(1000);
}


/***** AVR 초기화 및 LCD에 대한 초기화 *****/

void Init(void)
{
 LCD_DDR_DATA=0xff;
  LCD_DDR_CONTROL=0x07;
 Delay_ms(50);

  Command(0x38);  // function set(데이터 선을 8 bit 다 사용, 2줄표시 , 5x7 dot 사용)
  Command(0x0C); // display control(표시(display) 켬, 커서(cursor) 끔)
  Command(0x06);  // entry mode set(CGRAM이나 DDRAM을 써넣거나 읽을 때
                        // 어드레스를 1증가 시키고 커서를 우로 이동, 시프트는 안함
  Command(0x01);  // clear display
  Delay_ms(2);
}

/***** LCD 명령어 레지스터에 쓰는 함수 *****/

void Command(unsigned char command)
{
  LCD_PORT_CONTROL = 0x00;   // E = 0, R/W=0, Rs = 0
  LCD_PORT_DATA = command;   // 명령어 출력
  LCD_PORT_CONTROL = 0x04;   // E = 1 , R/W=0, Rs = 0(LCD 동작)
  Delay_us(1);
  LCD_PORT_CONTROL = 0x00;    // E = 0, R/W=0, Rs = 0
  Delay_us(50);
}

/***** LCD 데이터 레지스터에 쓰는 함수 *****/

void Data(unsigned char data)
{
  LCD_PORT_CONTROL = 0x01;   // E = 0, R/W=0, Rs = 1
  LCD_PORT_DATA = data;      // 데이터 내용 출력
  LCD_PORT_CONTROL = 0x05;   // E = 1, R/W=0, Rs = 1(LCD 동작)
  Delay_us(1);
  LCD_PORT_CONTROL = 0x01;   // E = 0, R/W=0, Rs = 1
  Delay_us(50);
}

/***** LCD에 글자 출력 함수 *****/

void String( unsigned char *string)
{
  while(*string != '\0')
  {
    Data(*string);
    string++;
  }
}


/***** 글자 고정 출력 MAIN *****/
int main(void)
{
  Init();                     
  while(1)
  {
   Command(0x80); // 첫줄 사용
    String("  PURESTARMAN  ");
    Delay_ms(1000);
 Command(0xC0); // 두번째 줄 사용
    String("   2009/07/15   ");
    Delay_ms(2000);
  }
}

/***** 글자 깜빡 출력 MAIN *****/

int main(void)
{
  Init();                     
  while(1)
  {
   Command(0x80); // 첫줄 사용
    String("  PURESTARMAN  ");
 Command(0xC0); // 두번째 줄 사용
    String("   2009/07/15   ");
    Delay_ms(1000);
   Command(0x01);
 Delay_ms(1000);
  }
}


/***** 글자 시프트 출력 MAIN *****/

int main(void)
{
  unsigned char i;
                                   
  Init();                     
  while(1)
  {
   Command(0x80);
 String("PURESTARMAN LOVE!!HAVE GOOD TIME");
 Command(0xC0);
    String("HAVE GOOD TIME!!PURESTARMAN LOVE");
    Delay_ms(1000);

    for(i=0; i<16; i++)
 {                      // 왼쪽 시프트
      Command(0x18);
      Delay_ms(300);
    }
    Delay_ms(1000);

    for(i=0; i<16; i++)
 {                      // 오른쪽시프트
      Command(0x1C);
      Delay_ms(300);
    }
    Delay_ms(1000);
  }
}


/***** 글자 재 출력 MAIN *****/


int main(void)
{
  unsigned char i, j;
  char temp[16];

                                 
  Init();                     
  while(1)
  {
    Command(0x80);
    String("   GU GU DAN   ");
    for(i=2; i<=9; i++)
 {
      for(j=1; j<=9; j++)
   {
        sprintf( temp, "   %d * %d = %2d   ", i, j, i*j );
  Command(0xC0);
        String(temp);
        Delay_ms(500);
      }
  }
  }
}