728x90
#include <avr/io.h>
#include <util/delay.h>

#define  CLR   0x01      //Clear Display 명령
#define  HOME  0x02      //Return Home 명령 
#define  FNC   0x38      //Function Set 명령
                		 //Data Length = 8bit. 행수 2행


void LCD_PortSetting(void)
{
  DDRC = 0xFF;        //데이터 라인
  DDRD = 0xFF;        //0~2 제어핀 사용
  //D0: RS ,D1: R/W ,D2: EN
}

void IR_Write(unsigned char Data)  
{
  PORTD &= 0xFC;    //RS = 0, Write Enable
  _delay_us(1);    //Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04;    //Enable 활성화
  _delay_us(1);    //
  PORTC = Data;    //Data
  _delay_us(1);
  PORTD = 0b00000010;  //Disable, Read Mode  

}

void DR_Write(unsigned char Data)
{
  PORTD = 0x01;    //RS = 1, Write Enable
  _delay_us(1);    //Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04;    //Enable 활성화
  _delay_us(1);    //
  PORTC = Data;    //Data
  _delay_us(1);
  PORTD = 0b00000010;  //Disable, Read Mode  
}

void LCD_drive()
{
  _delay_ms(50);
  IR_Write(FNC);
  _delay_ms(5);
  IR_Write(FNC);
  _delay_us(100);
  IR_Write(FNC);
  _delay_ms(2);
  IR_Write(0x0E);	// Display On / Off, 	DDRAM, 커서 ON
  _delay_ms(2);  
  IR_Write(CLR);	// Display Clear
  _delay_ms(30);
  IR_Write(0x06);	// Entry Mode Set, 커서위치를 오른쪽으로 증가
  _delay_ms(2);
}

int main(void)
{
  LCD_PortSetting();
  LCD_drive();
  DR_Write(65);
  _delay_ms(2);
  DR_Write('D');

  while(1)
  {     
  }
  return 0;
}

Output :

LCD에 D 출력




#include <avr/io.h>
#include <util/delay.h>

#define CLR    0x01 // Return Home 명령
#define HOME  0x02 // Function Set 명령
#define FNC    0x38 // Data Length 8 bit 

void LCD_PortSetting(void)
{
  DDRC = 0xFF; // 데이터 라인
  DDRD = 0xFF; // 0 ~ 2 제어 핀 사용
  // 00: RS, 01: R/W, 02: En
}

void IR_Write(unsigned char Data)
{
  PORTD &= 0xFC; // RS = 0, Write Enable

  _delay_us(1); // Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04; // En

  _delay_us(1);
  PORTC = Data;

  _delay_us(1);
  PORTD = 0b00000010; // Disable. Read Mode
}

void DR_Write(unsigned char Data)
{
  PORTD = 0x01; // RS = 1, Write Enable

  _delay_us(1); // Enable 까지 최소 대기 시간 40ns
  PORTD |= 0x04; // En

  _delay_us(1);
  PORTC = Data;

  _delay_us(1);
  PORTD = 0b00000010; // Disable. Read Mode
}

void LCD_drive()
{
  _delay_ms(50); // 
  IR_Write(FNC);

  _delay_ms(5);
  IR_Write(FNC);
  
  _delay_us(100);
  IR_Write(FNC);
  _delay_ms(2);

  IR_Write(0x0E); // Display on/off DDRAM, 커서를 화면에 표시
  _delay_ms(2);


  IR_Write(CLR); // Display Clear
  _delay_ms(30);

  IR_Write(0x06); // Entry module set 명령. 오른쪽으로 커서 이동.
  _delay_ms(2);
}

void LCD_CHAR(unsigned char a)
{
  _delay_ms(1); // 명령어 쓰기 전 일정 시간 지연
  DR_Write(a); // 사유: Busy Flage 확인 대용
}

void cursor_HOME(void)
{
  IR_Write(0x02);
  _delay_ms(2);
}

void Display_Shift(unsigned char p)
{
  if(p == 1) // 표시화면 전체를 오른쪽으로 이동.
  {
    IR_Write(0x1C); // 화면 표시 내용을 오른쪽으로 이동.
    _delay_us(50);
  }

  else if(p == 0)
  {
    IR_Write(0x18); // 화면 표시 내용을 오른쪽으로 이동.
    _delay_us(50);    
  }
}

void LCD_STR(unsigned char *str)
{
  while(*str != 0)	// 0은 null, 값이 들어오면 
  {
    LCD_CHAR(*str);
    str++;
  }
}

void Position(unsigned char col, unsigned char row)	// 열과 행 
{
	IR_Write(0x80 | row+col*(0x40));
}

int main(void)
{
  LCD_PortSetting();
  LCD_drive();
  /*
  DR_Write(65);
  DR_Write('B');
  */
  Position(1,1);
  LCD_STR("Hello");
  //Display_Shift(1);

  while(1)
  {

  }

  return 0;
}

Output :

LCD에 Hello 출력







'Study > Embedded' 카테고리의 다른 글

7/5 LCD 제어  (0) 2016.07.05
5/26 업무일지 PC PWM을 이용한 LED 밝기 조절  (0) 2016.05.26
2016-05-17 업무일지-7 segment  (0) 2016.05.17
7 Segment 출력(proteus시뮬)  (0) 2016.05.16
5/12 avr 업무일지  (0) 2016.05.12

+ Recent posts