-
Notifications
You must be signed in to change notification settings - Fork 0
/
LCD_DISPLAY
91 lines (81 loc) · 2.46 KB
/
LCD_DISPLAY
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define RS PD5 // LCD 문자 디스플레이에 연결된 D포트의 핀 번호
#define RW PD6
#define E PD7
void gen_E_strobe(void)
{ volatile int i;
PORTD |= 1<<E; // E 신호를 High로
for(i=0; i<10; i++); // E 스트로브 신호를 일정 기간 High로 유지
PORTD &= ~(1<<E); // E 신호를 Low로
}
void wait_BusyFlag(void)
{ volatile int i;
unsigned char bf;
DDRC = 0x0; // C포트를 입력핀으로 설정
PORTD = (PORTD & ~(1<<RS)) | 1<<RW; // RS <- Low, RW <- High
do{
PORTD |= 1<<E; // E 신호를 High로
for(i=0; i<10; i++); // E 스트로브 신호를 일정 기간 High로 유지
bf = PINC & 1<<PC7; // busy flag를 읽어냄
PORTD &= ~(1<<E); // E 신호를 Low로
}while( bf ); // bf 값이 0이 아니면 busy, 0일 때까지 반복
}
void LCD_command(unsigned char data)
{ wait_BusyFlag(); // busy flag가 0이 될 때까지 대기
DDRC = 0xFF; // C포트를 출력핀으로 설정
PORTC = data; // data 출력
PORTD &= ~(1<<RS | 1<<RW); // RS <- 0, RW <-0
gen_E_strobe(); // E 스트로브 신호 만들기
}
void LCD_data_write(unsigned char data)
{ wait_BusyFlag();
DDRC = 0xFF;
PORTC = data;
PORTD = (PORTD | 1<<RS) & ~(1<<RW); // RS <- 1, RW <-0
gen_E_strobe();
}
void LCD_init(void)
{
DDRD |= 1<<RS | 1<<RW | 1<<E; // RS, RW, E 핀을 출력핀으로 설정
PORTD &= ~(1<<RS | 1<<E | 1<<RW); // 초기에 RS, E, RW <- 0
LCD_command(0x3C);
LCD_command(0x02);
LCD_command(0x01);
LCD_command(0x06);
LCD_command(0x0C);
}
void set_cursor(unsigned int row, unsigned int col)
{
if(row == 0)
row=0x80; // 첫번째 줄
else if (row == 1)
row=0xc0; // 두번째 줄
col+=row;
LCD_command(col);
}
// 함수 정의 : row, col 위치에서 문자열 str 을 LCD에 출력시킨다.
void LCD_str_write(unsigned int row, unsigned int col, char *str)
{
int i=0;
set_cursor(row, col);
while(str[i] != '\0') // 널값 만날 때까지
LCD_data_write(*str++); // 데이터 주소를 쓴다.
i++; //널값 만나서 다음 줄로 이동.
}
char *string[] = {" ATmega128", " Microcontroller"};
int main(void)
{
int i=0;
LCD_init();
LCD_command(0x0C);//잘보이기 위해 초기값 커서깜빡임 off, 커서 off
while(1){
for(i=0; i<16; i++){ //16번 반복동작
LCD_str_write(0, i, string[0]); //첫번째 줄 출력
LCD_str_write(1, i, string[1]); // 두번째 줄 출력
_delay_ms(100); //딜레이 0.1초로 반복
}
}
return 0;
}