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

20160316-업무일지-허도경-펌웨어 실습 LCD

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

LCD


위를 이용하여 Atmega2560과 LCD를 연결한다.

GND(0V)와 VDD(+5.0V)는 Atmega2560의 어떤 GND(0V)와 VDD(+5.0V)에 연결하여도 상관없다.(No.1,16)->0V (No.2,15)->5V

하지만 기계에 따라 15와 16이 바뀐 경우도 있으니 확인 해야한다.

3번역시 마찬가지로 Atmega2560의 아무 GND(0V)와 연결하면 된다.

No.4~6은 Atmega2560 PORTC(J5)에 8개의 다리중 아무곳에 꽂아도 된다. 하지만 이것을 꽂을 때는 반드시 명령어를 주어야한다.

지금 밑의 명령어에는 5~7번 다리(PC4~6)를 쓰겠다고 명령을 내린 상태이다.

7~14는 보는데로 데이터 버스이다. 총 8bit의 데이터가 한번에 지나갈 수 있다. 연결은 번호 순서대로하여

Atmega2560 PORTA(J13)의 다리번호 순 대로 연결 시키면 된다.

-----------------------------------------------------------------------------------------------------------

LCD에 문자출력 명령어

lcd.c파일

#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; 3000>uiCnt; ++uiCnt);  //위에 네줄 지속시키는 소스.

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

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

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

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN); 
 //BUS = ucInst;  //변함 없는 것들은 초기에만 입력하면 된다. 뒤로는 필요 없다.
 for(uiCnt = 0; 3000>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가 와야한다. 그래야 글이 출력이 안됨. 
     BUS = ucData;
     for(uiCnt = 0; 3000>uiCnt; ++uiCnt);  //위에 네줄 지속시키는 소스.

//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
//CTL = CTL & ~(1<<EN);
//BUS = ucData;

for(uiCnt = 0; 3000>uiCnt; ++uiCnt);   //B구간

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

//CTL = CTL | (1<<RS);
//CTL = CTL & ~(1<<RW);
CTL = CTL & ~(1<<EN); 
//BUS = ucData;

for(uiCnt = 0; 3000>uiCnt; ++uiCnt);   //D구간

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

}

void LCD_STR(const char * cString)
{
     while(0!=*cString)
    {
        LCD_Data (*cString);
          ++cString;
     }
 

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

void LCD_Init(void);
//void LCD_Inst(void);
void LCD_Inst(unsigned char ucInst);
void LCD_Data(unsigned char ucData);
void LCD_STR(const char * cString);

#define LCD_CLR      0x01
#define LCD_HOME   0x02 //or 0X03
#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

main.c파일

#include "main.h"
#include "lcd.h"
int main(void)
{
 LCD_Init();
 //LCD_Data('A');
 LCD_STR("APPLE");
 while(1);
 

 return 0;
}

main.h파일

#ifndef __MAIN_H__
#define __MAIN_H__


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

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

#define EICRA  (*((volatile unsigned char *)0x69))
#define EICRB (*((volatile unsigned char *)0x6A))
#define SREG  (*((volatile unsigned char *)0x5F))
#define EIMSK (*((volatile unsigned char *)0x3D))
#define EIFR  (*((volatile unsigned char *)0x3C))

#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" ::)
#define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: )

void Init(void);
void Pont_Init(void);
void INT_Init(void);

void __vector_1 (void) __attribute__((signal, used, externally_visible));   //INT0
void __vector_2 (void) __attribute__((signal, used, externally_visible));

#endif //__MAIN_H__


위를 구동하였을 때 LCD에 APPLE가 출력되면 된다.


728x90