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가 출력되면 된다.
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
16.03.21 조승현 업무일지 시리얼페러럴/max3232/전송방식/dataoverrun/디파인거는법/sf&hw개념 (2) | 2016.03.22 |
---|---|
20160318_업무일지_정우민_펌웨어(시계2) (0) | 2016.03.22 |
후니의 네트워크 이야기 258~314 (0) | 2016.03.22 |
후니의 네트워크 이야기 2~257 (0) | 2016.03.22 |
20160322_박진한_업무일지_펌웨어 실습 (0) | 2016.03.22 |
20160321_김가연_업무일지_데이터시트, 시리얼통신 (0) | 2016.03.22 |
20163021-업무일지-이보원 펌웨어-usb 직접통신실습- (0) | 2016.03.22 |
20160321_노유찬_펌웨어실습(serial통신) (0) | 2016.03.22 |