본문 바로가기
코스웨어/16년 스마트컨트롤러

20160316_업무일지_정우민_펌웨어실습(LCD)

by 알 수 없는 사용자 2016. 3. 16.
728x90
반응형

펌웨어실습(LCD)

- LCD pin 설명



-H/W 연결

lcd

ATmega2560 

1

VSS 

 GND

 2

VDD

 VCC

 3

V0

 GND

 4

RS

 PC4

 5

 R/W

 PC5

 6

 E

 PC6

 7~14

 DB0~DB7

 PA0~PA7

 15

 LEDA

 VCC

 16

 LEDK

 GND

* RS, R/W, E 의 PIN 선택시 특별한 기능이 없는 PIN을 선택하는 것이 좋다.

(RS, R/W, E는 HIGH, LOW 신호만 줄 수 있으면 된다.)


-Write Mode 타이밍도



- lcd.h 파일

#ifndef __LCD_H__
#define __LCD_H__

#include "main.h"

#define RS  4
#define RW  5
#define EN  6

#define BUS  PORTA
#define CTL  PORTC

#define LCD_CLR 0x01
#define LCD_HOME 0x02
#define LCD_ENT 0x06               //S:0Shift OFF, I/D:1 Increase Mode
#define LCD_DSP 0x0f               //D:1 Display On C:1 Cursor on B:1 Blink On
#define LCD_CUR 0x14              //S/C:0 Shift Cursor OFF R/L:1
#define LCD_FUNC 0x38            //DL:1 Data length 8bit  N:1 2Line F:0 Font 5X8


void lcd_Init(void);
void lcd_Inst(unsigned char ucInst);
void lcd_Data(unsigned char ucData);

#endif //__LCD_H__



- lcd.c 파일


#include "lcd.h"

void lcd_Init(void)
{
 DDRC = (1<<RS) | (1<<RW) | (1<<EN);
 DDRA = 0xff;
 CTL= (0<<RS) | (0<<RW) | (0<<EN);
 BUS = 0x00;

 lcd_Inst(LCD_FUNC);     // 진행 절차
 lcd_Inst(LCD_DSP);
 lcd_Inst(LCD_ENT);
 lcd_Inst(LCD_CUR);
 lcd_Inst(LCD_CLR);
 lcd_Inst(LCD_HOME);
 
 
}

void lcd_Inst(unsigned char ucInst)
{
 volatile unsigned int uiCnt;
  
 
 CTL = CTL & ~(1<<RS);
 CTL = CTL & ~(1<<RW);
 CTL = CTL & ~(1<<EN);
 BUS = ucInst;
 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);

// 여기까지 datasheet 그래프 첫번째 (A) 신호를 코딩

 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);              //B구간

 CTL = CTL | (1<<EN);                                // EN만 변화함
 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);             //C구간

 CTL = CTL & ~(1<<EN);
 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);             // D구간

 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);             // E구간
          
}

void lcd_Data(unsigned char ucData)
{
 volatile unsigned int uiCnt;
  
 
 CTL = CTL | (1<<RS);                             //data모드, High
 CTL = CTL & ~(1<<RW);
 CTL = CTL & ~(1<<EN);
 BUS = ucData;
 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);          // 여기까지 datasheet 그래프 첫번째 (A) 신호

 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);         //B구간

 CTL = CTL | (1<<EN);                            // EN만 변화함
 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);         //C구간

 CTL = CTL & ~(1<<EN);
 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);         // D구간

 for(uiCnt=0 ; uiCnt<30000 ; ++uiCnt);         // E구간
          
}



main.c 파일


#include "main.h"
#include "lcd.h"

int main(void)
{
 lcd_Init ();
 lcd_Data ('d');            //문자 입력

 while(1)
 {
 
 }
 
 return 0;
}





728x90