-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLCM1602-IIC.c
132 lines (108 loc) · 2.58 KB
/
LCM1602-IIC.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
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "LCM1602-IIC.h"
void expanderWrite(int file, char value)
{
char buffer = value | LCD_BACKLIGHT;
//printf("EW = %x\r\n", buffer);
if (write(file, &buffer, 1) != 1)
printf("Error escribiendo en el dispositivo.\r\n");
}
void pulseEnable(int file, char value)
{
expanderWrite(file, value | LCD_EN);
usleep(1);
expanderWrite(file, value & ~LCD_EN);
usleep(50);
}
void write4bits(int file, char value)
{
//printf("\r\n");
//printf("W4B\r\n");
expanderWrite(file, value);
pulseEnable(file, value);
//printf("\r\n");
}
void send(int file, char value, char mode)
{
//printf("\r\nSEND\r\n");
char h = value & 0xf0;
char l = (value << 4) & 0xf0;
write4bits(file, h | mode);
write4bits(file, l | mode);
}
void command(int file, char value)
{
send(file, value, 0);
}
int initialize(const char *i2c_device, int addr)
{
// Se abre el fichero del dispositivo
int file = 0;
if ((file = open(i2c_device, O_RDWR)) < 0) {
printf("No se pudo abrir el dispositivo i2c: %s\r\n", i2c_device);
return -1;
}
if (ioctl(file, I2C_SLAVE, addr) != 0) {
printf("No se ha podido seleccionar la dirección del esclavo\r\n");
return -1;
}
usleep(50000);
expanderWrite(file, LCD_BACKLIGHT);
usleep(1000000);
// Se comienza en modo 4 bit, intentamos poner en modo 4 bit
write4bits(file, 0x03 << 4);
usleep(4500);
write4bits(file, 0x30);
usleep(4500);
write4bits(file, 0x30);
usleep(150);
// Finalmente se pone el interface en 4 bit
write4bits(file, 0x20);
// Se configura el número de líneas
command(file, LCD_FUNCTIONSET | LCD_2LINE);
command(file, LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF);
clear(file);
// Se inicializa la dirección del texto por defecto
command(file, LCD_ENTRYMODESET | LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT);
// Cursor al inicio
home(file);
return file;
}
void finalize(int file)
{
close(file);
}
void clear(int file)
{
command(file, LCD_CLEARDISPLAY);
usleep(2000);
}
void home(int file)
{
command(file, LCD_RETURNHOME);
usleep(2000);
}
void locate(int file, int row, int col)
{
static int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
command(file, LCD_SETDDRAMADDR | ((col % 16) + row_offsets[row % 2]));
}
void locateCG(int file, int n)
{
command(file, LCD_SETCGRAMADDR + n);
}
void print(int file, const char *text)
{
int i = 0;
int tlen = strlen(text);
for (i = 0; i < tlen; i++)
send(file, text[i], LCD_RS);
}