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

20160316-이보원-ATMega2560 -LCD 실험 2

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



ATMega2560 -LCD 실험 2





-ATMega- lcd 연결 -

 

 Symbol

 PIN

 1

 VSS

 GND

 2

 VDD

 5V

 3

 V0

 GND

 4

 RS

 PC4

 5

 R/W

 PC5

 6

 E

 PC6

 7~14

 DB0~DB7

 PA0~PA7

 15

 LEDA

 GND

 16

 LEDK

 5V







#include "lcd.h"

void LCD_Init(void)
{
 DDRC = (1<<RS)|(1<<RW)|(1<<EN); //C포트 3개 열기.(방향지정)
 DDRA = 0xff; //다 열어야 하므로
 CTL = (0<<RS)|(0<<RW)|(0<<EN); //열었던 C포트 3개 초기화(Low), 안 쓰는 상태로 만들기
 BUS = 0x00; //BUS도 0으로 만드는 작업.

 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);  //원하는 자리에 0을 넣고 싶을 때. 11111111 -> 00010000(1>>RS).... 11111111 & 11101111(~) => 11101111
 CTL = CTL & ~(1<<RW); //high, low 무엇이 와도 상관없다.
 CTL = CTL & ~(1<<EN);  //반드시 low가 와야한다. 그래야 글이 출력이 안됨.  0이나 1와 와야하는 이유?
 BUS = ucInst;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);  //위에 네줄 지속시키는 소스.

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN);
 //BUS = ucInst;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //B구간

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 CTL = CTL | (1<<EN);  //여기만 1로 바꿔주면 됨. 여기만 low로 바뀌니까. Enable 신호가 들어오면 LCD가 켜진다.
 //BUS = ucInst;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //C구간

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 CTL = CTL & ~(1<<EN); 
 //BUS = ucInst;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //D구간

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN); 
 //BUS = ucInst;  //변함 없는 것들은 초기에만 입력하면 된다. 뒤로는 필요 없다.
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //E구간
 
}

void LCD_Data(unsigned char ucData)
{
 volatile unsigned int uiCnt;

 CTL = CTL | (1<<RS);  //원하는 자리에 0을 넣고 싶을 때. 11111111 -> 00010000(1>>RS).... 11111111 & 11101111(~) => 11101111
 CTL = CTL & ~(1<<RW); //high, low 무엇이 와도 상관없다.
 CTL = CTL & ~(1<<EN);  //반드시 low가 와야한다. 그래야 글이 출력이 안됨.  0이나 1와 와야하는 이유?
 BUS = ucData;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);  //위에 네줄 지속시키는 소스.

 //CTL = CTL | (1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN);
 //BUS = ucData;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //B구간

 //CTL = CTL | (1<<RS);
 //CTL = CTL & ~(1<<RW);
 CTL = CTL | (1<<EN);  //여기만 1로 바꿔주면 됨. 여기만 low로 바뀌니까. Enable 신호가 들어오면 LCD가 켜진다.
 //BUS = ucData;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //C구간

 //CTL = CTL | (1<<RS);
 //CTL = CTL & ~(1<<RW);
 CTL = CTL & ~(1<<EN); 
 //BUS = ucData;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //D구간

 //CTL = CTL | (1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN); 
 //BUS = ucData;  //변함 없는 것들은 초기에만 입력하면 된다. 뒤로는 필요 없다.
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //E구간
 
}

==================================================================================

#ifndef __LCD_H__
#define __LCD_H__

#include "main.h"

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

#define BUS PORTA
#define CTL PORTC //control line

void LCD_Init(void);
void LCD_Inst(unsigned char ucInst);
void LCD_Data(unsigned char ucData);

#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

#endif //__LCD_H__

===================================================================================

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

int main(void)
{
 LCD_Init();
 LCD_Data('L');
 LCD_Data('e');
 LCD_Data('e');
        LCD_Data(' ');
 LCD_Data('B');
 LCD_Data('o');
 LCD_Data(' ');
 LCD_Data('W');
 LCD_Data('O');
 LCD_Data('n');

 while(1)
 {

 }

 return 0;
}

===================================================================================

#ifndef __MAIN_H__ //여긴 그냥 써도 됨.
#define __MAIN_H__ //나중에 이름이 중복될까봐.

void Init(void);
void Port_Init(void);
void INT_Init(void);

#define PINA  (*((volatile unsigned char *)0x20))
#define DDRA  (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))

#define PINC   (*((volatile unsigned char *)0x26))
#define DDRC  (*((volatile unsigned char *)0x27))
#define PORTC  (*((volatile unsigned char *)0x28))

#define EICRA  (*((volatile unsigned char *)0x69))
#define EICRB  (*((volatile unsigned char *)0x6A))
#define EIMSK  (*((volatile unsigned char *)0x3D))

#define SREG  (*((volatile unsigned char *)0x5F))

#define INT7 7
#define INT6 6
#define INT5 5
#define INT4 4
#define INT3 3
#define INT2 2
#define INT1 1
#define INT0 0

#define ISC7 6
#define ISC6 4
#define ISC5 2
#define ISC4 0
#define ISC3 6
#define ISC2 4
#define ISC1 2
#define ISC0 0

#define sei()   __asm__ __volatile__ ("sei" ::) //7번비트만 1로 만들어줌.어셈블리코드
#define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: )

void __vector_1(void) __attribute__((signal, used, externally_visible)); //인터럽트 신호를 받는다,사용된다,외부에서 이걸 볼 수 있어야한다.(호출가능하다) INT0를 뜻함.
void __vector_2(void) __attribute__((signal, used, externally_visible)); //인터럽트 신호를 받는다,사용된다,외부에서 이걸 볼 수 있어야한다.(호출가능하다) INT1를 뜻함.

#endif //__MAIN_H__

>실습 결과!!!





728x90