-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlcd.h
157 lines (125 loc) · 2.86 KB
/
lcd.h
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// #include "S32K144.h"
#include "device_registers.h"
#include "lpit.h"
#define BASE 9
#define EN 4
#define RW 5
#define RS 6
#define BF 3
void lcdEN();
void lcdNEN();
void lcdinput(uint16_t);
void lcd_setting();
void lcd_init()
{
PTD->PDDR |= 0xFE00;
for (int i = 9; i <= 15; i++)
PORTD->PCR[i] = PORT_PCR_MUX(1);
}
void lcdEN(void)
{
PTD->PSOR |= 1 << (BASE + EN);
}
void lcdNEN(void)
{
PTD->PCOR |= 1 << (BASE + EN);
}
void lcd_setting(void)
{
lcdinput(0x28); // lcd function set #1
delay_100ns(70000);
lcdinput(0x28); // lcd function set #2
delay_100ns(70000);
lcdinput(0x28); // lcd function set #3
delay_100ns(70000);
lcdinput(0x08); // lcd off
delay_100ns(700);
lcdinput(0x01); // lcd clear
delay_100ns(20000);
lcdinput(0x06); // lcd modeset
delay_100ns(700);
lcdinput(0x0F); // lcd display,cursor
delay_100ns(20000);
lcdinput(0x80); // dd ram address
delay_100ns(700);
lcdinput(0x02); // return home
delay_100ns(20000);
}
void lcdinput(uint16_t data)
{
uint16_t data1 = ((uint16_t)data & 0xF0) << (BASE - 4); // D7 ~ 4
uint16_t data2 = (((uint16_t)data & 0x0F) << BASE); // D3 ~ 0
PTD->PCOR |= 1 << (BASE + RW);
// data1
lcdEN();
PTD->PCOR |= 0xF << BASE;
PTD->PSOR |= data1;
delay_100ns(5);
lcdNEN();
// clear before 2nd transmission
delay_100ns(2);
PTD->PCOR |= 0xF << BASE;
delay_100ns(30);
// data2
lcdEN();
PTD->PCOR |= 0xF << BASE;
PTD->PSOR |= data2;
delay_100ns(5);
lcdNEN();
// clear before next order
delay_100ns(2);
PTD->PCOR |= 0xF << BASE;
PTD->PCOR |= ((1 << (BASE + RS)) + (0xF << BASE));
delay_100ns(30);
}
void lcdcharinput(char data)
{
uint16_t data1 = ((uint16_t)data & 0xF0) << (BASE - 4); // D7 ~ 4
uint16_t data2 = (((uint16_t)data & 0x0F) << BASE); // D3 ~ 0
PTD->PSOR |= 1 << (BASE + RS);
// data1
lcdEN();
PTD->PCOR |= (0xF << BASE);
PTD->PSOR |= data1;
delay_100ns(3);
lcdNEN();
// clear before 2nd transmission
delay_100ns(2);
PTD->PCOR |= 0xF << BASE;
delay_100ns(30);
// data2
lcdEN();
PTD->PCOR |= 0xF << BASE;
PTD->PSOR |= data2;
delay_100ns(30);
lcdNEN();
// clear before next order
delay_100ns(2);
PTD->PCOR |= 0xF << BASE;
PTD->PCOR |= ((1 << (BASE + RS)) + (0xF << BASE));
delay_100ns(30);
}
void lcd_print_msg(char *msg1, char *msg2)
{
int i = 0;
// lcdinput(0x80);
while(msg1[i] != '\0')
{
lcdcharinput(msg1[i]);
delay_ms(800);
i++;
}
lcdinput(0x80 + 0x40);
i = 0;
while (msg2[i] != '\0')
{
lcdcharinput(msg2[i]);
delay_ms(800);
i++;
}
delay_ms(2000);
lcdinput(0x08); // lcd display off
delay_ms(400);
lcdinput(0x01); // Clear display
delay_ms(200);
}