LCD 192x64 по I2C BV4613
- Войдите на сайт для отправки комментариев
Втр, 01/10/2013 - 08:55
Никто не сталкивался с подключением Графического дисплея по I2C? к контролеру прилагается библиотека, но нет примеров самого кода, как её использовать, тоесть как инициализировать дисплей и вывести на него текст.
Уже всю голову сломал, не выходит каменный цветок, может у кого есть примеры скетча, под подобную библиотеку?
Таки удалось запустить данный экран по I2C, подавая команды напрямую на контроллер экрана, библиотеку родную не удаётся подключить, выдаёт ошибку с функцией "itoa"
Попробовал напрямую, без библиотеки экрана воспользоваться ей, подключил библиотеки "stdio.h" и "stdlib.h", насколько я понял, они необходимы для работы данной функции, но всёравно при компиляции выдаёт ошибку
Arduino: 1.5.4 (Windows 7), Board: "Arduino Due (Programming Port)"
ekran.ino: In function 'void loop()':
ekran:104: error: 'itoa' was not declared in this scope
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
Вот пример кода, сперва считываем данные с часов реального времени, потом в ручную разбиваю двузначное значение часов, минут, секунда на 2 цифры, перевожу их в ASCII и посимвольно вывожу на экран.
Нашел что можно проще разбивать число на 2 цифры при помощи itoa но что то не выходит каменный цветок.
Используется Arduino DUE
001
#include "Wire.h"
002
//#include "BV4613.h"
003
#include "stdio.h"
004
#include "stdlib.h"
005
006
#define DS1307_I2C_ADDRESS 0x68 //Адрес часов
007
008
byte
decToBcd(
byte
val)
009
{
010
return
( (val/10*16) + (val%10) );
011
}
012
013
byte
bcdToDec(
byte
val)
014
{
015
return
( (val/16*10) + (val%16) );
016
}
017
018
void
setDateDs1307(
byte
second,
// 0-59
019
char
minute,
// 0-59
020
byte
hour,
// 1-23
021
byte
dayOfWeek,
// 1-7
022
byte
dayOfMonth,
// 1-28/29/30/31
023
byte
month,
// 1-12
024
byte
year)
// 0-99
025
{
026
Wire.beginTransmission(DS1307_I2C_ADDRESS);
027
Wire.write(0);
028
Wire.write(decToBcd(second));
029
Wire.write(decToBcd(minute));
030
Wire.write(decToBcd(hour));
031
Wire.write(decToBcd(dayOfWeek));
032
Wire.write(decToBcd(dayOfMonth));
033
Wire.write(decToBcd(month));
034
Wire.write(decToBcd(year));
035
Wire.endTransmission();
036
}
037
038
void
getDateDs1307(
byte
*second,
039
byte
*minute,
040
byte
*hour,
041
byte
*dayOfWeek,
042
byte
*dayOfMonth,
043
byte
*month,
044
byte
*year)
045
{
046
Wire.beginTransmission(DS1307_I2C_ADDRESS);
047
Wire.write(0);
048
Wire.endTransmission();
049
050
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
051
*second = bcdToDec(Wire.read() & 0x7f);
052
*minute = bcdToDec(Wire.read());
053
*hour = bcdToDec(Wire.read() & 0x3f);
054
*dayOfWeek = bcdToDec(Wire.read());
055
*dayOfMonth = bcdToDec(Wire.read());
056
*month = bcdToDec(Wire.read());
057
*year = bcdToDec(Wire.read());
058
}
059
060
void
setup
(){
061
Serial
.begin(9600);
062
byte
second, minute, hour, dayOfWeek, dayOfMonth, month, year;
063
064
Wire.begin();
065
delay (1500);
//Ожидание пока экран прогрузится
066
Wire.beginTransmission(0x32);
//Соединение с экраном по адресе 0x32
067
068
//Посылаем команду Очистка экрана
069
Wire.write(0x1b);
// esc
070
Wire.write(0x5b);
// [
071
Wire.write(0x32);
072
Wire.write(0x4a);
073
//Посылаем команду Отключение курсора
074
Wire.write(0x1b);
// esc
075
Wire.write(0x5b);
// [
076
Wire.write(0x3f);
// ?
077
Wire.write(0x32);
//2
078
Wire.write(0x35);
//5
079
Wire.write(0x49);
//I
080
//Посылаем команду Отключение прокрутки
081
Wire.write(0x1b);
// esc
082
Wire.write(0x5b);
// [
083
Wire.write(0x3f);
// ?
084
Wire.write(0x32);
//2
085
Wire.write(0x36);
//6
086
Wire.write(0x6E);
//n
087
Wire.endTransmission();
088
}
089
090
091
void
loop
()
092
{
093
byte
second, minute, hour, dayOfWeek, dayOfMonth, month, year;
094
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
095
096
//Разделяем значение Часы, например 13 на 2 символа, 1 и 3
097
int
H1 = hour/10;
098
int
H2 = hour-H1*10;
099
100
//Переводим каждую цифру числа 13 в ASCII код
101
int
h1 =
char
(H1+
'0'
);
102
int
h2 =
char
(H2+
'0'
);
103
104
//Попытка сделать тоже самое но при помощи функции itoa
105
int
hour1 = hour;
106
char
buff[6];
107
itoa(hour1, buff, 10);
108
109
//Вывод полученных данных на комп, что бы понять, получилось или нет
110
Serial
.println(hour1);
111
Serial
.println(buff);
112
Serial
.println(h1);
113
Serial
.println(h2);
114
115
//Разделяем значение Минуты
116
int
M1 = minute/10;
117
int
M2 = minute-M1*10;
118
//Переводим в ASCII код
119
int
m1 =
char
(M1+
'0'
);
120
int
m2 =
char
(M2+
'0'
);
121
122
//Разделяем значение Секунды
123
int
S1 = second/10;
124
int
S2 = second-S1*10;
125
//Переводим в ASCII код
126
int
s1 =
char
(S1+
'0'
);
127
int
s2 =
char
(S2+
'0'
);
128
129
130
Wire.beginTransmission(0x32);
131
//Переводим курсор на 4 строчку, 1 символо
132
Wire.write(0x1b);
// esc
133
Wire.write(0x5b);
// [
134
Wire.write(0x30);
//4
135
Wire.write(0x3b);
//;
136
Wire.write(0x30);
//1
137
// Wire.write(0x32); //2
138
Wire.write(0x48);
//H
139
//Рисуем часы
140
Wire.write(h1);
//Отправляем первую цифру числа Часы в ASCCI коде
141
Wire.write(h2);
//Отправляем вторую цифру числа Часы в ASCCI коде
142
Wire.write(
":"
);
143
Wire.write(m1);
144
Wire.write(m2);
145
Wire.write(
":"
);
146
Wire.write(s1);
147
Wire.write(s2);
148
149
Wire.endTransmission();
150
delay(1000);
151
}
Удалось победить itoa, оказалось не ту библиотеку вставлял, для Arduino DUE она другая, в итоге удалось запустить родную библиотеку контроллера экрана BV4613, для подключения экрана по I2C.
Удалось даже вывести простой Текст, но возникли 2 новых проблемки:
1)Выводит только латиницу, как можно прикрутить поддержку кириллицы?
2)Удалось вывести только текст, не могу вывести данные из переменной
Для вывода текста используется вот такая команда:
1
BV4613.WriteText(0,3,
"1221"
);
А вот так эта команда расписана в библиотеке BV4613.h :
01
void
BV4613::WriteText(
int
F,
int
C,
char
*Str,
int
Color)
02
{
03
Cursor_POS(F,C);
04
WriteText(Str,Color);
05
}
06
07
//-----------------------------------------------------------------------------
08
09
void
BV4613::WriteText(TPointI P,
char
*Str,
int
Color)
10
{
11
SET_CursorPixel(P);
12
WriteText(Str,Color);
13
}
14
15
//-----------------------------------------------------------------------------
16
17
void
BV4613::WriteText(
char
*Str,
int
Color)
18
{
19
if
(gForeColor!=Color)
20
SET_Inverse();
21
22
SendI2C((unsigned
char
*)Str);
23
24
//esperamos fin comando
25
Wait_ACK();
26
}
Насколько я понимаю, Первый вариант, это вывод текста с указанием Строки и Символа, откуда начинать выводить текст.
Второй, это вывод с заданного пикселя.
Третий вариант, это вывод с ранее установленной позиции курсора.
Вопрос, как в строке:
1
BV4613.WriteText(0,3,
"1221"
);
Вместо 1221 записать переменную?
Если просто вставляю название переменной, то выдаёт ошибку:
1
ekran_BV4613.ino: In function
'void loop()'
:
2
ekran_BV4613:110: error: invalid conversion from
'byte'
to
'char*'
3
ekran_BV4613:110: error: initializing argument 3 of
'void BV4613::WriteText(int, int, char*, int)'
Причём, в какомм бы формате не была эта переменная, будет выдавать эту ошибку, с изменением лиш from 'int ' to 'char* или from 'char' to 'char*