/
lcd.c
90 lines (72 loc) · 1.82 KB
/
lcd.c
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
#include "lcd.h"
struct lcdInfo lcd_make(unsigned int rs,unsigned int e,unsigned int db[4]){
struct lcdInfo lcdinfo;
lcdinfo.rs = rs;
lcdinfo.e = e;
lcdinfo.db[0] = db[0];
lcdinfo.db[1] = db[1];
lcdinfo.db[2] = db[2];
lcdinfo.db[3] = db[3];
gpio_setOutput(lcdinfo.rs);
gpio_setOutput(lcdinfo.e);
gpio_setOutput(lcdinfo.db[0]);
gpio_setOutput(lcdinfo.db[1]);
gpio_setOutput(lcdinfo.db[2]);
gpio_setOutput(lcdinfo.db[3]);
lcd_clear(&lcdinfo);
return lcdinfo;
}
void lcd_clear(struct lcdInfo* lcdinfo ) {
lcd_cmd(lcdinfo,0x33,0);
lcd_cmd(lcdinfo,0x32,0);
lcd_cmd(lcdinfo,0x28,0);
lcd_cmd(lcdinfo,0x0C,0);
lcd_cmd(lcdinfo,0x06,0);
lcd_cmd(lcdinfo,0x01,0);
}
void lcd_write(struct lcdInfo* lcdinfo , char* message) {
unsigned int pos = 0;
while(message[pos]) {
if(message[pos] == '\n'){
lcd_cmd(lcdinfo,0xC0,0);
} else {
lcd_cmd(lcdinfo,message[pos],1);
}
pos++;
}
}
void lcd_cmd(struct lcdInfo* lcdinfo ,unsigned char data, unsigned int char_mode) {
timer_sleep(1000);
if(char_mode) {
gpio_outputSet(lcdinfo->rs);
} else {
gpio_outputClr(lcdinfo->rs);
}
gpio_outputClr(lcdinfo->db[0]);
gpio_outputClr(lcdinfo->db[1]);
gpio_outputClr(lcdinfo->db[2]);
gpio_outputClr(lcdinfo->db[3]);
int n = 0;
for(n = 0; n < 4; n++) {
if(data & (0b1 << n)) {
gpio_outputSet(lcdinfo->db[n + 4]);
}
}
gpio_outputSet(lcdinfo->e);
timer_sleep(500);
gpio_outputClr(lcdinfo->e);
timer_sleep(500);
gpio_outputClr(lcdinfo->db[0]);
gpio_outputClr(lcdinfo->db[1]);
gpio_outputClr(lcdinfo->db[2]);
gpio_outputClr(lcdinfo->db[3]);
for(n = 0; n < 4; n++) {
if(data & (0b1 << (n))) {
gpio_outputSet(lcdinfo->db[n]);
}
}
gpio_outputSet(lcdinfo->e);
timer_sleep(500);
gpio_outputClr(lcdinfo->e);
timer_sleep(500);
}