우리가 사용하는 것은 분주비 64 카운터 250이다.
LCD에서 A가 계속 찍히는 코드
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; 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구간
}
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 //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__
main.c
#include "main.h"
#include "lcd.h"
int main(void)
{
LCD_Init();
LCD_Data('A');
while(1)
{
}
return 0;
}
main.h
#ifndef __MAIN_H__ //여긴 그냥 써도 됨. |
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
20160314 송찬호 업무일지 펌웨어 (0) | 2016.03.21 |
---|---|
안드로이드 오라클 JAVA 걷어내는중이라네요 (0) | 2016.03.21 |
2016_03_21_펌웨어_노태경_업무일지 (0) | 2016.03.21 |
20160318-이보원-업무일지-펌웨어(전역변수 공용) (0) | 2016.03.21 |
2016_03_21_리눅스명령어_업무일지_노태경 (0) | 2016.03.21 |
20160316_박진한_업무일지_펌웨어 LCD 글씨 (0) | 2016.03.21 |
20160315_박진한_업무일지_펌웨어 LCD 기초 (0) | 2016.03.21 |
20160318_송민규_업무일지_펌웨어실습 (0) | 2016.03.21 |