728x90
#include <avr/io.h>
#include <util/delay.h>
#define CLR 0x01 //Clear Display 명령
#define HOME 0x02 //Return Home 명령
#define FNC 0x38 //Function Set 명령
//Data Length = 8bit. 행수 2행
void LCD_PortSetting(void)
{
DDRC = 0xFF; //데이터 라인
DDRD = 0xFF; //0~2 제어핀 사용
//D0: RS ,D1: R/W ,D2: EN
}
void IR_Write(unsigned char Data)
{
PORTD &= 0xFC; //RS = 0, Write Enable
_delay_us(1); //Enable 까지 최소 대기 시간 40ns
PORTD |= 0x04; //Enable 활성화
_delay_us(1); //
PORTC = Data; //Data
_delay_us(1);
PORTD = 0b00000010; //Disable, Read Mode
}
void DR_Write(unsigned char Data)
{
PORTD = 0x01; //RS = 1, Write Enable
_delay_us(1); //Enable 까지 최소 대기 시간 40ns
PORTD |= 0x04; //Enable 활성화
_delay_us(1); //
PORTC = Data; //Data
_delay_us(1);
PORTD = 0b00000010; //Disable, Read Mode
}
void LCD_drive()
{
_delay_ms(50);
IR_Write(FNC);
_delay_ms(5);
IR_Write(FNC);
_delay_us(100);
IR_Write(FNC);
_delay_ms(2);
IR_Write(0x0E); // Display On / Off, DDRAM, 커서 ON
_delay_ms(2);
IR_Write(CLR); // Display Clear
_delay_ms(30);
IR_Write(0x06); // Entry Mode Set, 커서위치를 오른쪽으로 증가
_delay_ms(2);
}
int main(void)
{
LCD_PortSetting();
LCD_drive();
DR_Write(65);
_delay_ms(2);
DR_Write('D');
while(1)
{
}
return 0;
} |
Output :
LCD에 D 출력
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
| #include <avr/io.h>
#include <util/delay.h>
#define CLR 0x01 // Return Home 명령
#define HOME 0x02 // Function Set 명령
#define FNC 0x38 // Data Length 8 bit
void LCD_PortSetting(void)
{
DDRC = 0xFF; // 데이터 라인
DDRD = 0xFF; // 0 ~ 2 제어 핀 사용
// 00: RS, 01: R/W, 02: En
}
void IR_Write(unsigned char Data)
{
PORTD &= 0xFC; // RS = 0, Write Enable
_delay_us(1); // Enable 까지 최소 대기 시간 40ns
PORTD |= 0x04; // En
_delay_us(1);
PORTC = Data;
_delay_us(1);
PORTD = 0b00000010; // Disable. Read Mode
}
void DR_Write(unsigned char Data)
{
PORTD = 0x01; // RS = 1, Write Enable
_delay_us(1); // Enable 까지 최소 대기 시간 40ns
PORTD |= 0x04; // En
_delay_us(1);
PORTC = Data;
_delay_us(1);
PORTD = 0b00000010; // Disable. Read Mode
}
void LCD_drive()
{
_delay_ms(50); //
IR_Write(FNC);
_delay_ms(5);
IR_Write(FNC);
_delay_us(100);
IR_Write(FNC);
_delay_ms(2);
IR_Write(0x0E); // Display on/off DDRAM, 커서를 화면에 표시
_delay_ms(2);
IR_Write(CLR); // Display Clear
_delay_ms(30);
IR_Write(0x06); // Entry module set 명령. 오른쪽으로 커서 이동.
_delay_ms(2);
}
void LCD_CHAR(unsigned char a)
{
_delay_ms(1); // 명령어 쓰기 전 일정 시간 지연
DR_Write(a); // 사유: Busy Flage 확인 대용
}
void cursor_HOME(void)
{
IR_Write(0x02);
_delay_ms(2);
}
void Display_Shift(unsigned char p)
{
if(p == 1) // 표시화면 전체를 오른쪽으로 이동.
{
IR_Write(0x1C); // 화면 표시 내용을 오른쪽으로 이동.
_delay_us(50);
}
else if(p == 0)
{
IR_Write(0x18); // 화면 표시 내용을 오른쪽으로 이동.
_delay_us(50);
}
}
void LCD_STR(unsigned char *str)
{
while(*str != 0) // 0은 null, 값이 들어오면
{
LCD_CHAR(*str);
str++;
}
}
void Position(unsigned char col, unsigned char row) // 열과 행
{
IR_Write(0x80 | row+col*(0x40));
}
int main(void)
{
LCD_PortSetting();
LCD_drive();
/*
DR_Write(65);
DR_Write('B');
*/
Position(1,1);
LCD_STR("Hello");
//Display_Shift(1);
while(1)
{
}
return 0;
} |
Output :
LCD에 Hello 출력
'Study > Embedded' 카테고리의 다른 글
7/5 LCD 제어 (0) | 2016.07.05 |
---|---|
5/26 업무일지 PC PWM을 이용한 LED 밝기 조절 (0) | 2016.05.26 |
2016-05-17 업무일지-7 segment (0) | 2016.05.17 |
7 Segment 출력(proteus시뮬) (0) | 2016.05.16 |
5/12 avr 업무일지 (0) | 2016.05.12 |