diff --git a/PCdisplay_v.1.4/PCdisplay_v.1.4.ino b/PCdisplay_v.1.4/PCdisplay_v.1.4.ino index 0579c0a..9f4edab 100644 --- a/PCdisplay_v.1.4/PCdisplay_v.1.4.ino +++ b/PCdisplay_v.1.4/PCdisplay_v.1.4.ino @@ -69,7 +69,7 @@ LiquidCrystal_I2C lcd(0x3f, 20, 4); #define printByte(args) write(args); #define TEMPERATURE_PRECISION 9 -// настройка даьчтков +// настройка датчтков OneWire oneWire(SENSOR_PIN); DallasTemperature sensors(&oneWire); DeviceAddress Thermometer1, Thermometer2; diff --git a/PCdisplay_v.1.4_oled128x64/PCdisplay_v.1.4_oled128x64.ino b/PCdisplay_v.1.4_oled128x64/PCdisplay_v.1.4_oled128x64.ino new file mode 100644 index 0000000..06b2ffa --- /dev/null +++ b/PCdisplay_v.1.4_oled128x64/PCdisplay_v.1.4_oled128x64.ino @@ -0,0 +1,549 @@ + +/* + Блок электроники для крутого моддинга вашего ПК, возможности: + - Вывод основных параметров железа на внешний LCD дисплей + - Температура: CPU, GPU, материнская плата, самый горячий HDD + - Уровень загрузки: CPU, GPU, RAM, видеопамять + - Температура с внешних датчиков (DS18B20) + - Текущий уровень скорости внешних вентиляторов + - Управление большим количеством 12 вольтовых 2, 3, 4 проводных вентиляторов + - Автоматическое управление скоростью пропорционально температуре + - Ручное управление скоростью из интерфейса программы + - Управление RGB светодиодной лентой + - Управление цветом пропорционально температуре (синий - зелёный - жёлтый - красный) + - Ручное управление цветом из интерфейса программы + + ---------- Касаемо OLED экрана ---------- + + 1. На OLED экране очень мало места, как выяснилось)) По-этому были убраны знаки градусов у температур, дабы заполучить + хотя бы ещё один свободный символ для построения полос загрузки. + Все элементы были по-максимуму адаптированы под данный экран (в т.ч. полосы загрузки), и распределены для комфортного восприятия. + 2. Для экрана так же дописана функция отключения экарана по истечению 25 секунд, когда данные не поступают...объясню зачем: + Часто кидаю комп в режим сна вместо полного отключения. USB порты при этом остаются работать, благодаря чему + после отключения светится надпись о том, что связь потеряна. Дабы можно было класть комп в режим сна, и не беспокоится о + системном мониторе - как раз и дописана функция отключения экрана. Точнее по факту это функция очистки, но т.к. oled не + имеют подсветки (светятся сами пиксели), то дисплей по факту выключен. + 3. Для OLED-дисплея была использована текстовая библиотека. Чтобы рисовать различные картинки, лого, графики и т.п. - + рекомендуется использовать графическую. Но графическая крайне много жрет памяти ардуины. Чтобы не нарушать стабильность + выбор пал именно на текстовую. + По-этому из прошивки удалены (точнее закоментированы) функции вывода логотипов и графиков. + Для желающих по-эксперементировать графическая библиотека тоже приложена. Но там немного другая адресация + функции отрисовки надписей надо будет немного переделать. + 4. Остальные функции прошивки алекса по максимуму сохранены + + PS: Хотел написать так же скетч для работы с экраном 128x32 - но и тут закралась подства. Библиотека iarduino (по крайней мере + шрифты в ней), по ходу, расчитана только на 128х64. Зато на удивление этот скетч залился и работал с экраном 128x32, правда + мелкие надписи были нечитаемы... + + PPS: Да, я прекрасно знаю что есть похожая библиотека от Adafrut для ssd1306. Но она с моим дисплеем 128х64 напрочь отказалась + работать. Ни один пример не завёлся. Зато с 128х32 отлично работает... + Но т.к. всё таки первый экран больше инфы вмещает - выбрал его, и собственно библиотеку от iarduino. + + ---------- Касаемо OLED экрана ---------- + + + Программа HardwareMonitorPlus https://github.com/AlexGyver/PCdisplay + - Запустить OpenHardwareMonitor.exe + - Options/Serial/Run - запуск соединения с Ардуиной + - Options/Serial/Config - настройка параметров работы + - PORT address - адрес порта, куда подключена Ардуина + - TEMP source - источник показаний температуры (процессор, видеокарта, максимум проц+видео, датчик 1, датчик 2) + - FAN min, FAN max - минимальные и максимальные обороты вентиляторов, в % + - TEMP min, TEMP max - минимальная и максимальная температура, в градусах Цельсия + - Manual FAN - ручное управление скоростью вентилятора в % + - Manual COLOR - ручное управление цветом ленты + - LED brightness - управление яркостью ленты + - CHART interval - интервал обновления графиков + + Что идёт в порт: 0-CPU temp, 1-GPU temp, 2-mother temp, 3-max HDD temp, 4-CPU load, 5-GPU load, 6-RAM use, 7-GPU memory use, + 8-maxFAN, 9-minFAN, 10-maxTEMP, 11-minTEMP, 12-manualFAN, 13-manualCOLOR, 14-fanCtrl, 15-colorCtrl, 16-brightCtrl, 17-LOGinterval, 18-tempSource +*/ +// ------------------------ НАСТРОЙКИ ---------------------------- +// настройки пределов скорости и температуры по умолчанию (на случай отсутствия связи) +byte speedMIN = 10, speedMAX = 90, tempMIN = 30, tempMAX = 70; +#define DRIVER_VERSION 1 // 0 - маркировка драйвера кончается на 4АТ, 1 - на 4Т +#define COLOR_ALGORITM 0 // 0 или 1 - разные алгоритмы изменения цвета (строка 222) +#define ERROR_DUTY 90 // скорость вентиляторов при потере связи +#define ERROR_BACKLIGHT 0 // 0 - гасить подсветку при потере сигнала, 1 - не гасить +#define ERROR_UPTIME 0 // 1 - сбрасывать uptime при потере связи, 0 - нет +// ------------------------ НАСТРОЙКИ ---------------------------- + +// ----------------------- ПИНЫ --------------------------- +#define FAN_PIN 9 // на мосфет вентиляторов +#define R_PIN 5 // на мосфет ленты, красный +#define G_PIN 3 // на мосфет ленты, зелёный +#define B_PIN 6 // на мосфет ленты, синий +#define BTN1 A3 // первая кнопка +#define BTN2 A2 // вторая кнопка +#define SENSOR_PIN 14 // датчик температуры +// ----------------------- ПИНЫ --------------------------- + +// -------------------- БИБЛИОТЕКИ --------------------- +#include // библиотека протокола датчиков +#include // библиотека датчика +#include // библиотека расширенной работы со строками +#include // Подключаем библиотеку iarduino_OLED_txt. +#include // библиотека таймера +// -------------------- БИБЛИОТЕКИ --------------------- + +//---------- ОПРЕДЕЛЕНИЕ ДИСПЛЕЯ И ШРИФТОВ ------------- +iarduino_OLED_txt lcd(0x78); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x78 (если учитывать бит RW=0). // +extern uint8_t MediumFontRus[]; // Подключаем шрифт MediumFontRusntRus. +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. +//---------- ОПРЕДЕЛЕНИЕ ДИСПЛЕЯ И ШРИФТОВ ------------- + +#define TEMPERATURE_PRECISION 9 +// настройка датчтков +OneWire oneWire(SENSOR_PIN); +DallasTemperature sensors(&oneWire); +DeviceAddress Thermometer1, Thermometer2; + +/* стартовый логотип +Логотипы не использовал, т.к. для дисплея используется текстовая библиотека. Чтобы рисовать любые картинки - нужна графическая +Но она крайне прожорлива в плане ресурсов (на nano появляется предупреждение о нехватке памяти). Надо было чем-то жертвовать. +Но библиотеку графическую на всякий случай приложил. Желающие могут поэксперементировать. + +*/ +char inData[82]; // массив входных значений (СИМВОЛЫ) +int PCdata[20]; // массив численных значений показаний с компьютера +byte PLOTmem[6][16]; // массив для хранения данных для построения графика (16 значений для 6 параметров) +byte blocks, halfs; +byte index = 0; +int display_mode = 6; +String string_convert; +unsigned long timeout, uptime_timer, plot_timer; +boolean lightState, reDraw_flag = 1, updateDisplay_flag, updateTemp_flag, timeOut_flag = 1, sleep_flag = 1;; +int duty, LEDcolor; +int k, b, R, G, B, Rf, Gf, Bf; +byte mainTemp; +byte lines[] = {4, 5, 7, 6}; +byte plotLines[] = {0, 1, 4, 5, 6, 7}; // 0-CPU temp, 1-GPU temp, 2-CPU load, 3-GPU load, 4-RAM load, 5-GPU memory +String perc; +unsigned long sec, mins, hrs; +byte temp1, temp2; +boolean btn1_sig, btn2_sig, btn1_flag, btn2_flag; + +// Названия для легенды графиков +const char plot_0[] = "CPU"; +const char plot_1[] = "GPU"; +const char plot_2[] = "RAM"; + +const char plot_3[] = "temp"; +const char plot_4[] = "load"; +const char plot_5[] = "mem"; +// названия ниже должны совпадать с массивами сверху и идти по порядку! +static const char *plotNames0[] = { + plot_0, plot_1, plot_0, plot_1, plot_2, plot_1 +}; +static const char *plotNames1[] = { + plot_3, plot_3, plot_4, plot_4, plot_4, plot_5 +}; +// 0-CPU temp, 1-GPU temp, 2-CPU load, 3-GPU load, 4-RAM load, 5-GPU memory + +void setup() { + lcd.begin(); // Инициируем работу с дисплеем. + lcd.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. + lcd.setCoding(TXT_UTF8); //кодировка может не подойти, если вместо русских букв "кракозябры" пробуйте 1 из вариантов TXT_UTF8 TXT_CP866 TXT_WIN1251 + Serial.begin(9600); + Timer1.initialize(40); // поставить частоту ШИМ 25 кГц (40 микросекунд) + pinMode(R_PIN, OUTPUT); + pinMode(G_PIN, OUTPUT); + pinMode(B_PIN, OUTPUT); + digitalWrite(R_PIN, 0); + digitalWrite(G_PIN, 0); + digitalWrite(B_PIN, 0); + pinMode(BTN1, INPUT_PULLUP); + pinMode(BTN2, INPUT_PULLUP); + sensors.begin(); + sensors.getAddress(Thermometer1, 0); + sensors.getAddress(Thermometer2, 1); + sensors.setResolution(Thermometer1, TEMPERATURE_PRECISION); + sensors.setResolution(Thermometer2, TEMPERATURE_PRECISION); + // инициализация дисплея +// lcd.init(); +// lcd.backlight(); + lcd.clrScr(); // очистить дисплей + show_logo(); // показать логотип + + Timer1.pwm(FAN_PIN, 400); // включить вентиляторы на 40% + delay(2000); // на 2 секунды + lcd.clrScr(); // очистить дисплей + PCdata[8] = speedMAX; + PCdata[9] = speedMIN; + PCdata[10] = tempMAX; + PCdata[11] = tempMIN; +} +// 8-maxFAN, 9-minFAN, 10-maxTEMP, 11-minTEMP, 12-mnlFAN + +// ------------------------------ ОСНОВНОЙ ЦИКЛ ------------------------------- +void loop() { + parsing(); // парсим строки с компьютера + //updatePlot(); // обновляем массив данных графика + getTemperature(); // получить значения с датчиков температуры + dutyCalculate(); // посчитать скважность для вентиляторов + Timer1.pwm(FAN_PIN, duty * 10); // управлять вентиляторами + LEDcontrol(); // управлять цветом ленты + buttonsTick(); // опрос кнопок и смена режимов + updateDisplay(); // обновить показания на дисплее + timeoutTick(); // проверка таймаута +} +// ------------------------------ ОСНОВНОЙ ЦИКЛ ------------------------------- + +void buttonsTick() { + btn1_sig = !digitalRead(BTN1); + btn2_sig = !digitalRead(BTN2); + if (btn1_sig && !btn1_flag) { + display_mode++; + reDraw_flag = 1; + if (display_mode > 7) display_mode = 0; + btn1_flag = 1; + } + if (!btn1_sig && btn1_flag) { + btn1_flag = 0; + } + if (btn2_sig && !btn2_flag) { + display_mode--; + reDraw_flag = 1; + if (display_mode < 0) display_mode = 7; + btn2_flag = 1; + } + if (!btn2_sig && btn2_flag) { + btn2_flag = 0; + } +} + +void getTemperature() { + if (updateTemp_flag) { + sensors.requestTemperatures(); + temp1 = sensors.getTempC(Thermometer1); + temp2 = sensors.getTempC(Thermometer2); + updateTemp_flag = 0; + } +} + +void LEDcontrol() { + b = PCdata[16]; + if (PCdata[13] == 1) // если стоит галочка Manual Color + LEDcolor = PCdata[15]; // цвет равен установленному ползунком + else { // если нет + LEDcolor = map(mainTemp, PCdata[11], PCdata[10], 0, 1000); + LEDcolor = constrain(LEDcolor, 0, 1000); + } + + if (COLOR_ALGORITM) { + // алгоритм цвета 1 + // синий убавляется, зелёный прибавляется + // зелёный убавляется, красный прибавляется + if (LEDcolor <= 500) { + k = map(LEDcolor, 0, 500, 0, 255); + R = 0; + G = k; + B = 255 - k; + } + if (LEDcolor > 500) { + k = map(LEDcolor, 500, 1000, 0, 255); + R = k; + G = 255 - k; + B = 0; + } + + } else { + // алгоритм цвета 2 + // синий максимум, плавно прибавляется зелёный + // зелёный максимум, плавно убавляется синий + // зелёный максимум, плавно прибавляется красный + // красный максимум, плавно убавляется зелёный + + if (LEDcolor <= 250) { + k = map(LEDcolor, 0, 250, 0, 255); + R = 0; + G = k; + B = 255; + } + if (LEDcolor > 250 && LEDcolor <= 500) { + k = map(LEDcolor, 250, 500, 0, 255); + R = 0; + G = 255; + B = 255 - k; + } + if (LEDcolor > 500 && LEDcolor <= 750) { + k = map(LEDcolor, 500, 750, 0, 255); + R = k; + G = 255; + B = 0; + } + if (LEDcolor > 750 && LEDcolor <= 1000) { + k = map(LEDcolor, 750, 1000, 0, 255); + R = 255; + G = 255 - k; + B = 0; + } + } + + Rf = (b * R / 100); + Gf = (b * G / 100); + Bf = (b * B / 100); + analogWrite(R_PIN, Rf); + analogWrite(G_PIN, Gf); + analogWrite(B_PIN, Bf); +} + +void dutyCalculate() { + if (PCdata[12] == 1) // если стоит галочка ManualFAN + duty = PCdata[14]; // скважность равна установленной ползунком + else { // если нет + switch (PCdata[18]) { + case 0: mainTemp = PCdata[0]; // взять опорную температуру как CPU + break; + case 1: mainTemp = PCdata[1]; // взять опорную температуру как GPU + break; + case 2: mainTemp = max(PCdata[0], PCdata[1]); // взять опорную температуру как максимум CPU и GPU + break; + case 3: mainTemp = temp1; + break; + case 4: mainTemp = temp2; + break; + } + duty = map(mainTemp, PCdata[11], PCdata[10], PCdata[9], PCdata[8]); + duty = constrain(duty, PCdata[9], PCdata[8]); + } + if (!timeOut_flag) duty = ERROR_DUTY; // если пропало соединение, поставить вентиляторы на ERROR_DUTY +} + +void parsing() { + while (Serial.available() > 0) { + char aChar = Serial.read(); + if (aChar != 'E') { + inData[index] = aChar; + index++; + inData[index] = '\0'; + } else { + char *p = inData; + char *str; + index = 0; + String value = ""; + while ((str = strtok_r(p, ";", &p)) != NULL) { + string_convert = str; + PCdata[index] = string_convert.toInt(); + index++; + } + index = 0; + updateDisplay_flag = 1; + updateTemp_flag = 1; + } + if (!timeOut_flag) { // если связь была потеряна, но восстановилась +// if (!ERROR_BACKLIGHT) lcd.backlight(); // включить подсветку при появлении сигнала, если разрешено + if (ERROR_UPTIME) uptime_timer = millis(); // сбросить uptime, если разрешено + } + timeout = millis(); + timeOut_flag = 1; + sleep_flag = 1; + } +} + +void updateDisplay() { + if (updateDisplay_flag) { + if (reDraw_flag) { + lcd.clrScr(); + switch (display_mode) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: //draw_plot_symb(); + break; + case 6: draw_labels_1(); + break; + case 7: draw_labels_2(); + break; + } + reDraw_flag = 0; + } + switch (display_mode) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: //draw_plot(); + break; + case 6: draw_stats_1(); + break; + case 7: draw_stats_2(); + break; + /*case 50: debug(); + break;*/ + } + updateDisplay_flag = 0; + } +} +void draw_stats_1() { + lcd.print(PCdata[0], 24, 1); + lcd.print(PCdata[4], 92, 1); + if (PCdata[4] < 10) perc = "% "; + else if (PCdata[4] < 100) perc = "%"; + else perc = ""; lcd.print(perc); + lcd.print(PCdata[1], 24, 3); + lcd.print(PCdata[5], 92, 3); + if (PCdata[5] < 10) perc = "% "; + else if (PCdata[5] < 100) perc = "%"; + else perc = ""; lcd.print(perc); + lcd.print(PCdata[7], 92, 5); + if (PCdata[7] < 10) perc = "% "; + else if (PCdata[7] < 100) perc = "%"; + else perc = ""; lcd.print(perc); + lcd.print(PCdata[6], 92, 7); + if (PCdata[6] < 10) perc = "% "; + else if (PCdata[6] < 100) perc = "%"; + else perc = ""; lcd.print(perc); + draw_stats_progress(1,map(PCdata[4],0,100,0,5)); + draw_stats_progress(3,map(PCdata[5],0,100,0,5)); + draw_stats_progress(5,map(PCdata[7],0,100,0,5)); + draw_stats_progress(7,map(PCdata[6],0,100,0,5)); +} + +void draw_stats_progress(int line, int num) { + for (int i=1; i<=6; i++) { + if (num>=i) lcd.print("|", 43+i*7, line); else if (i!=6) lcd.print(" ", 43+i*7, line); + } +} + +void draw_stats_2() { + lcd.print(duty, 92, 1); + if ((duty) < 10) perc = "% "; + else if ((duty) < 100) perc = "%"; + else perc = ""; lcd.print(perc); + draw_stats_progress(1,map(duty,0,100,0,5)); + + lcd.print(temp1, 35, 3); + lcd.print(temp2, 104, 3); + lcd.print(PCdata[2], 35, 5); + lcd.print(PCdata[3], 104, 5); + + lcd.setCursor(64, 7); + lcd.setFont(SmallFontRus); + sec = (long)(millis() - uptime_timer) / 1000; + hrs = floor((sec / 3600)); + mins = floor(sec - (hrs * 3600)) / 60; + sec = sec - (hrs * 3600 + mins * 60); + if (hrs < 10) lcd.print(0); + lcd.print(hrs); + lcd.print(":"); + if (mins < 10) lcd.print(0); + lcd.print(mins); + lcd.print(":"); + if (sec < 10) lcd.print(0); + lcd.print(sec); + lcd.setFont(MediumFontRus); +} + +void draw_labels_1() { + lcd.setFont(SmallFontRus); + lcd.print("CPU:" , 0, 1); + lcd.print("GPU:" , 0, 3); + lcd.print("GPU mem:" , 0, 5); + lcd.print("RAM mem:" , 0, 7); + lcd.setFont(MediumFontRus); +} + +void draw_labels_2() { + lcd.setFont(SmallFontRus); + lcd.print("FANspeed" , 0, 1); + lcd.print("TMP1: " , 0, 3); + lcd.print("TMP2:" , 64, 3); + lcd.print("MOM:" , 0, 5); + lcd.print("HDDmx:" , 64, 5); + lcd.print("UPTIME:" , 0, 7); + lcd.setFont(MediumFontRus); +} + +/*void draw_legend() { + byte data = PCdata[plotLines[display_mode]]; + lcd.setCursor(16, 2); lcd.print(data); + if (display_mode > 1) { + if (data < 10) perc = "% "; + else if (data < 100) perc = "%"; + else { + perc = ""; + } + lcd.print(perc); + } else { + if (data < 10) { + lcd.write(223); + lcd.print(" "); + } else if (data < 100) { + lcd.write(223); lcd.print(" "); + } else { + lcd.write(223); + } + } +}*/ + +/*void draw_plot() { + draw_legend(); + + for (byte i = 0; i < 16; i++) { // каждый столбец параметров + blocks = floor(PLOTmem[display_mode][i] / 8); // найти количество целых блоков + halfs = PLOTmem[display_mode][i] - blocks * 8; // найти число оставшихся полосок + for (byte n = 0; n < 4; n++) { + if (n < blocks) { + lcd.setCursor(i, (3 - n)); + lcd.printByte(0); + } + if (n >= blocks) { + if (n != 3) { + lcd.setCursor(i, (3 - n)); + if (halfs > 0) lcd.printByte(halfs); + for (byte k = n + 1; k < 4; k++) { + lcd.setCursor(i, (3 - k)); + lcd.print(" "); + } + break; + } + } + } + } +}*/ + +void timeoutTick() { + if ((millis() - timeout > 5000) && timeOut_flag) { + lcd.clrScr(); + lcd.print("СВЯЗЬ" , OLED_C, 2); + lcd.print("ПОТЕРЯНА" , OLED_C, 5); + timeOut_flag = 0; + reDraw_flag = 1; + } + if ((millis() - timeout > 25000) && sleep_flag) { + lcd.clrScr(); + sleep_flag = 0; + reDraw_flag = 1; + } +} +void show_logo() { + lcd.print("AlexGyver" , OLED_C, 1); + lcd.setFont(SmallFontRus); + lcd.print("Technologies" , OLED_C, 2); + lcd.print("modified by" , OLED_C, 5); + lcd.setFont(MediumFontRus); + lcd.print("nick7zmail" , OLED_C, 7); +} +/*void debug() { + lcd.clear(); + lcd.setCursor(0, 0); + for (int j = 0; j < 5; j++) { + lcd.print(PCdata[j]); lcd.print(" "); + } + lcd.setCursor(0, 1); + for (int j = 6; j < 10; j++) { + lcd.print(PCdata[j]); lcd.print(" "); + } + lcd.setCursor(0, 2); + for (int j = 10; j < 15; j++) { + lcd.print(PCdata[j]); lcd.print(" "); + } + lcd.setCursor(0, 3); + for (int j = 15; j < 18; j++) { + lcd.print(PCdata[j]); lcd.print(" "); + } +}*/ diff --git a/PCdisplay_v_1.4_1602/PCdisplay_v_1.4_1602.ino b/PCdisplay_v_1.4_1602/PCdisplay_v_1.4_1602.ino index bed95e9..3606423 100644 --- a/PCdisplay_v_1.4_1602/PCdisplay_v_1.4_1602.ino +++ b/PCdisplay_v_1.4_1602/PCdisplay_v_1.4_1602.ino @@ -71,7 +71,7 @@ LiquidCrystal_I2C lcd(0x3f, 16, 2); #define printByte(args) write(args); #define TEMPERATURE_PRECISION 9 -// настройка даьчтков +// настройка датчтков OneWire oneWire(SENSOR_PIN); DallasTemperature sensors(&oneWire); DeviceAddress Thermometer1, Thermometer2; diff --git a/README.md b/README.md index 2ba6316..3e511cc 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ - Подробности в видео: https://youtu.be/hCPOQI-eFYs - **Поддержка двух типов дисплеев!** Подробности ниже ![DISPLAYS](https://github.com/AlexGyver/PCdisplay/blob/master/schemes%26PCBs/displays.jpg) +- Поддержка OLED дисплея 128x64
+![DISPLAYS](https://github.com/AlexGyver/PCdisplay/blob/master/schemes%26PCBs/oled128x64.jpg) ## Папки @@ -158,4 +160,4 @@ * [Основной YouTube канал](https://www.youtube.com/channel/UCgtAOyEQdAyjvm9ATCi_Aig?sub_confirmation=1) * [YouTube канал про Arduino](https://www.youtube.com/channel/UC4axiS76D784-ofoTdo5zOA?sub_confirmation=1) * [Мои видеоуроки по пайке](https://www.youtube.com/playlist?list=PLOT_HeyBraBuMIwfSYu7kCKXxQGsUKcqR) -* [Мои видеоуроки по Arduino](http://alexgyver.ru/arduino_lessons/) \ No newline at end of file +* [Мои видеоуроки по Arduino](http://alexgyver.ru/arduino_lessons/) diff --git a/libraries/I2Cdev/I2Cdev.cpp b/libraries/I2Cdev/I2Cdev.cpp new file mode 100644 index 0000000..db173b5 --- /dev/null +++ b/libraries/I2Cdev/I2Cdev.cpp @@ -0,0 +1,1457 @@ +// I2Cdev library collection - Main I2C device class +// Abstracts bit and byte I2C R/W functions into a convenient class +// 2013-06-05 by Jeff Rowberg +// +// Changelog: +// 2013-05-06 - add Francesco Ferrara's Fastwire v0.24 implementation with small modifications +// 2013-05-05 - fix issue with writing bit values to words (Sasquatch/Farzanegan) +// 2012-06-09 - fix major issue with reading > 32 bytes at a time with Arduino Wire +// - add compiler warnings when using outdated or IDE or limited I2Cdev implementation +// 2011-11-01 - fix write*Bits mask calculation (thanks sasquatch @ Arduino forums) +// 2011-10-03 - added automatic Arduino version detection for ease of use +// 2011-10-02 - added Gene Knight's NBWire TwoWire class implementation with small modifications +// 2011-08-31 - added support for Arduino 1.0 Wire library (methods are different from 0.x) +// 2011-08-03 - added optional timeout parameter to read* methods to easily change from default +// 2011-08-02 - added support for 16-bit registers +// - fixed incorrect Doxygen comments on some methods +// - added timeout value for read operations (thanks mem @ Arduino forums) +// 2011-07-30 - changed read/write function structures to return success or byte counts +// - made all methods static for multi-device memory savings +// 2011-07-28 - initial release + +/* ============================================ +I2Cdev device library code is placed under the MIT license +Copyright (c) 2013 Jeff Rowberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +=============================================== +*/ + +#include "I2Cdev.h" + +#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE + + #ifdef I2CDEV_IMPLEMENTATION_WARNINGS + #if ARDUINO < 100 + #warning Using outdated Arduino IDE with Wire library is functionally limiting. + #warning Arduino IDE v1.6.5+ with I2Cdev Fastwire implementation is recommended. + #warning This I2Cdev implementation does not support: + #warning - Repeated starts conditions + #warning - Timeout detection (some Wire requests block forever) + #elif ARDUINO == 100 + #warning Using outdated Arduino IDE with Wire library is functionally limiting. + #warning Arduino IDE v1.6.5+ with I2Cdev Fastwire implementation is recommended. + #warning This I2Cdev implementation does not support: + #warning - Repeated starts conditions + #warning - Timeout detection (some Wire requests block forever) + #elif ARDUINO > 100 + /*#warning Using current Arduino IDE with Wire library is functionally limiting. + #warning Arduino IDE v1.6.5+ with I2CDEV_BUILTIN_FASTWIRE implementation is recommended. + #warning This I2Cdev implementation does not support: + #warning - Timeout detection (some Wire requests block forever)*/ + #endif + #endif + +#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE + + //#error The I2CDEV_BUILTIN_FASTWIRE implementation is known to be broken right now. Patience, Iago! + +#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE + + #ifdef I2CDEV_IMPLEMENTATION_WARNINGS + #warning Using I2CDEV_BUILTIN_NBWIRE implementation may adversely affect interrupt detection. + #warning This I2Cdev implementation does not support: + #warning - Repeated starts conditions + #endif + + // NBWire implementation based heavily on code by Gene Knight + // Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html + // Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html + TwoWire Wire; + +#endif + +/** Default constructor. + */ +I2Cdev::I2Cdev() { +} + +/** Read a single bit from an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param bitNum Bit position to read (0-7) + * @param data Container for single bit value + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout) { + uint8_t b; + uint8_t count = readByte(devAddr, regAddr, &b, timeout); + *data = b & (1 << bitNum); + return count; +} + +/** Read a single bit from a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param bitNum Bit position to read (0-15) + * @param data Container for single bit value + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout) { + uint16_t b; + uint8_t count = readWord(devAddr, regAddr, &b, timeout); + *data = b & (1 << bitNum); + return count; +} + +/** Read multiple bits from an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param bitStart First bit position to read (0-7) + * @param length Number of bits to read (not more than 8) + * @param data Container for right-aligned value (i.e. '101' read from any bitStart position will equal 0x05) + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout) { + // 01101001 read byte + // 76543210 bit numbers + // xxx args: bitStart=4, length=3 + // 010 masked + // -> 010 shifted + uint8_t count, b; + if ((count = readByte(devAddr, regAddr, &b, timeout)) != 0) { + uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); + b &= mask; + b >>= (bitStart - length + 1); + *data = b; + } + return count; +} + +/** Read multiple bits from a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param bitStart First bit position to read (0-15) + * @param length Number of bits to read (not more than 16) + * @param data Container for right-aligned value (i.e. '101' read from any bitStart position will equal 0x05) + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (1 = success, 0 = failure, -1 = timeout) + */ +int8_t I2Cdev::readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout) { + // 1101011001101001 read byte + // fedcba9876543210 bit numbers + // xxx args: bitStart=12, length=3 + // 010 masked + // -> 010 shifted + uint8_t count; + uint16_t w; + if ((count = readWord(devAddr, regAddr, &w, timeout)) != 0) { + uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); + w &= mask; + w >>= (bitStart - length + 1); + *data = w; + } + return count; +} + +/** Read single byte from an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param data Container for byte value read from device + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_t timeout) { + return readBytes(devAddr, regAddr, 1, data, timeout); +} + +/** Read single word from a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to read from + * @param data Container for word value read from device + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Status of read operation (true = success) + */ +int8_t I2Cdev::readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout) { + return readWords(devAddr, regAddr, 1, data, timeout); +} + +/** Read multiple bytes from an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr First register regAddr to read from + * @param length Number of bytes to read + * @param data Buffer to store read data in + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Number of bytes read (-1 indicates failure) + */ +int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print("I2C (0x"); + Serial.print(devAddr, HEX); + Serial.print(") reading "); + Serial.print(length, DEC); + Serial.print(" bytes from 0x"); + Serial.print(regAddr, HEX); + Serial.print("..."); + #endif + + int8_t count = 0; + uint32_t t1 = millis(); + + #if (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE) + + #if (ARDUINO < 100) + // Arduino v00xx (before v1.0), Wire library + + // I2C/TWI subsystem uses internal buffer that breaks with large data requests + // so if user requests more than BUFFER_LENGTH bytes, we have to do it in + // smaller chunks instead of all at once + for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) { + Wire.beginTransmission(devAddr); + Wire.send(regAddr); + Wire.endTransmission(); + Wire.beginTransmission(devAddr); + Wire.requestFrom(devAddr, (uint8_t)min(length - k, BUFFER_LENGTH)); + + for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { + data[count] = Wire.receive(); + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[count], HEX); + if (count + 1 < length) Serial.print(" "); + #endif + } + + Wire.endTransmission(); + } + #elif (ARDUINO == 100) + // Arduino v1.0.0, Wire library + // Adds standardized write() and read() stream methods instead of send() and receive() + + // I2C/TWI subsystem uses internal buffer that breaks with large data requests + // so if user requests more than BUFFER_LENGTH bytes, we have to do it in + // smaller chunks instead of all at once + for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) { + Wire.beginTransmission(devAddr); + Wire.write(regAddr); + Wire.endTransmission(); + Wire.beginTransmission(devAddr); + Wire.requestFrom(devAddr, (uint8_t)min(length - k, BUFFER_LENGTH)); + + for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { + data[count] = Wire.read(); + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[count], HEX); + if (count + 1 < length) Serial.print(" "); + #endif + } + + Wire.endTransmission(); + } + #elif (ARDUINO > 100) + // Arduino v1.0.1+, Wire library + // Adds official support for repeated start condition, yay! + + // I2C/TWI subsystem uses internal buffer that breaks with large data requests + // so if user requests more than BUFFER_LENGTH bytes, we have to do it in + // smaller chunks instead of all at once + for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) { + Wire.beginTransmission(devAddr); + Wire.write(regAddr); + Wire.endTransmission(); + Wire.beginTransmission(devAddr); + Wire.requestFrom(devAddr, (uint8_t)min(length - k, BUFFER_LENGTH)); + + for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { + data[count] = Wire.read(); + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[count], HEX); + if (count + 1 < length) Serial.print(" "); + #endif + } + } + #endif + + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) + + // Fastwire library + // no loop required for fastwire + uint8_t status = Fastwire::readBuf(devAddr << 1, regAddr, data, length); + if (status == 0) { + count = length; // success + } else { + count = -1; // error + } + + #endif + + // check for timeout + if (timeout > 0 && millis() - t1 >= timeout && count < length) count = -1; // timeout + + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(". Done ("); + Serial.print(count, DEC); + Serial.println(" read)."); + #endif + + return count; +} + +/** Read multiple words from a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr First register regAddr to read from + * @param length Number of words to read + * @param data Buffer to store read data in + * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) + * @return Number of words read (-1 indicates failure) + */ +int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print("I2C (0x"); + Serial.print(devAddr, HEX); + Serial.print(") reading "); + Serial.print(length, DEC); + Serial.print(" words from 0x"); + Serial.print(regAddr, HEX); + Serial.print("..."); + #endif + + int8_t count = 0; + uint32_t t1 = millis(); + + #if (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE) + + #if (ARDUINO < 100) + // Arduino v00xx (before v1.0), Wire library + + // I2C/TWI subsystem uses internal buffer that breaks with large data requests + // so if user requests more than BUFFER_LENGTH bytes, we have to do it in + // smaller chunks instead of all at once + for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { + Wire.beginTransmission(devAddr); + Wire.send(regAddr); + Wire.endTransmission(); + Wire.beginTransmission(devAddr); + Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes + + bool msb = true; // starts with MSB, then LSB + for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { + if (msb) { + // first byte is bits 15-8 (MSb=15) + data[count] = Wire.receive() << 8; + } else { + // second byte is bits 7-0 (LSb=0) + data[count] |= Wire.receive(); + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[count], HEX); + if (count + 1 < length) Serial.print(" "); + #endif + count++; + } + msb = !msb; + } + + Wire.endTransmission(); + } + #elif (ARDUINO == 100) + // Arduino v1.0.0, Wire library + // Adds standardized write() and read() stream methods instead of send() and receive() + + // I2C/TWI subsystem uses internal buffer that breaks with large data requests + // so if user requests more than BUFFER_LENGTH bytes, we have to do it in + // smaller chunks instead of all at once + for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { + Wire.beginTransmission(devAddr); + Wire.write(regAddr); + Wire.endTransmission(); + Wire.beginTransmission(devAddr); + Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes + + bool msb = true; // starts with MSB, then LSB + for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { + if (msb) { + // first byte is bits 15-8 (MSb=15) + data[count] = Wire.read() << 8; + } else { + // second byte is bits 7-0 (LSb=0) + data[count] |= Wire.read(); + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[count], HEX); + if (count + 1 < length) Serial.print(" "); + #endif + count++; + } + msb = !msb; + } + + Wire.endTransmission(); + } + #elif (ARDUINO > 100) + // Arduino v1.0.1+, Wire library + // Adds official support for repeated start condition, yay! + + // I2C/TWI subsystem uses internal buffer that breaks with large data requests + // so if user requests more than BUFFER_LENGTH bytes, we have to do it in + // smaller chunks instead of all at once + for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { + Wire.beginTransmission(devAddr); + Wire.write(regAddr); + Wire.endTransmission(); + Wire.beginTransmission(devAddr); + Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes + + bool msb = true; // starts with MSB, then LSB + for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { + if (msb) { + // first byte is bits 15-8 (MSb=15) + data[count] = Wire.read() << 8; + } else { + // second byte is bits 7-0 (LSb=0) + data[count] |= Wire.read(); + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[count], HEX); + if (count + 1 < length) Serial.print(" "); + #endif + count++; + } + msb = !msb; + } + + Wire.endTransmission(); + } + #endif + + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) + + // Fastwire library + // no loop required for fastwire + uint16_t intermediate[(uint8_t)length]; + uint8_t status = Fastwire::readBuf(devAddr << 1, regAddr, (uint8_t *)intermediate, (uint8_t)(length * 2)); + if (status == 0) { + count = length; // success + for (uint8_t i = 0; i < length; i++) { + data[i] = (intermediate[2*i] << 8) | intermediate[2*i + 1]; + } + } else { + count = -1; // error + } + + #endif + + if (timeout > 0 && millis() - t1 >= timeout && count < length) count = -1; // timeout + + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(". Done ("); + Serial.print(count, DEC); + Serial.println(" read)."); + #endif + + return count; +} + +/** write a single bit in an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to write to + * @param bitNum Bit position to write (0-7) + * @param value New bit value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data) { + uint8_t b; + readByte(devAddr, regAddr, &b); + b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum)); + return writeByte(devAddr, regAddr, b); +} + +/** write a single bit in a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to write to + * @param bitNum Bit position to write (0-15) + * @param value New bit value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data) { + uint16_t w; + readWord(devAddr, regAddr, &w); + w = (data != 0) ? (w | (1 << bitNum)) : (w & ~(1 << bitNum)); + return writeWord(devAddr, regAddr, w); +} + +/** Write multiple bits in an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to write to + * @param bitStart First bit position to write (0-7) + * @param length Number of bits to write (not more than 8) + * @param data Right-aligned value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data) { + // 010 value to write + // 76543210 bit numbers + // xxx args: bitStart=4, length=3 + // 00011100 mask byte + // 10101111 original value (sample) + // 10100011 original & ~mask + // 10101011 masked | value + uint8_t b; + if (readByte(devAddr, regAddr, &b) != 0) { + uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); + data <<= (bitStart - length + 1); // shift data into correct position + data &= mask; // zero all non-important bits in data + b &= ~(mask); // zero all important bits in existing byte + b |= data; // combine data with existing byte + return writeByte(devAddr, regAddr, b); + } else { + return false; + } +} + +/** Write multiple bits in a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register regAddr to write to + * @param bitStart First bit position to write (0-15) + * @param length Number of bits to write (not more than 16) + * @param data Right-aligned value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data) { + // 010 value to write + // fedcba9876543210 bit numbers + // xxx args: bitStart=12, length=3 + // 0001110000000000 mask word + // 1010111110010110 original value (sample) + // 1010001110010110 original & ~mask + // 1010101110010110 masked | value + uint16_t w; + if (readWord(devAddr, regAddr, &w) != 0) { + uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); + data <<= (bitStart - length + 1); // shift data into correct position + data &= mask; // zero all non-important bits in data + w &= ~(mask); // zero all important bits in existing word + w |= data; // combine data with existing word + return writeWord(devAddr, regAddr, w); + } else { + return false; + } +} + +/** Write single byte to an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register address to write to + * @param data New byte value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { + return writeBytes(devAddr, regAddr, 1, &data); +} + +/** Write single word to a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr Register address to write to + * @param data New word value to write + * @return Status of operation (true = success) + */ +bool I2Cdev::writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data) { + return writeWords(devAddr, regAddr, 1, &data); +} + +/** Write multiple bytes to an 8-bit device register. + * @param devAddr I2C slave device address + * @param regAddr First register address to write to + * @param length Number of bytes to write + * @param data Buffer to copy new data from + * @return Status of operation (true = success) + */ +bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print("I2C (0x"); + Serial.print(devAddr, HEX); + Serial.print(") writing "); + Serial.print(length, DEC); + Serial.print(" bytes to 0x"); + Serial.print(regAddr, HEX); + Serial.print("..."); + #endif + uint8_t status = 0; + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.beginTransmission(devAddr); + Wire.send((uint8_t) regAddr); // send address + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.beginTransmission(devAddr); + Wire.write((uint8_t) regAddr); // send address + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) + Fastwire::beginTransmission(devAddr); + Fastwire::write(regAddr); + #endif + for (uint8_t i = 0; i < length; i++) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[i], HEX); + if (i + 1 < length) Serial.print(" "); + #endif + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.send((uint8_t) data[i]); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.write((uint8_t) data[i]); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) + Fastwire::write((uint8_t) data[i]); + #endif + } + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.endTransmission(); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + status = Wire.endTransmission(); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) + Fastwire::stop(); + //status = Fastwire::endTransmission(); + #endif + #ifdef I2CDEV_SERIAL_DEBUG + Serial.println(". Done."); + #endif + return status == 0; +} + +/** Write multiple words to a 16-bit device register. + * @param devAddr I2C slave device address + * @param regAddr First register address to write to + * @param length Number of words to write + * @param data Buffer to copy new data from + * @return Status of operation (true = success) + */ +bool I2Cdev::writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print("I2C (0x"); + Serial.print(devAddr, HEX); + Serial.print(") writing "); + Serial.print(length, DEC); + Serial.print(" words to 0x"); + Serial.print(regAddr, HEX); + Serial.print("..."); + #endif + uint8_t status = 0; + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.beginTransmission(devAddr); + Wire.send(regAddr); // send address + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.beginTransmission(devAddr); + Wire.write(regAddr); // send address + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) + Fastwire::beginTransmission(devAddr); + Fastwire::write(regAddr); + #endif + for (uint8_t i = 0; i < length * 2; i++) { + #ifdef I2CDEV_SERIAL_DEBUG + Serial.print(data[i], HEX); + if (i + 1 < length) Serial.print(" "); + #endif + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.send((uint8_t)(data[i] >> 8)); // send MSB + Wire.send((uint8_t)data[i++]); // send LSB + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + Wire.write((uint8_t)(data[i] >> 8)); // send MSB + Wire.write((uint8_t)data[i++]); // send LSB + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) + Fastwire::write((uint8_t)(data[i] >> 8)); // send MSB + status = Fastwire::write((uint8_t)data[i++]); // send LSB + if (status != 0) break; + #endif + } + #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) + Wire.endTransmission(); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) + status = Wire.endTransmission(); + #elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) + Fastwire::stop(); + //status = Fastwire::endTransmission(); + #endif + #ifdef I2CDEV_SERIAL_DEBUG + Serial.println(". Done."); + #endif + return status == 0; +} + +/** Default timeout value for read operations. + * Set this to 0 to disable timeout detection. + */ +uint16_t I2Cdev::readTimeout = I2CDEV_DEFAULT_READ_TIMEOUT; + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE + // I2C library + ////////////////////// + // Copyright(C) 2012 + // Francesco Ferrara + // ferrara[at]libero[point]it + ////////////////////// + + /* + FastWire + - 0.24 added stop + - 0.23 added reset + + This is a library to help faster programs to read I2C devices. + Copyright(C) 2012 Francesco Ferrara + occhiobello at gmail dot com + [used by Jeff Rowberg for I2Cdevlib with permission] + */ + + boolean Fastwire::waitInt() { + int l = 250; + while (!(TWCR & (1 << TWINT)) && l-- > 0); + return l > 0; + } + + void Fastwire::setup(int khz, boolean pullup) { + TWCR = 0; + #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega328P__) + // activate internal pull-ups for twi (PORTC bits 4 & 5) + // as per note from atmega8 manual pg167 + if (pullup) PORTC |= ((1 << 4) | (1 << 5)); + else PORTC &= ~((1 << 4) | (1 << 5)); + #elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) + // activate internal pull-ups for twi (PORTC bits 0 & 1) + if (pullup) PORTC |= ((1 << 0) | (1 << 1)); + else PORTC &= ~((1 << 0) | (1 << 1)); + #else + // activate internal pull-ups for twi (PORTD bits 0 & 1) + // as per note from atmega128 manual pg204 + if (pullup) PORTD |= ((1 << 0) | (1 << 1)); + else PORTD &= ~((1 << 0) | (1 << 1)); + #endif + + TWSR = 0; // no prescaler => prescaler = 1 + TWBR = ((16000L / khz) - 16) / 2; // change the I2C clock rate + TWCR = 1 << TWEN; // enable twi module, no interrupt + } + + // added by Jeff Rowberg 2013-05-07: + // Arduino Wire-style "beginTransmission" function + // (takes 7-bit device address like the Wire method, NOT 8-bit: 0x68, not 0xD0/0xD1) + byte Fastwire::beginTransmission(byte device) { + byte twst, retry; + retry = 2; + do { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); + if (!waitInt()) return 1; + twst = TWSR & 0xF8; + if (twst != TW_START && twst != TW_REP_START) return 2; + + //Serial.print(device, HEX); + //Serial.print(" "); + TWDR = device << 1; // send device address without read bit (1) + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 3; + twst = TWSR & 0xF8; + } while (twst == TW_MT_SLA_NACK && retry-- > 0); + if (twst != TW_MT_SLA_ACK) return 4; + return 0; + } + + byte Fastwire::writeBuf(byte device, byte address, byte *data, byte num) { + byte twst, retry; + + retry = 2; + do { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); + if (!waitInt()) return 1; + twst = TWSR & 0xF8; + if (twst != TW_START && twst != TW_REP_START) return 2; + + //Serial.print(device, HEX); + //Serial.print(" "); + TWDR = device & 0xFE; // send device address without read bit (1) + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 3; + twst = TWSR & 0xF8; + } while (twst == TW_MT_SLA_NACK && retry-- > 0); + if (twst != TW_MT_SLA_ACK) return 4; + + //Serial.print(address, HEX); + //Serial.print(" "); + TWDR = address; // send data to the previously addressed device + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 5; + twst = TWSR & 0xF8; + if (twst != TW_MT_DATA_ACK) return 6; + + for (byte i = 0; i < num; i++) { + //Serial.print(data[i], HEX); + //Serial.print(" "); + TWDR = data[i]; // send data to the previously addressed device + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 7; + twst = TWSR & 0xF8; + if (twst != TW_MT_DATA_ACK) return 8; + } + //Serial.print("\n"); + + return 0; + } + + byte Fastwire::write(byte value) { + byte twst; + //Serial.println(value, HEX); + TWDR = value; // send data + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 1; + twst = TWSR & 0xF8; + if (twst != TW_MT_DATA_ACK) return 2; + return 0; + } + + byte Fastwire::readBuf(byte device, byte address, byte *data, byte num) { + byte twst, retry; + + retry = 2; + do { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); + if (!waitInt()) return 16; + twst = TWSR & 0xF8; + if (twst != TW_START && twst != TW_REP_START) return 17; + + //Serial.print(device, HEX); + //Serial.print(" "); + TWDR = device & 0xfe; // send device address to write + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 18; + twst = TWSR & 0xF8; + } while (twst == TW_MT_SLA_NACK && retry-- > 0); + if (twst != TW_MT_SLA_ACK) return 19; + + //Serial.print(address, HEX); + //Serial.print(" "); + TWDR = address; // send data to the previously addressed device + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 20; + twst = TWSR & 0xF8; + if (twst != TW_MT_DATA_ACK) return 21; + + /***/ + + retry = 2; + do { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO) | (1 << TWSTA); + if (!waitInt()) return 22; + twst = TWSR & 0xF8; + if (twst != TW_START && twst != TW_REP_START) return 23; + + //Serial.print(device, HEX); + //Serial.print(" "); + TWDR = device | 0x01; // send device address with the read bit (1) + TWCR = (1 << TWINT) | (1 << TWEN); + if (!waitInt()) return 24; + twst = TWSR & 0xF8; + } while (twst == TW_MR_SLA_NACK && retry-- > 0); + if (twst != TW_MR_SLA_ACK) return 25; + + for (uint8_t i = 0; i < num; i++) { + if (i == num - 1) + TWCR = (1 << TWINT) | (1 << TWEN); + else + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA); + if (!waitInt()) return 26; + twst = TWSR & 0xF8; + if (twst != TW_MR_DATA_ACK && twst != TW_MR_DATA_NACK) return twst; + data[i] = TWDR; + //Serial.print(data[i], HEX); + //Serial.print(" "); + } + //Serial.print("\n"); + stop(); + + return 0; + } + + void Fastwire::reset() { + TWCR = 0; + } + + byte Fastwire::stop() { + TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); + if (!waitInt()) return 1; + return 0; + } +#endif + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE + // NBWire implementation based heavily on code by Gene Knight + // Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html + // Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html + + /* + call this version 1.0 + + Offhand, the only funky part that I can think of is in nbrequestFrom, where the buffer + length and index are set *before* the data is actually read. The problem is that these + are variables local to the TwoWire object, and by the time we actually have read the + data, and know what the length actually is, we have no simple access to the object's + variables. The actual bytes read *is* given to the callback function, though. + + The ISR code for a slave receiver is commented out. I don't have that setup, and can't + verify it at this time. Save it for 2.0! + + The handling of the read and write processes here is much like in the demo sketch code: + the process is broken down into sequential functions, where each registers the next as a + callback, essentially. + + For example, for the Read process, twi_read00 just returns if TWI is not yet in a + ready state. When there's another interrupt, and the interface *is* ready, then it + sets up the read, starts it, and registers twi_read01 as the function to call after + the *next* interrupt. twi_read01, then, just returns if the interface is still in a + "reading" state. When the reading is done, it copies the information to the buffer, + cleans up, and calls the user-requested callback function with the actual number of + bytes read. + + The writing is similar. + + Questions, comments and problems can go to Gene@Telobot.com. + + Thumbs Up! + Gene Knight + + */ + + uint8_t TwoWire::rxBuffer[NBWIRE_BUFFER_LENGTH]; + uint8_t TwoWire::rxBufferIndex = 0; + uint8_t TwoWire::rxBufferLength = 0; + + uint8_t TwoWire::txAddress = 0; + uint8_t TwoWire::txBuffer[NBWIRE_BUFFER_LENGTH]; + uint8_t TwoWire::txBufferIndex = 0; + uint8_t TwoWire::txBufferLength = 0; + + //uint8_t TwoWire::transmitting = 0; + void (*TwoWire::user_onRequest)(void); + void (*TwoWire::user_onReceive)(int); + + static volatile uint8_t twi_transmitting; + static volatile uint8_t twi_state; + static uint8_t twi_slarw; + static volatile uint8_t twi_error; + static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH]; + static volatile uint8_t twi_masterBufferIndex; + static uint8_t twi_masterBufferLength; + static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH]; + static volatile uint8_t twi_rxBufferIndex; + //static volatile uint8_t twi_Interrupt_Continue_Command; + static volatile uint8_t twi_Return_Value; + static volatile uint8_t twi_Done; + void (*twi_cbendTransmissionDone)(int); + void (*twi_cbreadFromDone)(int); + + void twi_init() { + // initialize state + twi_state = TWI_READY; + + // activate internal pull-ups for twi + // as per note from atmega8 manual pg167 + sbi(PORTC, 4); + sbi(PORTC, 5); + + // initialize twi prescaler and bit rate + cbi(TWSR, TWPS0); // TWI Status Register - Prescaler bits + cbi(TWSR, TWPS1); + + /* twi bit rate formula from atmega128 manual pg 204 + SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR)) + note: TWBR should be 10 or higher for master mode + It is 72 for a 16mhz Wiring board with 100kHz TWI */ + + TWBR = ((CPU_FREQ / TWI_FREQ) - 16) / 2; // bitrate register + // enable twi module, acks, and twi interrupt + + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA); + + /* TWEN - TWI Enable Bit + TWIE - TWI Interrupt Enable + TWEA - TWI Enable Acknowledge Bit + TWINT - TWI Interrupt Flag + TWSTA - TWI Start Condition + */ + } + + typedef struct { + uint8_t address; + uint8_t* data; + uint8_t length; + uint8_t wait; + uint8_t i; + } twi_Write_Vars; + + twi_Write_Vars *ptwv = 0; + static void (*fNextInterruptFunction)(void) = 0; + + void twi_Finish(byte bRetVal) { + if (ptwv) { + free(ptwv); + ptwv = 0; + } + twi_Done = 0xFF; + twi_Return_Value = bRetVal; + fNextInterruptFunction = 0; + } + + uint8_t twii_WaitForDone(uint16_t timeout) { + uint32_t endMillis = millis() + timeout; + while (!twi_Done && (timeout == 0 || millis() < endMillis)) continue; + return twi_Return_Value; + } + + void twii_SetState(uint8_t ucState) { + twi_state = ucState; + } + + void twii_SetError(uint8_t ucError) { + twi_error = ucError ; + } + + void twii_InitBuffer(uint8_t ucPos, uint8_t ucLength) { + twi_masterBufferIndex = 0; + twi_masterBufferLength = ucLength; + } + + void twii_CopyToBuf(uint8_t* pData, uint8_t ucLength) { + uint8_t i; + for (i = 0; i < ucLength; ++i) { + twi_masterBuffer[i] = pData[i]; + } + } + + void twii_CopyFromBuf(uint8_t *pData, uint8_t ucLength) { + uint8_t i; + for (i = 0; i < ucLength; ++i) { + pData[i] = twi_masterBuffer[i]; + } + } + + void twii_SetSlaRW(uint8_t ucSlaRW) { + twi_slarw = ucSlaRW; + } + + void twii_SetStart() { + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA); + } + + void twi_write01() { + if (TWI_MTX == twi_state) return; // blocking test + twi_transmitting = 0 ; + if (twi_error == 0xFF) + twi_Finish (0); // success + else if (twi_error == TW_MT_SLA_NACK) + twi_Finish (2); // error: address send, nack received + else if (twi_error == TW_MT_DATA_NACK) + twi_Finish (3); // error: data send, nack received + else + twi_Finish (4); // other twi error + if (twi_cbendTransmissionDone) return twi_cbendTransmissionDone(twi_Return_Value); + return; + } + + + void twi_write00() { + if (TWI_READY != twi_state) return; // blocking test + if (TWI_BUFFER_LENGTH < ptwv -> length) { + twi_Finish(1); // end write with error 1 + return; + } + twi_Done = 0x00; // show as working + twii_SetState(TWI_MTX); // to transmitting + twii_SetError(0xFF); // to No Error + twii_InitBuffer(0, ptwv -> length); // pointer and length + twii_CopyToBuf(ptwv -> data, ptwv -> length); // get the data + twii_SetSlaRW((ptwv -> address << 1) | TW_WRITE); // write command + twii_SetStart(); // start the cycle + fNextInterruptFunction = twi_write01; // next routine + return twi_write01(); + } + + void twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait) { + uint8_t i; + ptwv = (twi_Write_Vars *)malloc(sizeof(twi_Write_Vars)); + ptwv -> address = address; + ptwv -> data = data; + ptwv -> length = length; + ptwv -> wait = wait; + fNextInterruptFunction = twi_write00; + return twi_write00(); + } + + void twi_read01() { + if (TWI_MRX == twi_state) return; // blocking test + if (twi_masterBufferIndex < ptwv -> length) ptwv -> length = twi_masterBufferIndex; + twii_CopyFromBuf(ptwv -> data, ptwv -> length); + twi_Finish(ptwv -> length); + if (twi_cbreadFromDone) return twi_cbreadFromDone(twi_Return_Value); + return; + } + + void twi_read00() { + if (TWI_READY != twi_state) return; // blocking test + if (TWI_BUFFER_LENGTH < ptwv -> length) twi_Finish(0); // error return + twi_Done = 0x00; // show as working + twii_SetState(TWI_MRX); // reading + twii_SetError(0xFF); // reset error + twii_InitBuffer(0, ptwv -> length - 1); // init to one less than length + twii_SetSlaRW((ptwv -> address << 1) | TW_READ); // read command + twii_SetStart(); // start cycle + fNextInterruptFunction = twi_read01; + return twi_read01(); + } + + void twi_readFrom(uint8_t address, uint8_t* data, uint8_t length) { + uint8_t i; + + ptwv = (twi_Write_Vars *)malloc(sizeof(twi_Write_Vars)); + ptwv -> address = address; + ptwv -> data = data; + ptwv -> length = length; + fNextInterruptFunction = twi_read00; + return twi_read00(); + } + + void twi_reply(uint8_t ack) { + // transmit master read ready signal, with or without ack + if (ack){ + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA); + } else { + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT); + } + } + + void twi_stop(void) { + // send stop condition + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO); + + // wait for stop condition to be exectued on bus + // TWINT is not set after a stop condition! + while (TWCR & _BV(TWSTO)) { + continue; + } + + // update twi state + twi_state = TWI_READY; + } + + void twi_releaseBus(void) { + // release bus + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT); + + // update twi state + twi_state = TWI_READY; + } + + SIGNAL(TWI_vect) { + switch (TW_STATUS) { + // All Master + case TW_START: // sent start condition + case TW_REP_START: // sent repeated start condition + // copy device address and r/w bit to output register and ack + TWDR = twi_slarw; + twi_reply(1); + break; + + // Master Transmitter + case TW_MT_SLA_ACK: // slave receiver acked address + case TW_MT_DATA_ACK: // slave receiver acked data + // if there is data to send, send it, otherwise stop + if (twi_masterBufferIndex < twi_masterBufferLength) { + // copy data to output register and ack + TWDR = twi_masterBuffer[twi_masterBufferIndex++]; + twi_reply(1); + } else { + twi_stop(); + } + break; + + case TW_MT_SLA_NACK: // address sent, nack received + twi_error = TW_MT_SLA_NACK; + twi_stop(); + break; + + case TW_MT_DATA_NACK: // data sent, nack received + twi_error = TW_MT_DATA_NACK; + twi_stop(); + break; + + case TW_MT_ARB_LOST: // lost bus arbitration + twi_error = TW_MT_ARB_LOST; + twi_releaseBus(); + break; + + // Master Receiver + case TW_MR_DATA_ACK: // data received, ack sent + // put byte into buffer + twi_masterBuffer[twi_masterBufferIndex++] = TWDR; + + case TW_MR_SLA_ACK: // address sent, ack received + // ack if more bytes are expected, otherwise nack + if (twi_masterBufferIndex < twi_masterBufferLength) { + twi_reply(1); + } else { + twi_reply(0); + } + break; + + case TW_MR_DATA_NACK: // data received, nack sent + // put final byte into buffer + twi_masterBuffer[twi_masterBufferIndex++] = TWDR; + + case TW_MR_SLA_NACK: // address sent, nack received + twi_stop(); + break; + + // TW_MR_ARB_LOST handled by TW_MT_ARB_LOST case + + // Slave Receiver (NOT IMPLEMENTED YET) + /* + case TW_SR_SLA_ACK: // addressed, returned ack + case TW_SR_GCALL_ACK: // addressed generally, returned ack + case TW_SR_ARB_LOST_SLA_ACK: // lost arbitration, returned ack + case TW_SR_ARB_LOST_GCALL_ACK: // lost arbitration, returned ack + // enter slave receiver mode + twi_state = TWI_SRX; + + // indicate that rx buffer can be overwritten and ack + twi_rxBufferIndex = 0; + twi_reply(1); + break; + + case TW_SR_DATA_ACK: // data received, returned ack + case TW_SR_GCALL_DATA_ACK: // data received generally, returned ack + // if there is still room in the rx buffer + if (twi_rxBufferIndex < TWI_BUFFER_LENGTH) { + // put byte in buffer and ack + twi_rxBuffer[twi_rxBufferIndex++] = TWDR; + twi_reply(1); + } else { + // otherwise nack + twi_reply(0); + } + break; + + case TW_SR_STOP: // stop or repeated start condition received + // put a null char after data if there's room + if (twi_rxBufferIndex < TWI_BUFFER_LENGTH) { + twi_rxBuffer[twi_rxBufferIndex] = 0; + } + + // sends ack and stops interface for clock stretching + twi_stop(); + + // callback to user defined callback + twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex); + + // since we submit rx buffer to "wire" library, we can reset it + twi_rxBufferIndex = 0; + + // ack future responses and leave slave receiver state + twi_releaseBus(); + break; + + case TW_SR_DATA_NACK: // data received, returned nack + case TW_SR_GCALL_DATA_NACK: // data received generally, returned nack + // nack back at master + twi_reply(0); + break; + + // Slave Transmitter + case TW_ST_SLA_ACK: // addressed, returned ack + case TW_ST_ARB_LOST_SLA_ACK: // arbitration lost, returned ack + // enter slave transmitter mode + twi_state = TWI_STX; + + // ready the tx buffer index for iteration + twi_txBufferIndex = 0; + + // set tx buffer length to be zero, to verify if user changes it + twi_txBufferLength = 0; + + // request for txBuffer to be filled and length to be set + // note: user must call twi_transmit(bytes, length) to do this + twi_onSlaveTransmit(); + + // if they didn't change buffer & length, initialize it + if (0 == twi_txBufferLength) { + twi_txBufferLength = 1; + twi_txBuffer[0] = 0x00; + } + + // transmit first byte from buffer, fall through + + case TW_ST_DATA_ACK: // byte sent, ack returned + // copy data to output register + TWDR = twi_txBuffer[twi_txBufferIndex++]; + + // if there is more to send, ack, otherwise nack + if (twi_txBufferIndex < twi_txBufferLength) { + twi_reply(1); + } else { + twi_reply(0); + } + break; + + case TW_ST_DATA_NACK: // received nack, we are done + case TW_ST_LAST_DATA: // received ack, but we are done already! + // ack future responses + twi_reply(1); + // leave slave receiver state + twi_state = TWI_READY; + break; + */ + + // all + case TW_NO_INFO: // no state information + break; + + case TW_BUS_ERROR: // bus error, illegal stop/start + twi_error = TW_BUS_ERROR; + twi_stop(); + break; + } + + if (fNextInterruptFunction) return fNextInterruptFunction(); + } + + TwoWire::TwoWire() { } + + void TwoWire::begin(void) { + rxBufferIndex = 0; + rxBufferLength = 0; + + txBufferIndex = 0; + txBufferLength = 0; + + twi_init(); + } + + void TwoWire::beginTransmission(uint8_t address) { + //beginTransmission((uint8_t)address); + + // indicate that we are transmitting + twi_transmitting = 1; + + // set address of targeted slave + txAddress = address; + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + } + + uint8_t TwoWire::endTransmission(uint16_t timeout) { + // transmit buffer (blocking) + //int8_t ret = + twi_cbendTransmissionDone = NULL; + twi_writeTo(txAddress, txBuffer, txBufferLength, 1); + int8_t ret = twii_WaitForDone(timeout); + + // reset tx buffer iterator vars + txBufferIndex = 0; + txBufferLength = 0; + + // indicate that we are done transmitting + // twi_transmitting = 0; + return ret; + } + + void TwoWire::nbendTransmission(void (*function)(int)) { + twi_cbendTransmissionDone = function; + twi_writeTo(txAddress, txBuffer, txBufferLength, 1); + return; + } + + void TwoWire::send(uint8_t data) { + if (twi_transmitting) { + // in master transmitter mode + // don't bother if buffer is full + if (txBufferLength >= NBWIRE_BUFFER_LENGTH) { + return; + } + + // put byte in tx buffer + txBuffer[txBufferIndex] = data; + ++txBufferIndex; + + // update amount in buffer + txBufferLength = txBufferIndex; + } else { + // in slave send mode + // reply to master + //twi_transmit(&data, 1); + } + } + + uint8_t TwoWire::receive(void) { + // default to returning null char + // for people using with char strings + uint8_t value = 0; + + // get each successive byte on each call + if (rxBufferIndex < rxBufferLength) { + value = rxBuffer[rxBufferIndex]; + ++rxBufferIndex; + } + + return value; + } + + uint8_t TwoWire::requestFrom(uint8_t address, int quantity, uint16_t timeout) { + // clamp to buffer length + if (quantity > NBWIRE_BUFFER_LENGTH) { + quantity = NBWIRE_BUFFER_LENGTH; + } + + // perform blocking read into buffer + twi_cbreadFromDone = NULL; + twi_readFrom(address, rxBuffer, quantity); + uint8_t read = twii_WaitForDone(timeout); + + // set rx buffer iterator vars + rxBufferIndex = 0; + rxBufferLength = read; + + return read; + } + + void TwoWire::nbrequestFrom(uint8_t address, int quantity, void (*function)(int)) { + // clamp to buffer length + if (quantity > NBWIRE_BUFFER_LENGTH) { + quantity = NBWIRE_BUFFER_LENGTH; + } + + // perform blocking read into buffer + twi_cbreadFromDone = function; + twi_readFrom(address, rxBuffer, quantity); + //uint8_t read = twii_WaitForDone(); + + // set rx buffer iterator vars + //rxBufferIndex = 0; + //rxBufferLength = read; + + rxBufferIndex = 0; + rxBufferLength = quantity; // this is a hack + + return; //read; + } + + uint8_t TwoWire::available(void) { + return rxBufferLength - rxBufferIndex; + } + +#endif diff --git a/libraries/I2Cdev/I2Cdev.h b/libraries/I2Cdev/I2Cdev.h new file mode 100644 index 0000000..4c0a2e7 --- /dev/null +++ b/libraries/I2Cdev/I2Cdev.h @@ -0,0 +1,278 @@ +// I2Cdev library collection - Main I2C device class header file +// Abstracts bit and byte I2C R/W functions into a convenient class +// 2013-06-05 by Jeff Rowberg +// +// Changelog: +// 2015-10-30 - simondlevy : support i2c_t3 for Teensy3.1 +// 2013-05-06 - add Francesco Ferrara's Fastwire v0.24 implementation with small modifications +// 2013-05-05 - fix issue with writing bit values to words (Sasquatch/Farzanegan) +// 2012-06-09 - fix major issue with reading > 32 bytes at a time with Arduino Wire +// - add compiler warnings when using outdated or IDE or limited I2Cdev implementation +// 2011-11-01 - fix write*Bits mask calculation (thanks sasquatch @ Arduino forums) +// 2011-10-03 - added automatic Arduino version detection for ease of use +// 2011-10-02 - added Gene Knight's NBWire TwoWire class implementation with small modifications +// 2011-08-31 - added support for Arduino 1.0 Wire library (methods are different from 0.x) +// 2011-08-03 - added optional timeout parameter to read* methods to easily change from default +// 2011-08-02 - added support for 16-bit registers +// - fixed incorrect Doxygen comments on some methods +// - added timeout value for read operations (thanks mem @ Arduino forums) +// 2011-07-30 - changed read/write function structures to return success or byte counts +// - made all methods static for multi-device memory savings +// 2011-07-28 - initial release + +/* ============================================ +I2Cdev device library code is placed under the MIT license +Copyright (c) 2013 Jeff Rowberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +=============================================== +*/ + +#ifndef _I2CDEV_H_ +#define _I2CDEV_H_ + +// ----------------------------------------------------------------------------- +// I2C interface implementation setting +// ----------------------------------------------------------------------------- +#ifndef I2CDEV_IMPLEMENTATION +#define I2CDEV_IMPLEMENTATION I2CDEV_ARDUINO_WIRE +//#define I2CDEV_IMPLEMENTATION I2CDEV_BUILTIN_FASTWIRE +#endif // I2CDEV_IMPLEMENTATION + +// comment this out if you are using a non-optimal IDE/implementation setting +// but want the compiler to shut up about it +#define I2CDEV_IMPLEMENTATION_WARNINGS + +// ----------------------------------------------------------------------------- +// I2C interface implementation options +// ----------------------------------------------------------------------------- +#define I2CDEV_ARDUINO_WIRE 1 // Wire object from Arduino +#define I2CDEV_BUILTIN_NBWIRE 2 // Tweaked Wire object from Gene Knight's NBWire project + // ^^^ NBWire implementation is still buggy w/some interrupts! +#define I2CDEV_BUILTIN_FASTWIRE 3 // FastWire object from Francesco Ferrara's project +#define I2CDEV_I2CMASTER_LIBRARY 4 // I2C object from DSSCircuits I2C-Master Library at https://github.com/DSSCircuits/I2C-Master-Library + +// ----------------------------------------------------------------------------- +// Arduino-style "Serial.print" debug constant (uncomment to enable) +// ----------------------------------------------------------------------------- +//#define I2CDEV_SERIAL_DEBUG + +#ifdef ARDUINO + #if ARDUINO < 100 + #include "WProgram.h" + #else + #include "Arduino.h" + #endif + #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE + #include + #endif + #if I2CDEV_IMPLEMENTATION == I2CDEV_I2CMASTER_LIBRARY + #include + #endif +#endif + +#ifdef SPARK + #include + #define ARDUINO 101 +#endif + + +// 1000ms default read timeout (modify with "I2Cdev::readTimeout = [ms];") +#define I2CDEV_DEFAULT_READ_TIMEOUT 1000 + +class I2Cdev { + public: + I2Cdev(); + + static int8_t readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); + static int8_t readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); + + static bool writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data); + static bool writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data); + static bool writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data); + static bool writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data); + static bool writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data); + static bool writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data); + static bool writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data); + static bool writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data); + + static uint16_t readTimeout; +}; + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE + ////////////////////// + // FastWire 0.24 + // This is a library to help faster programs to read I2C devices. + // Copyright(C) 2012 + // Francesco Ferrara + ////////////////////// + + /* Master */ + #define TW_START 0x08 + #define TW_REP_START 0x10 + + /* Master Transmitter */ + #define TW_MT_SLA_ACK 0x18 + #define TW_MT_SLA_NACK 0x20 + #define TW_MT_DATA_ACK 0x28 + #define TW_MT_DATA_NACK 0x30 + #define TW_MT_ARB_LOST 0x38 + + /* Master Receiver */ + #define TW_MR_ARB_LOST 0x38 + #define TW_MR_SLA_ACK 0x40 + #define TW_MR_SLA_NACK 0x48 + #define TW_MR_DATA_ACK 0x50 + #define TW_MR_DATA_NACK 0x58 + + #define TW_OK 0 + #define TW_ERROR 1 + + class Fastwire { + private: + static boolean waitInt(); + + public: + static void setup(int khz, boolean pullup); + static byte beginTransmission(byte device); + static byte write(byte value); + static byte writeBuf(byte device, byte address, byte *data, byte num); + static byte readBuf(byte device, byte address, byte *data, byte num); + static void reset(); + static byte stop(); + }; +#endif + +#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE + // NBWire implementation based heavily on code by Gene Knight + // Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html + // Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html + + #define NBWIRE_BUFFER_LENGTH 32 + + class TwoWire { + private: + static uint8_t rxBuffer[]; + static uint8_t rxBufferIndex; + static uint8_t rxBufferLength; + + static uint8_t txAddress; + static uint8_t txBuffer[]; + static uint8_t txBufferIndex; + static uint8_t txBufferLength; + + // static uint8_t transmitting; + static void (*user_onRequest)(void); + static void (*user_onReceive)(int); + static void onRequestService(void); + static void onReceiveService(uint8_t*, int); + + public: + TwoWire(); + void begin(); + void begin(uint8_t); + void begin(int); + void beginTransmission(uint8_t); + //void beginTransmission(int); + uint8_t endTransmission(uint16_t timeout=0); + void nbendTransmission(void (*function)(int)) ; + uint8_t requestFrom(uint8_t, int, uint16_t timeout=0); + //uint8_t requestFrom(int, int); + void nbrequestFrom(uint8_t, int, void (*function)(int)); + void send(uint8_t); + void send(uint8_t*, uint8_t); + //void send(int); + void send(char*); + uint8_t available(void); + uint8_t receive(void); + void onReceive(void (*)(int)); + void onRequest(void (*)(void)); + }; + + #define TWI_READY 0 + #define TWI_MRX 1 + #define TWI_MTX 2 + #define TWI_SRX 3 + #define TWI_STX 4 + + #define TW_WRITE 0 + #define TW_READ 1 + + #define TW_MT_SLA_NACK 0x20 + #define TW_MT_DATA_NACK 0x30 + + #define CPU_FREQ 16000000L + #define TWI_FREQ 100000L + #define TWI_BUFFER_LENGTH 32 + + /* TWI Status is in TWSR, in the top 5 bits: TWS7 - TWS3 */ + + #define TW_STATUS_MASK (_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3)) + #define TW_STATUS (TWSR & TW_STATUS_MASK) + #define TW_START 0x08 + #define TW_REP_START 0x10 + #define TW_MT_SLA_ACK 0x18 + #define TW_MT_SLA_NACK 0x20 + #define TW_MT_DATA_ACK 0x28 + #define TW_MT_DATA_NACK 0x30 + #define TW_MT_ARB_LOST 0x38 + #define TW_MR_ARB_LOST 0x38 + #define TW_MR_SLA_ACK 0x40 + #define TW_MR_SLA_NACK 0x48 + #define TW_MR_DATA_ACK 0x50 + #define TW_MR_DATA_NACK 0x58 + #define TW_ST_SLA_ACK 0xA8 + #define TW_ST_ARB_LOST_SLA_ACK 0xB0 + #define TW_ST_DATA_ACK 0xB8 + #define TW_ST_DATA_NACK 0xC0 + #define TW_ST_LAST_DATA 0xC8 + #define TW_SR_SLA_ACK 0x60 + #define TW_SR_ARB_LOST_SLA_ACK 0x68 + #define TW_SR_GCALL_ACK 0x70 + #define TW_SR_ARB_LOST_GCALL_ACK 0x78 + #define TW_SR_DATA_ACK 0x80 + #define TW_SR_DATA_NACK 0x88 + #define TW_SR_GCALL_DATA_ACK 0x90 + #define TW_SR_GCALL_DATA_NACK 0x98 + #define TW_SR_STOP 0xA0 + #define TW_NO_INFO 0xF8 + #define TW_BUS_ERROR 0x00 + + //#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) + //#define _SFR_BYTE(sfr) _MMIO_BYTE(_SFR_ADDR(sfr)) + + #ifndef sbi // set bit + #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) + #endif // sbi + + #ifndef cbi // clear bit + #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) + #endif // cbi + + extern TwoWire Wire; + +#endif // I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE + +#endif /* _I2CDEV_H_ */ diff --git a/libraries/I2Cdev/keywords.txt b/libraries/I2Cdev/keywords.txt new file mode 100644 index 0000000..4132a06 --- /dev/null +++ b/libraries/I2Cdev/keywords.txt @@ -0,0 +1,38 @@ +####################################### +# Syntax Coloring Map For I2Cdev +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### +I2Cdev KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +readBit KEYWORD2 +readBitW KEYWORD2 +readBits KEYWORD2 +readBitsW KEYWORD2 +readByte KEYWORD2 +readBytes KEYWORD2 +readWord KEYWORD2 +readWords KEYWORD2 +writeBit KEYWORD2 +writeBitW KEYWORD2 +writeBits KEYWORD2 +writeBitsW KEYWORD2 +writeByte KEYWORD2 +writeBytes KEYWORD2 +writeWord KEYWORD2 +writeWords KEYWORD2 + +####################################### +# Instances (KEYWORD2) +####################################### + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/libraries/I2Cdev/library.json b/libraries/I2Cdev/library.json new file mode 100644 index 0000000..d456096 --- /dev/null +++ b/libraries/I2Cdev/library.json @@ -0,0 +1,13 @@ +{ + "name": "I2Cdevlib-Core", + "keywords": "i2cdevlib, i2c", + "description": "The I2C Device Library (I2Cdevlib) is a collection of uniform and well-documented classes to provide simple and intuitive interfaces to I2C devices.", + "include": "Arduino/I2Cdev", + "repository": + { + "type": "git", + "url": "https://github.com/jrowberg/i2cdevlib.git" + }, + "frameworks": "arduino", + "platforms": "atmelavr" +} diff --git a/libraries/iarduino_OLED/examples/ShowFigures/ShowFigures.ino b/libraries/iarduino_OLED/examples/ShowFigures/ShowFigures.ino new file mode 100644 index 0000000..d65e687 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowFigures/ShowFigures.ino @@ -0,0 +1,37 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. +} // + // +void loop(){ // + myOLED.drawRect (10, 10, 50, 50, true , true ); // Прорисовываем квадрат по двум точкам: 10x10, 50x50 , закрасить - true (да) , цвет - true (белый). + myOLED.drawRect (15, 15, 45, 45, true , false); // Прорисовываем квадрат по двум точкам: 15x15, 45x45 , закрасить - true (да) , цвет - false (черный). + myOLED.drawLine (10, 10, 50, 50, false); // Прорисовываем линию через две точки: 10x10, 50x50 , цвет - false (черный). + myOLED.drawLine (10, 50, 50, 10, false); // Прорисовываем линию через две точки: 10x50, 50x10 , цвет - false (черный). + myOLED.drawCircle (30, 30, 10, false, true ); // Прорисовываем круг с центром с точке 30x30 и радиусом 10, закрасить - false (нет), цвет - true (белый). + myOLED.drawCircle (30, 30, 5, true , true ); // Прорисовываем круг с центром с точке 30x30 и радиусом 5 , закрасить - true (да) , цвет - true (белый). + myOLED.drawPixel (30, 30, false); // Прорисовываем точку в координате 30x30, цвет - false (черный). + myOLED.drawRect (60, 10, 100, 50, false, true ); // Прорисовываем квадрат по двум точкам: 60x10, 100x50 , закрасить - false (нет), цвет - true (белый). + myOLED.drawRect (65, 15, 95, 45, true , true ); // Прорисовываем квадрат по двум точкам: 65x15, 95x45 , закрасить - true (да) , цвет - true (белый). + myOLED.drawLine (60, 10, 100, 50, true ); // Прорисовываем линию через две точки: 60x10, 100x50 , цвет - true (белый). + myOLED.drawLine (60, 50, 100, 10, true ); // Прорисовываем линию через две точки: 60x50, 100x10 , цвет - true (белый). + myOLED.drawCircle (80, 30, 10, false, false); // Прорисовываем круг с центром с точке 80x30 и радиусом 10, закрасить - false (нет), цвет - false (черный). + myOLED.drawCircle (80, 30, 5, true, false); // Прорисовываем круг с центром с точке 80x30 и радиусом 10, закрасить - true (да) , цвет - false (черный). + myOLED.drawPixel (80, 30, true ); // Прорисовываем точку в координате 80x30, цвет - true (белый). + delay(2000); // Ждём 2 секунды. + myOLED.clrScr(); // Чистим экран. + delay(1000); // Ждём 1 секунду. +} // diff --git a/libraries/iarduino_OLED/examples/ShowFigures_Update/ShowFigures_Update.ino b/libraries/iarduino_OLED/examples/ShowFigures_Update/ShowFigures_Update.ino new file mode 100644 index 0000000..5d9d689 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowFigures_Update/ShowFigures_Update.ino @@ -0,0 +1,40 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.autoUpdate(false); // Запрещаем автоматический вывод данных. Информация на дисплее будет обновляться только после обращения к функции update(). +} // + // +void loop(){ // + myOLED.drawRect (10, 10, 50, 50, true , true ); // Прорисовываем квадрат по двум точкам: 10x10, 50x50 , закрасить - true (да) , цвет - true (белый). + myOLED.drawRect (15, 15, 45, 45, true , false); // Прорисовываем квадрат по двум точкам: 15x15, 45x45 , закрасить - true (да) , цвет - false (черный). + myOLED.drawLine (10, 10, 50, 50, false); // Прорисовываем линию через две точки: 10x10, 50x50 , цвет - false (черный). + myOLED.drawLine (10, 50, 50, 10, false); // Прорисовываем линию через две точки: 10x50, 50x10 , цвет - false (черный). + myOLED.drawCircle (30, 30, 10, false, true ); // Прорисовываем круг с центром с точке 30x30 и радиусом 10, закрасить - false (нет), цвет - true (белый). + myOLED.drawCircle (30, 30, 5, true , true ); // Прорисовываем круг с центром с точке 30x30 и радиусом 5 , закрасить - true (да) , цвет - true (белый). + myOLED.drawPixel (30, 30, false); // Прорисовываем точку в координате 30x30, цвет - false (черный). + myOLED.drawRect (60, 10, 100, 50, false, true ); // Прорисовываем квадрат по двум точкам: 60x10, 100x50 , закрасить - false (нет), цвет - true (белый). + myOLED.drawRect (65, 15, 95, 45, true , true ); // Прорисовываем квадрат по двум точкам: 65x15, 95x45 , закрасить - true (да) , цвет - true (белый). + myOLED.drawLine (60, 10, 100, 50, true ); // Прорисовываем линию через две точки: 60x10, 100x50 , цвет - true (белый). + myOLED.drawLine (60, 50, 100, 10, true ); // Прорисовываем линию через две точки: 60x50, 100x10 , цвет - true (белый). + myOLED.drawCircle (80, 30, 10, false, false); // Прорисовываем круг с центром с точке 80x30 и радиусом 10, закрасить - false (нет), цвет - false (черный). + myOLED.drawCircle (80, 30, 5, true, false); // Прорисовываем круг с центром с точке 80x30 и радиусом 10, закрасить - true (да) , цвет - false (черный). + myOLED.drawPixel (80, 30, true ); // Прорисовываем точку в координате 80x30, цвет - true (белый). + myOLED.update(); // Обновляем информацию на дисплее. + delay(2000); // Ждём 2 секунды. + myOLED.clrScr(); // Чистим экран. + myOLED.update(); // Обновляем информацию на дисплее. + delay(1000); // Ждём 1 секунду. +} // diff --git a/libraries/iarduino_OLED/examples/ShowImage_Battery/ShowImage_Battery.ino b/libraries/iarduino_OLED/examples/ShowImage_Battery/ShowImage_Battery.ino new file mode 100644 index 0000000..36f40b2 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowImage_Battery/ShowImage_Battery.ino @@ -0,0 +1,41 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t Img_Level_4[]; // Подключаем изображение Img_Level_4 из встроенных картинок. +extern uint8_t Img_Antenna[]; // Подключаем изображение Img_Antenna из встроенных картинок. +extern uint8_t Img_Battery_0[]; // Подключаем изображение Img_Battery_0 из встроенных картинок. +extern uint8_t Img_Battery_1[]; // Подключаем изображение Img_Battery_1 из встроенных картинок. +extern uint8_t Img_Battery_2[]; // Подключаем изображение Img_Battery_2 из встроенных картинок. +extern uint8_t Img_Battery_3[]; // Подключаем изображение Img_Battery_3 из встроенных картинок. +extern uint8_t Img_BigBattery_low[]; // Подключаем изображение Img_BigBattery_low из встроенных картинок. + uint8_t i=0; // Определяем переменную которая будет хранить номер от 0 до 3. + // +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.drawImage(Img_Level_4 , 0 , 7 ); // Выводим картинку Img_Level_4, указав координату её левого нижнего угла 0x7. + myOLED.drawImage(Img_Antenna , 12 , 7 ); // Выводим картинку Img_Antenna, указав координату её левого нижнего угла 10x7. + myOLED.drawImage(Img_BigBattery_low, OLED_C, OLED_C); // Выводим картинку Img_BigBattery_low по центру экрана. +} // +void loop(){ // + while(millis()%300==0){ // Выполняем код в теле оператора while через каждые 300 мс. + i++; if(i>3){i=0;} // Увеличиваем значение переменной i и обнуляем её если значение стало больше 3. + switch(i){ // Создаём анимацию из четырех картинок, меняя их по значению переменной i. + case 0: myOLED.drawImage(Img_Battery_0, OLED_R,OLED_T); break; // Выводим изображение Img_Battery_0 в правом верхнем углу экрана. + case 1: myOLED.drawImage(Img_Battery_1, OLED_R,OLED_T); break; // Выводим изображение Img_Battery_0 в правом верхнем углу экрана. + case 2: myOLED.drawImage(Img_Battery_2, OLED_R,OLED_T); break; // Выводим изображение Img_Battery_0 в правом верхнем углу экрана. + case 3: myOLED.drawImage(Img_Battery_3, OLED_R,OLED_T); break; // Выводим изображение Img_Battery_0 в правом верхнем углу экрана. + } // + } // +} // + diff --git a/libraries/iarduino_OLED/examples/ShowImage_Logo/ShowImage_Logo.ino b/libraries/iarduino_OLED/examples/ShowImage_Logo/ShowImage_Logo.ino new file mode 100644 index 0000000..12d8388 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowImage_Logo/ShowImage_Logo.ino @@ -0,0 +1,30 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. +extern uint8_t MediumFont[]; // Подключаем шрифт MediumFont. Если Вы желаете использовать Кириллицу, то нужно подключить шрифт MediumFontRus. +extern uint8_t Img_Logo[]; // Подключаем изображение Img_Logo из встроенных картинок. + // +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + // + myOLED.drawImage(Img_Logo, 0, 30); // Выводим картинку Img_Logo в позицию 0x30. + // + myOLED.setFont(MediumFont); // Указываем шрифт который требуется использовать для вывода цифр и текста. + myOLED.print("iarduino", OLED_R); // Выводим текст "iarduino", выравнивая его по правому краю. Нижний край текста совпадёт с нижним краем предыдущей картинки. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. + myOLED.print("всё для радиолюбителя", 0, 41); // Выводим текст "всё для радиолюбителя". +} // +void loop(){} // + diff --git a/libraries/iarduino_OLED/examples/ShowImage_RAM_ROM/ShowImage_RAM_ROM.ino b/libraries/iarduino_OLED/examples/ShowImage_RAM_ROM/ShowImage_RAM_ROM.ino new file mode 100644 index 0000000..a51c508 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowImage_RAM_ROM/ShowImage_RAM_ROM.ino @@ -0,0 +1,39 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +const uint8_t myImageInRAM[] = // Создаём массив myImageInRAM содержащий изображение смайлика. Массив хранится в области ОЗУ (RAM). +{ 9, 8, // ЛЕВО // Первые два числа, это размеры изображения: ширина 9px, высота 8px. Высота изображения всегда должна быть кратна 8 (8,16,24,32,...). + B00111100, // #### // = 0x3C + B01000010, // # # // = 0x42 + B10010001, // # # # // = 0x91 Если байты массива указывать не в двоичной, + B10100101, // # # # # // = 0xA5 а в шестнадцатеричной системе счисления, + B10100001, // НИЗ # # # ВЕРХ // = 0xA1 то запись массива будет более короткой: + B10100101, // # # # # // = 0xA5 + B10010001, // # # # // = 0x91 const uint8_t myImageInRAM[]={9,8,0x3C,0x42,0x91,0xA5,0xA1,0xA5,0x91,0x42,0x3C}; + B01000010, // # # // = 0x42 + B00111100 // #### // = 0x3C +}; // ПРАВО // + // +const uint8_t myImageInROM[] PROGMEM = // Создаём массив myImageInROM содержащий изображение смайлика. Массив хранится в области ПЗУ (ROM). +{9, 8, 0x3C, 0x42, 0x91, 0xA5, 0xA1, 0xA5, 0x91, 0x42, 0x3C}; // Данные этого массива аналогичны предыдущему, но записаны в 16-ричной системе счисления. + // +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + // + myOLED.drawImage(myImageInRAM, 36, 27, IMG_RAM); // Выводим картинку myImageInRAM в позицию 36x27, указав, что картинка хранится в оперативной памяти (IMG_RAM). + myOLED.drawImage(myImageInROM, 81, 27, IMG_ROM); // Выводим картинку myImageInRAM в позицию 81x27, указав, что картинка хранится в памяти программ (IMG_ROM). + // +} // +void loop(){} // + diff --git a/libraries/iarduino_OLED/examples/ShowMediumFont/ShowMediumFont.ino b/libraries/iarduino_OLED/examples/ShowMediumFont/ShowMediumFont.ino new file mode 100644 index 0000000..05d3bf7 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowMediumFont/ShowMediumFont.ino @@ -0,0 +1,74 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t MediumFontRus[]; // Подключаем шрифт MediumFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт MediumFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // + // +void loop(){ // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("iArduino"), 15, 39); // Выводим текст начиная с координаты 15x39. + delay (500); // Ждём пол секунды. + myOLED.print(F("ABC"), 0, 15); // Выводим текст начиная с координаты 0x15. + delay (500); // Ждём пол секунды. + myOLED.print(F("XYZ"), 92, 63); // Выводим текст начиная с координаты 92x63. + delay (500); // Ждём пол секунды. + myOLED.print(F("abc"), 92, 15); // Выводим текст начиная с координаты 92x15. + delay (500); // Ждём пол секунды. + myOLED.print(F("xyz"), 0, 63); // Выводим текст начиная с координаты 0x63. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("iАрдуино"), OLED_C, 39); // Выводим по центру, координата нижней части текста по оси Y равна 39. + delay (500); // Ждём пол секунды. + myOLED.print(F("АБВ"), OLED_L, 15); // Выводим по левому краю, координата нижней части текста по оси Y равна 15. + delay (500); // Ждём пол секунды. + myOLED.print(F("ЭЮЯ"), OLED_R, 63); // Выводим по правому краю, координата нижней части текста по оси Y равна 63. + delay (500); // Ждём пол секунды. + myOLED.print(F("абв"), OLED_R, 15); // Выводим по правому краю, координата нижней части текста по оси Y равна 15. + delay (500); // Ждём пол секунды. + myOLED.print(F("эюя"), OLED_L, 63); // Выводим по левому краю, координата нижней части текста по оси Y равна 63. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print( 77, 0, 23); // Выводим число 77 начиная с координаты 0x23. + delay (500); // Ждём пол секунды. + myOLED.print( "+" ); // Выводим текст в той же строке сразу после предыдущего числа. + delay (500); // Ждём пол секунды. + myOLED.print( 77 ); // Выводим число 77 в той же строке сразу после предыдущего текста. + delay (500); // Ждём пол секунды. + myOLED.print( "=" ); // Выводим текст в той же строке сразу после предыдущего числа. + delay (500); // Ждём пол секунды. + myOLED.print( 77+77 ); // Выводим результат сложения чисел 77+77, в той же строке сразу после предыдущего текста. + delay (500); // Ждём пол секунды. + myOLED.print( 77, 0, 55, HEX ); // Выводим число 77 начиная с координаты 0x55, вывод осуществляется в 16-ричной системе. + delay (500); // Ждём пол секунды. + myOLED.print( "+" ); // Выводим текст в той же строке сразу после предыдущего числа. + delay (500); // Ждём пол секунды. + myOLED.print( 77, OLED_N, OLED_N, HEX ); // Выводим число 77 в той же строке сразу после предыдущего текста, вывод осуществляется в 16-ричной системе. + delay (500); // Ждём пол секунды. + myOLED.print( "=" ); // Выводим текст в той же строке сразу после предыдущего числа. + delay (500); // Ждём пол секунды. + myOLED.print( 77+77, OLED_N, OLED_N, HEX ); // Выводим результат сложения чисел 77+77, в той же строке сразу после предыдущего текста, вывод осуществляется в 16-ричной системе. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("{}[]()<>?!" ), OLED_C, 15); // Выводим текст по центру, координата нижней части текста по оси Y равна 15. + myOLED.print(F("#$%&*~`'\"^"), OLED_C, 39); // Выводим текст по центру, координата нижней части текста по оси Y равна 39. + myOLED.print(F("_-+=,.:;|/" ), OLED_C, 63); // Выводим текст по центру, координата нижней части текста по оси Y равна 63. + delay (5000); // Ждём 5 секунд. +} // diff --git a/libraries/iarduino_OLED/examples/ShowNumber/ShowNumber.ino b/libraries/iarduino_OLED/examples/ShowNumber/ShowNumber.ino new file mode 100644 index 0000000..ad275a1 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowNumber/ShowNumber.ino @@ -0,0 +1,31 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт SmallFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. + // + myOLED.print( 123456789 , 0, 7 ); // Выводим целое положительное число начиная с координаты 0x0. + myOLED.print(-123456789 , 0, 15); // Выводим целое отрицательное число начиная с координаты 0x15. + myOLED.print( 123456789 , 0, 23, HEX); // Выводим целое положительное число начиная с координаты 0x23, в 16-ричной системе счисления. + myOLED.print( 123456789 , 0, 31, OCT); // Выводим целое положительное число начиная с координаты 0x31, в 8-ричной системе счисления. + myOLED.print(-123.456789, 0, 39); // Выводим число с плавающей точкой начиная с координаты 0x39, по умолчанию отобразится 2 знака после запятой. + myOLED.print( 123.456789, 0, 47, 3); // Выводим число с плавающей точкой начиная с координаты 0x47, указывая 3 знака после запятой. + myOLED.print( 123 , 0, 55, BIN); // Выводим целое положительное число начиная с координаты 0x55, в 2-ичной системе счисления. + myOLED.print( 123 , 0, 63, 12); // Выводим целое положительное число начиная с координаты 0x63, в 12-ричной системе счисления. +} // + // +void loop(){} // diff --git a/libraries/iarduino_OLED/examples/ShowRus/ShowRus.ino b/libraries/iarduino_OLED/examples/ShowRus/ShowRus.ino new file mode 100644 index 0000000..68fd6fb --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowRus/ShowRus.ino @@ -0,0 +1,72 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт SmallFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // + // +void loop(){ // + // +// Вывод текста в кодировке UTF-8: // + myOLED.clrScr(); // Чистим экран. + myOLED.print("UTF8", 0, 7); // Выводим текст начиная с координаты 0x7 (нижняя левая точка текста). + myOLED.setCoding(TXT_UTF8); // Меняем кодировку на UTF-8 (по умолчанию). + myOLED.print("Ардуино iArduino", OLED_C, 39); // Выводим текст по центру экрана, координата нижней части текста по оси Y равна 39. + delay (5000); // Ждём 5 секунд. + // +// Вывод текста в кодировке CP866: // + myOLED.clrScr(); // Чистим экран. + myOLED.print("CP866", 0, 7); // Выводим текст начиная с координаты 0x7 (нижняя левая точка текста). + myOLED.setCoding(TXT_CP866); // Меняем кодировку на CP866. + myOLED.print("Ардуино iArduino", OLED_C, 39); // Выводим текст по центру экрана, координата нижней части текста по оси Y равна 39. + delay (5000); // Ждём 5 секунд. + // +// Вывод текста в кодировке WINDOWS-1251: // + myOLED.clrScr(); // Чистим экран. + myOLED.print("WIN1251", 0, 7); // Выводим текст начиная с координаты 0x7 (нижняя левая точка текста). + myOLED.setCoding(TXT_WIN1251); // Меняем кодировку на WINDOWS-1251. + myOLED.print("Ардуино iArduino", OLED_C, 39); // Выводим текст по центру экрана, координата нижней части текста по оси Y равна 39. + delay (5000); // Ждём 5 секунд. + // +// Вывод текста по коду символов: // + myOLED.clrScr(); // Чистим экран. + myOLED.print("CODE", 0, 7); // Выводим текст начиная с координаты 0x7 (нижняя левая точка текста). + myOLED.setCoding(false); // Отменяем кодировку. + myOLED.print("\200\340\244\343\250\255\256 iArduino", OLED_C, 39); // Выводим текст по центру экрана, координата нижней части текста по оси Y равна 39. + delay (5000); // Ждём 5 секунд. +} // + // +/* КОДЫ СИМВОЛОВ: // + * Латинские буквы A-Z и a-z // Вводятся как есть, вне зависимости от кодировки. + * Цифры 0-9 и символы !"#$%&'()*+,-./:;<=>?@[]^_`{|}~ // Вводятся как есть, вне зависимости от кодировки. + * Буквы АБВГДЕЖЗИЙКЛМНОП // Код: 128-143 в 10-тичной системе счисления. + * Буквы РСТУФХЦЧШЩЪЫЬЭЮЯ // Код: 144-159 в 10-тичной системе счисления. + * Буквы абвгдежзийклмноп // Код: 160-175 в 10-тичной системе счисления. + * Буквы рстуфхцчшщъыьэюя // Код: 224-239 в 10-тичной системе счисления. + * Буквы Ё,ё // Код: 240,241 в 10-тичной системе счисления. + * // + * Для вывода буквы нужно указать её код в 8-ричной системе счисления // + * которому должен предшествовать символ \ // + * // + * Пример вывода Русской буквы «А»: // + * - буква «А» имеет код 128. // Для перевода чисел из 10-тичной в 8-ричную систему можно воспользоваться стандартным калькулятором в windows. + * - 128 в 10-тичной системе равно числу 200 в 8-ричной системе. // Выберите вид калькулятора - «Программист» и введите число, Вы увидите его представление в разных системах счисления: HEX(16), DEC(10), OCT(8) и BIN(2). + * - Значит буква «А» записывается как \200 // Далее в примере следует буква «р» \340, «д» \244, «у» \343, «и» \250, «н» \255, «о» \256. + * // + * Запись текста кодами символов кажется более громоздкой, но // + * на самом деле, такая запись занимает в 2 раза меньше памяти! // + */ diff --git a/libraries/iarduino_OLED/examples/ShowSmallFont/ShowSmallFont.ino b/libraries/iarduino_OLED/examples/ShowSmallFont/ShowSmallFont.ino new file mode 100644 index 0000000..d466087 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowSmallFont/ShowSmallFont.ino @@ -0,0 +1,69 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт SmallFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // + // +void loop(){ // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Большие буквы:"), 0, 7); // Выводим текст начиная с координаты 0x7. + myOLED.print(F("ABCDEFGHIJKLM"), OLED_C, 23); // Выводим текст по центру, координата нижней части текста по оси Y равна 23. + myOLED.print(F("NOPQRSTUVWXYZ"), OLED_C, 31); // Выводим текст по центру, координата нижней части текста по оси Y равна 31. + myOLED.print(F("АБВГДЕЁЖЗИЙКЛМНОП"), OLED_C, 47); // Выводим текст по центру, координата нижней части текста по оси Y равна 47. + myOLED.print(F("РСТУФХЦЧШЩЪЫЬЭЮЯ"), OLED_C, 55); // Выводим текст по центру, координата нижней части текста по оси Y равна 55. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Маленькие буквы:"), 0, 7); // Выводим текст начиная с координаты 0x7. + myOLED.print(F("abcdefghijklm"), OLED_C, 23); // Выводим текст по центру, координата нижней части текста по оси Y равна 23. + myOLED.print(F("nopqrstuvwxyz"), OLED_C, 31); // Выводим текст по центру, координата нижней части текста по оси Y равна 31. + myOLED.print(F("абвгдеёжзийклмноп"), OLED_C, 47); // Выводим текст по центру, координата нижней части текста по оси Y равна 47. + myOLED.print(F("рстуфхцчшщъыьэюя"), OLED_C, 55); // Выводим текст по центру, координата нижней части текста по оси Y равна 55. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Цифры:"), 0, 7); // Выводим текст начиная с координаты 0x7. + myOLED.print(F("012346789"), OLED_C, 23); // Выводим текст по центру, координата нижней части текста по оси Y равна 23. + myOLED.print( 100, 0, 39 ); // Выводим число начиная с координаты 0x39. + myOLED.print( 100, 0, 47, HEX); myOLED.print("h"); // Выводим число начиная с координаты 0x47, вывод осуществляется в 16-ричной системе и выводим текст в той же строке сразу после числа. + myOLED.print( 100, 0, 55, OCT); myOLED.print("o"); // Выводим число начиная с координаты 0x55, вывод осуществляется в 8-ричной системе и выводим текст в той же строке сразу после числа. + myOLED.print( 100, 0, 63, BIN); myOLED.print("b"); // Выводим число начиная с координаты 0x63, вывод осуществляется в 2-ичной системе и выводим текст в той же строке сразу после числа. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Символы:"), 0, 7); // Выводим текст начиная с координаты 0x7. + myOLED.print(F("{}[]()<>?!#$%&*"), OLED_C, 31); // Выводим текст по центру, координата нижней части текста по оси Y равна 31. + myOLED.print(F("~`'\"^_-+=,.:;|/"), OLED_C, 47); // Выводим текст по центру, координата нижней части текста по оси Y равна 47. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Вычисления:"), 0, 7 ); delay(1000); // Выводим текст начиная с координаты 0x7. + myOLED.print( 2, 0, 31 ); delay(1000); // Выводим число начиная с координаты 0x31. + myOLED.print( "+" ); delay(1000); // Выводим текст в той же строке сразу после предыдущего числа. + myOLED.print( 2 ); delay(1000); // Выводим число 2 в той же строке сразу после предыдущего текста. + myOLED.print( "=" ); delay(1000); // Выводим текст в той же строке сразу после предыдущего числа. + myOLED.print( 2+2 ); delay(1000); // Выводим результат сложения чисел 2+2, в той же строке сразу после предыдущего текста. + delay(1000); // Ждём 1 секунду. + myOLED.print( 2, 0, 47, 4); delay(1000); // Выводим число 2 начиная с координаты 0x47, вывод осуществляется в 4-ричной системе. + myOLED.print( "+" ); delay(1000); // Выводим текст в той же строке сразу после предыдущего числа. + myOLED.print( 2, OLED_N, OLED_N, 4); delay(1000); // Выводим число 2 в той же строке сразу после предыдущего текста, вывод осуществляется в 4-ричной системе. + myOLED.print( "=" ); delay(1000); // Выводим текст в той же строке сразу после предыдущего числа. + myOLED.print( 2+2, OLED_N, OLED_N, 4); delay(1000); // Выводим результат сложения чисел 2+2, в той же строке сразу после предыдущего текста, вывод осуществляется в 4-ричной системе. + myOLED.print( " в 4-ой системе" ); // Выводим текст в той же строке сразу после предыдущего результата. + delay (5000); // Ждём 5 секунд. +} // diff --git a/libraries/iarduino_OLED/examples/ShowTextBackground/ShowTextBackground.ino b/libraries/iarduino_OLED/examples/ShowTextBackground/ShowTextBackground.ino new file mode 100644 index 0000000..95f9247 --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowTextBackground/ShowTextBackground.ino @@ -0,0 +1,33 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t MediumFontRus[]; // Подключаем шрифт MediumFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт MediumFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // + // +void loop(){ // + myOLED.bgText(false); // Указываем что у текста нет фона. + myOLED.clrScr(); // Чистим экран. + myOLED.print("arduino", 0, 32); // Выводим текст начиная с координаты 0x32. + myOLED.print("arduino", 5, 39); // Выводим текст начиная с координаты 0x39. Этот текст частично наложится на предыдущий, но не закрасит его. + delay(5000); // + myOLED.bgText(true); // Указываем что у текста есть фон (по умолчанию). + myOLED.clrScr(); // Чистим экран. + myOLED.print("arduino", 0, 32); // Выводим текст начиная с координаты 0x32. + myOLED.print("arduino", 5, 39); // Выводим текст начиная с координаты 0x39. Этот текст частично наложится на предыдущий, и закрасит его своим чёрным фоном. + delay(5000); // +} // diff --git a/libraries/iarduino_OLED/examples/ShowTextInvert/ShowTextInvert.ino b/libraries/iarduino_OLED/examples/ShowTextInvert/ShowTextInvert.ino new file mode 100644 index 0000000..a7d690b --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowTextInvert/ShowTextInvert.ino @@ -0,0 +1,26 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт SmallFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. + myOLED.invText(); // Указываем что цвет текста выводимого после данной функции должен быть инвертирован. + myOLED.print("*** iarduino.ru ***", OLED_C, 31); // Выводим текст по центру экрана, координата нижней части текста по оси Y равна 31. Текст будет написан черными буквами на белом фоне. + myOLED.invText(false); // Указываем что цвет текста выводимого после данной функции не требуется инвертировать. + myOLED.print("*** iarduino.ru ***", OLED_C, 47); // Выводим текст по центру экрана, координата нижней части текста по оси Y равна 31. Текст будет написан белыми буквами на чёрном фоне. +} // + // +void loop(){} // diff --git a/libraries/iarduino_OLED/examples/ShowTime/ShowTime.ino b/libraries/iarduino_OLED/examples/ShowTime/ShowTime.ino new file mode 100644 index 0000000..db52fda --- /dev/null +++ b/libraries/iarduino_OLED/examples/ShowTime/ShowTime.ino @@ -0,0 +1,35 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t MediumFont[]; // Подключаем шрифт MediumFont. +uint32_t i; // Объявляем переменную для хранения времени прошедшего с момента старта скетча. +int h, m, s; // Объявляем переменную для хранения времени в часах, минутах и секундах. + // +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(MediumFont); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // +void loop(){ // + i=millis(); // Получаем количество миллисекунд прошедшее с момента старта скетча. + if(i%1000==0){ delay(1); // Выполняем скетч 1 раз в секунду. Так как условие истинно в течении 1 миллисекунды, то устанавливаем задержку в 1 миллисекунду. + i/=1000; h=i/60/60%24; m=i/60%60; s=i%60; // Рассчитываем часы, минуты и секунды. + myOLED.setCursor(16,39); // Устанавливаем курсор в координату 16:31, это будет нижняя левая точка первой цифры выведенной функцией print(). + if(h<10){myOLED.print(0);} myOLED.print(h); // Выводим часы прошедшие с момента старта скетча, в формате ЧЧ. + myOLED.print(":"); // Выводим текст состоящий из одного символа «:» + if(m<10){myOLED.print(0);} myOLED.print(m); // Выводим минуты прошедшие с момента старта скетча, в формате ММ. + myOLED.print(":"); // Выводим текст состоящий из одного символа «:» + if(s<10){myOLED.print(0);} myOLED.print(s); // Выводим секунды прошедшие с момента старта скетча, в формате СС. + } // +} // + // diff --git a/libraries/iarduino_OLED/examples/TwoDisplays/TwoDisplays.ino b/libraries/iarduino_OLED/examples/TwoDisplays/TwoDisplays.ino new file mode 100644 index 0000000..874010f --- /dev/null +++ b/libraries/iarduino_OLED/examples/TwoDisplays/TwoDisplays.ino @@ -0,0 +1,35 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +// ДАННЫЙ ПРИМЕР НЕ БУДЕТ РАБОТАТЬ НА ПЛАТАХ // +// С ОБЪЁМОМ ДИНАМИЧЕСКОЙ ПАМЯТИ НИЖЕ 2.5 КБ // + // +#include // Подключаем библиотеку iarduino_OLED. +iarduino_OLED myOLED_1(0x3C); // Объявляем объект myOLED_1, указывая адрес первого дисплея на шине I2C: 0x3C. +iarduino_OLED myOLED_2(0x3D); // Объявляем объект myOLED_2, указывая адрес второго дисплея на шине I2C: 0x3D. + // +extern uint8_t MediumFontRus[]; // Подключаем шрифт MediumFontRus. +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифты MediumFont и SmallFont, они займут меньше места в памяти программ. +void setup(){ // + myOLED_1.begin (); // Инициируем работу с первым дисплеем. + myOLED_2.begin (); // Инициируем работу с вторым дисплеем. + myOLED_1.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста на первом дисплее. + myOLED_2.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста на втором дисплее. + myOLED_1.print ("1 дисплей", OLED_C, 31); // Выводим текст на первый дисплей по центру экрана, координата нижней части текста по оси Y равна 31. + myOLED_2.print ("2 дисплей", OLED_C, 31); // Выводим текст на второй дисплей по центру экрана, координата нижней части текста по оси Y равна 31. + myOLED_1.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста на первом дисплее. + myOLED_2.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста на втором дисплее. + myOLED_1.print ("Адрес дисплея 0x3C", OLED_C, 47); // Выводим текст на первый дисплей по центру экрана, координата нижней части текста по оси Y равна 47. + myOLED_2.print ("Адрес дисплея 0x3D", OLED_C, 47); // Выводим текст на второй дисплей по центру экрана, координата нижней части текста по оси Y равна 47. +} // + // +void loop(){} // diff --git a/libraries/iarduino_OLED/keywords.txt b/libraries/iarduino_OLED/keywords.txt new file mode 100644 index 0000000..73128c1 --- /dev/null +++ b/libraries/iarduino_OLED/keywords.txt @@ -0,0 +1,45 @@ +# #################################################### +# СИНТАКСИЧЕСКАЯ РАСКРАСКА ДЛЯ БИБИЛИОТЕКИ: +# iarduino_OLED +# #################################################### +# ТИПЫ ДАННЫХ: (KEYWORD1) + iarduino_OLED KEYWORD1 +# #################################################### +# МЕТОДЫ И ФУНКЦИИ: (KEYWORD2) + begin KEYWORD2 + clrScr KEYWORD2 + fillScr KEYWORD2 + invScr KEYWORD2 + invText KEYWORD2 + bgText KEYWORD2 + bgImage KEYWORD2 + setFont KEYWORD2 + getFontWidth KEYWORD2 + getFontHeight KEYWORD2 + setCoding KEYWORD2 + setCursor KEYWORD2 + setCursorShift KEYWORD2 + print KEYWORD2 + drawImage KEYWORD2 + getImageWidth KEYWORD2 + getImageHeight KEYWORD2 + drawPixel KEYWORD2 + getPixel KEYWORD2 + drawLine KEYWORD2 + drawRect KEYWORD2 + drawCircle KEYWORD2 + autoUpdate KEYWORD2 + update KEYWORD2 + numX KEYWORD2 + numY KEYWORD2 +# #################################################### +# КОНСТАНТЫ: (LITERAL1) + OLED_T LITERAL1 + OLED_B LITERAL1 + OLED_L LITERAL1 + OLED_C LITERAL1 + OLED_R LITERAL1 + OLED_N LITERAL1 + TXT_UTF8 LITERAL1 + TXT_CP866 LITERAL1 + TXT_WIN1251 LITERAL1 \ No newline at end of file diff --git a/libraries/iarduino_OLED/library.properties b/libraries/iarduino_OLED/library.properties new file mode 100644 index 0000000..30ab0ad --- /dev/null +++ b/libraries/iarduino_OLED/library.properties @@ -0,0 +1,10 @@ +name = iarduino OLED (работа с OLED дисплеями) +version = 1.0.1 +author = iarduino +maintainer = Панькин Павел +sentence = Библиотека для работы с OLED дисплеями. +paragraph = Позволяет выводить текст, числа, изображения и графику на OLED дисплеи 128x64 по шине I2C. Есть возможность выбора адреса для работы с несколькими дисплеями. Для вывода только текста и чисел воспользуйтесь библиотекой iarduino OLED_txt. +category = Display +url = http://iarduino.ru/file/340.html +architectures = avr +includes = iarduino_OLED.h \ No newline at end of file diff --git a/libraries/iarduino_OLED/src/DefaultFonts.c b/libraries/iarduino_OLED/src/DefaultFonts.c new file mode 100644 index 0000000..fbd90d8 --- /dev/null +++ b/libraries/iarduino_OLED/src/DefaultFonts.c @@ -0,0 +1,678 @@ +#include // Номер байта п/п: 0 1 2 3 4 5 Номер байта п/п: 0 1 2 3 4 5 + // Значение байта (hex): 00, 20, 54, 54, 54, 78, буква «а» Значение байта (hex): 00, 7F, 28, 44, 44, 38 буква «b» + // 0 бит: (младший) 0 0 0 0 0 0 = | | 0 бит: (младший) 0 1 0 0 0 0 = | # | + // 1 бит: 0 0 0 0 0 0 = | | 1 бит: 0 1 0 0 0 0 = | # | + // 2 бит: 0 0 1 1 1 0 = | ### | 2 бит: 0 1 0 1 1 0 = | # ## | + // 3 бит: 0 0 0 0 0 1 = | #| 3 бит: 0 1 1 0 0 1 = | ## #| + // 4 бит: 0 0 1 1 1 1 = | ####| 4 бит: 0 1 0 0 0 1 = | # #| + // 5 бит: 0 1 0 0 0 1 = | # #| 5 бит: 0 1 1 0 0 1 = | ## #| + // 6 бит: 0 0 1 1 1 1 = | ####| 6 бит: 0 1 0 1 1 0 = | # ## | + // 7 бит: (старший) 0 0 0 0 0 0 = | | 7 бит: (старший) 0 0 0 0 0 0 = | | + // + // Для Кириллицы используется кодировка CP866. + // + +const uint8_t SmallFont[] PROGMEM = // Шрифт SmallFont +{ // +0x06, 0x08, 0x20, 0x5F, // ширина символов (6), высота символов (8), код первого символа (32), количество символов (95) + // +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 001) 0x20=032 пробел +0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, // 002) 0x21=033 ! +0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // 003) 0x22=034 " +0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, // 004) 0x23=035 # +0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, // 005) 0x24=036 $ +0x00, 0x23, 0x13, 0x08, 0x64, 0x62, // 006) 0x25=037 % +0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // 007) 0x26=038 & +0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // 008) 0x27=039 ' +0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, // 009) 0x28=040 ( +0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, // 010) 0x29=041 ) +0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // 011) 0x2A=042 * +0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // 012) 0x2B=043 + +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // 013) 0x2C=044 , +0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // 014) 0x2D=045 - +0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // 015) 0x2E=046 . +0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // 016) 0x2F=047 / + // +0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 017) 0x30=048 0 +0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 018) 0x31=049 1 +0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 019) 0x32=050 2 +0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 020) 0x33=051 3 +0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 021) 0x34=052 4 +0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 022) 0x35=053 5 +0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 023) 0x36=054 6 +0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 024) 0x37=055 7 +0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 025) 0x38=056 8 +0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 026) 0x39=057 9 +0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // 027) 0x3A=058 : +0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // 028) 0x3B=059 ; +0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // 029) 0x3C=060 < +0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // 030) 0x3D=061 = +0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // 031) 0x3E=062 > +0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // 032) 0x3F=063 ? + // +0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // 033) 0x40=064 @ +0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // 034) 0x41=065 A +0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // 035) 0x42=066 B +0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // 036) 0x43=067 C +0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // 037) 0x44=068 D +0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // 038) 0x45=069 E +0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // 039) 0x46=070 F +0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // 040) 0x47=071 G +0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // 041) 0x48=072 H +0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // 042) 0x49=073 I +0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // 043) 0x4A=074 J +0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // 044) 0x4B=075 K +0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // 045) 0x4C=076 L +0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // 046) 0x4D=077 M +0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // 047) 0x4E=078 N +0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // 048) 0x4F=079 O + // +0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // 049) 0x50=080 P +0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // 050) 0x51=081 Q +0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // 051) 0x52=082 R +0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // 052) 0x53=083 S +0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // 053) 0x54=084 T +0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // 054) 0x55=085 U +0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // 055) 0x56=086 V +0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // 056) 0x57=087 W +0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // 057) 0x58=088 X +0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // 058) 0x59=089 Y +0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // 059) 0x5A=090 Z +0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // 060) 0x5B=091 [ +0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, // 061) 0x5C=092 обратный слеш +0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // 062) 0x5D=093 ] +0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // 063) 0x5E=094 ^ +0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // 064) 0x5F=095 _ + // +0x00, 0x00, 0x03, 0x05, 0x00, 0x00, // 065) 0x60=096 ` +0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // 066) 0x61=097 a +0x00, 0x7F, 0x28, 0x44, 0x44, 0x38, // 067) 0x62=098 b +0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // 068) 0x63=099 c +0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // 069) 0x64=100 d +0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // 070) 0x65=101 e +0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // 071) 0x66=102 f +0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // 072) 0x67=103 g +0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // 073) 0x68=104 h +0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // 074) 0x69=105 i +0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // 075) 0x6A=106 j +0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // 076) 0x6B=107 k +0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // 077) 0x6C=108 l +0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // 078) 0x6D=109 m +0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // 079) 0x6E=110 n +0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // 080) 0x6F=111 o + // +0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // 081) 0x70=112 p +0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // 082) 0x71=113 q +0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // 083) 0x72=114 r +0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // 084) 0x73=115 s +0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // 085) 0x74=116 t +0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // 086) 0x75=117 u +0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // 087) 0x76=118 v +0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // 088) 0x77=119 w +0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // 089) 0x78=120 x +0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // 090) 0x79=121 y +0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // 091) 0x7A=122 z +0x00, 0x00, 0x10, 0x7C, 0x82, 0x00, // 092) 0x7B=123 { +0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, // 093) 0x7C=124 | +0x00, 0x00, 0x82, 0x7C, 0x10, 0x00, // 094) 0x7D=125 } +0x00, 0x00, 0x06, 0x09, 0x09, 0x06, // 095) 0x7E=126 ~ + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // + +const uint8_t SmallFontRus[] PROGMEM = // Шрифт SmallFontRus +{ // +0x06, 0x08, 0x20, 0xB0, // ширина символов (6), высота символов (8), код первого символа (32), количество символов (176) + // +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 001) 0x20=032 пробел +0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, // 002) 0x21=033 ! +0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // 003) 0x22=034 " +0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, // 004) 0x23=035 # +0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, // 005) 0x24=036 $ +0x00, 0x23, 0x13, 0x08, 0x64, 0x62, // 006) 0x25=037 % +0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // 007) 0x26=038 & +0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // 008) 0x27=039 ' +0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, // 009) 0x28=040 ( +0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, // 010) 0x29=041 ) +0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // 011) 0x2A=042 * +0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // 012) 0x2B=043 + +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // 013) 0x2C=044 , +0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // 014) 0x2D=045 - +0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // 015) 0x2E=046 . +0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // 016) 0x2F=047 / + // +0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 017) 0x30=048 0 +0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 018) 0x31=049 1 +0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 019) 0x32=050 2 +0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 020) 0x33=051 3 +0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 021) 0x34=052 4 +0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 022) 0x35=053 5 +0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 023) 0x36=054 6 +0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 024) 0x37=055 7 +0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 025) 0x38=056 8 +0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 026) 0x39=057 9 +0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // 027) 0x3A=058 : +0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // 028) 0x3B=059 ; +0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // 029) 0x3C=060 < +0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // 030) 0x3D=061 = +0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // 031) 0x3E=062 > +0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // 032) 0x3F=063 ? + // +0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // 033) 0x40=064 @ +0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // 034) 0x41=065 A +0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // 035) 0x42=066 B +0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // 036) 0x43=067 C +0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // 037) 0x44=068 D +0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // 038) 0x45=069 E +0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // 039) 0x46=070 F +0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // 040) 0x47=071 G +0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // 041) 0x48=072 H +0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // 042) 0x49=073 I +0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // 043) 0x4A=074 J +0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // 044) 0x4B=075 K +0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // 045) 0x4C=076 L +0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // 046) 0x4D=077 M +0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // 047) 0x4E=078 N +0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // 048) 0x4F=079 O + // +0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // 049) 0x50=080 P +0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // 050) 0x51=081 Q +0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // 051) 0x52=082 R +0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // 052) 0x53=083 S +0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // 053) 0x54=084 T +0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // 054) 0x55=085 U +0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // 055) 0x56=086 V +0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // 056) 0x57=087 W +0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // 057) 0x58=088 X +0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // 058) 0x59=089 Y +0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // 059) 0x5A=090 Z +0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // 060) 0x5B=091 [ +0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, // 061) 0x5C=092 обратный слеш +0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // 062) 0x5D=093 ] +0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // 063) 0x5E=094 ^ +0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // 064) 0x5F=095 _ + // +0x00, 0x00, 0x03, 0x05, 0x00, 0x00, // 065) 0x60=096 ` +0x00, 0x20, 0x54, 0x54, 0x78, 0x40, // 066) 0x61=097 a +0x00, 0x7F, 0x28, 0x44, 0x44, 0x38, // 067) 0x62=098 b +0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // 068) 0x63=099 c +0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // 069) 0x64=100 d +0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // 070) 0x65=101 e +0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // 071) 0x66=102 f +0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // 072) 0x67=103 g +0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // 073) 0x68=104 h +0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // 074) 0x69=105 i +0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // 075) 0x6A=106 j +0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // 076) 0x6B=107 k +0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // 077) 0x6C=108 l +0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // 078) 0x6D=109 m +0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // 079) 0x6E=110 n +0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // 080) 0x6F=111 o + // +0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // 081) 0x70=112 p +0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // 082) 0x71=113 q +0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // 083) 0x72=114 r +0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // 084) 0x73=115 s +0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // 085) 0x74=116 t +0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // 086) 0x75=117 u +0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // 087) 0x76=118 v +0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // 088) 0x77=119 w +0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // 089) 0x78=120 x +0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // 090) 0x79=121 y +0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // 091) 0x7A=122 z +0x00, 0x00, 0x10, 0x7C, 0x82, 0x00, // 092) 0x7B=123 { +0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, // 093) 0x7C=124 | +0x00, 0x00, 0x82, 0x7C, 0x10, 0x00, // 094) 0x7D=125 } +0x00, 0x10, 0x08, 0x10, 0x20, 0x10, // 095) 0x7E=126 ~ +0 , 0 , 0 , 0 , 0 , 0 , // 096) 0x7F=127 ⌂ + // +0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // 097) 0x80=128 А +0x00, 0x7F, 0x49, 0x49, 0x49, 0x31, // 098) 0x81=129 Б +0x00, 0x7F, 0x45, 0x45, 0x45, 0x3A, // 099) 0x82=130 В +0x00, 0x7F, 0x01, 0x01, 0x01, 0x03, // 100) 0x83=131 Г +0x00, 0x60, 0x3F, 0x21, 0x3F, 0x60, // 101) 0x84=132 Д +0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // 102) 0x85=133 Е +0x00, 0x73, 0x0C, 0x7F, 0x0C, 0x73, // 103) 0x86=134 Ж +0x00, 0x22, 0x41, 0x49, 0x49, 0x36, // 104) 0x87=135 З +0x00, 0x7F, 0x10, 0x08, 0x04, 0x7F, // 105) 0x88=136 И +0x00, 0x7E, 0x20, 0x11, 0x08, 0x7E, // 106) 0x89=137 Й +0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // 107) 0x8A=138 К +0x00, 0x40, 0x3F, 0x01, 0x01, 0x7F, // 108) 0x8B=139 Л +0x00, 0x7F, 0x06, 0x08, 0x06, 0x7F, // 109) 0x8C=140 М +0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // 110) 0x8D=141 Н +0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // 111) 0x8E=142 О +0x00, 0x7F, 0x01, 0x01, 0x01, 0x7F, // 112) 0x8F=143 П + // +0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // 113) 0x90=144 Р +0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // 114) 0x91=145 С +0x00, 0x03, 0x01, 0x7F, 0x01, 0x03, // 115) 0x92=146 Т +0x00, 0x61, 0x26, 0x18, 0x06, 0x01, // 116) 0x93=147 У +0x00, 0x1C, 0x22, 0x7F, 0x22, 0x1C, // 117) 0x94=148 Ф +0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // 118) 0x95=149 Х +0x00, 0x3F, 0x20, 0x20, 0x3F, 0x60, // 119) 0x96=150 Ц +0x00, 0x07, 0x08, 0x08, 0x08, 0x7F, // 120) 0x97=151 Ч +0x00, 0x7F, 0x40, 0x7F, 0x40, 0x7F, // 121) 0x98=152 Ш +0x00, 0x3F, 0x20, 0x3F, 0x20, 0x7F, // 122) 0x99=153 Щ +0x00, 0x01, 0x7F, 0x48, 0x48, 0x30, // 123) 0x9A=154 Ъ +0x00, 0x7F, 0x48, 0x78, 0x00, 0x7F, // 124) 0x9B=155 Ы +0x00, 0x7F, 0x48, 0x48, 0x30, 0x00, // 125) 0x9C=156 Ь +0x00, 0x41, 0x49, 0x49, 0x2A, 0x1C, // 126) 0x9D=157 Э +0x00, 0x7F, 0x10, 0x3E, 0x41, 0x3E, // 127) 0x9E=158 Ю +0x00, 0x66, 0x19, 0x09, 0x09, 0x7F, // 128) 0x9F=159 Я + // +0x00, 0x20, 0x54, 0x54, 0x78, 0x40, // 129) 0xA0=160 а +0x00, 0x3E, 0x49, 0x45, 0x45, 0x38, // 130) 0xA1=161 б +0x00, 0x7C, 0x54, 0x54, 0x58, 0x20, // 131) 0xA2=162 в +0x00, 0x7C, 0x04, 0x04, 0x0C, 0x00, // 132) 0xA3=163 г +0x00, 0x38, 0x45, 0x45, 0x49, 0x3E, // 133) 0xA4=164 д +0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // 134) 0xA5=165 е +0x00, 0x4C, 0x30, 0x7C, 0x30, 0x4C, // 135) 0xA6=166 ж +0x00, 0x28, 0x44, 0x54, 0x28, 0x00, // 136) 0xA7=167 з +0x00, 0x7C, 0x20, 0x10, 0x7C, 0x00, // 137) 0xA8=168 и +0x00, 0x7C, 0x21, 0x11, 0x7C, 0x00, // 138) 0xA9=169 й +0x00, 0x7C, 0x10, 0x28, 0x44, 0x00, // 139) 0xAA=170 к +0x00, 0x40, 0x3C, 0x04, 0x04, 0x7C, // 140) 0xAB=171 л +0x00, 0x7C, 0x08, 0x10, 0x08, 0x7C, // 141) 0xAC=172 м +0x00, 0x7C, 0x10, 0x10, 0x7C, 0x00, // 142) 0xAD=173 н +0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // 143) 0xAE=174 о +0x00, 0x7C, 0x04, 0x04, 0x7C, 0x00, // 144) 0xAF=175 п + // +0x00, 0xFC, 0x28, 0x44, 0x44, 0x38, // 145) 0xE0=224 р +0x00, 0x38, 0x44, 0x44, 0x44, 0x28, // 146) 0xE1=225 с +0x00, 0x04, 0x04, 0x7C, 0x04, 0x04, // 147) 0xE2=226 т +0x00, 0x4C, 0x50, 0x50, 0x50, 0x3C, // 148) 0xE3=227 у +0x00, 0x38, 0x44, 0xFE, 0x44, 0x38, // 149) 0xE4=228 ф +0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // 150) 0xE5=229 х +0x00, 0x7C, 0x40, 0x40, 0x7C, 0xC0, // 151) 0xE6=230 ц +0x00, 0x1C, 0x10, 0x10, 0x7C, 0x00, // 152) 0xE7=231 ч +0x00, 0x7C, 0x40, 0x7C, 0x40, 0x7C, // 153) 0xE8=232 ш +0x00, 0x7C, 0x40, 0x7C, 0x40, 0xFC, // 154) 0xE9=233 щ +0x00, 0x04, 0x7C, 0x50, 0x70, 0x00, // 155) 0xEA=234 ъ +0x00, 0x7C, 0x50, 0x70, 0x00, 0x7C, // 156) 0xEB=235 ы +0x00, 0x00, 0x7C, 0x50, 0x70, 0x00, // 157) 0xEC=236 ь +0x00, 0x28, 0x44, 0x54, 0x38, 0x00, // 158) 0xED=237 э +0x00, 0x7C, 0x10, 0x38, 0x44, 0x38, // 159) 0xEE=238 ю +0x00, 0x08, 0x54, 0x34, 0x14, 0x7C, // 160) 0xEF=239 я + // +0x00, 0x7E, 0x4B, 0x4A, 0x4B, 0x42, // 161) 0xF0=240 Ё +0x00, 0x38, 0x55, 0x54, 0x55, 0x18, // 162) 0xF1=241 ё +0 , 0 , 0 , 0 , 0 , 0 , // 163) 0xF2=242 Є +0 , 0 , 0 , 0 , 0 , 0 , // 164) 0xF3=243 є +0 , 0 , 0 , 0 , 0 , 0 , // 165) 0xF4=244 Ї +0 , 0 , 0 , 0 , 0 , 0 , // 166) 0xF5=245 ї +0 , 0 , 0 , 0 , 0 , 0 , // 167) 0xF6=246 Ў +0 , 0 , 0 , 0 , 0 , 0 , // 168) 0xF7=247 ў +0x00, 0x00, 0x06, 0x09, 0x09, 0x06, // 169) 0xF8=248 ° +0 , 0 , 0 , 0 , 0 , 0 , // 170) 0xF9=249 ∙ +0 , 0 , 0 , 0 , 0 , 0 , // 171) 0xFA=250 · +0 , 0 , 0 , 0 , 0 , 0 , // 172) 0xFB=251 √ +0 , 0 , 0 , 0 , 0 , 0 , // 173) 0xFC=252 № +0 , 0 , 0 , 0 , 0 , 0 , // 174) 0xFD=253 ¤ +0 , 0 , 0 , 0 , 0 , 0 , // 175) 0xFE=254 ■ +0 , 0 , 0 , 0 , 0 , 0 , // 176) 0xFF=255   + // +0x01, 0xAF, 0x30 // В таблице имеется (1) пустой интервал, который находится после символа с кодом (175) и состоит из (48) отсутствующих символов. + // Допускается использовать до 3 пустых интервалов. Пример: 0x03, 0xAA, 0x10, 0xCC, 0x10, 0xEE, 0x10 +}; // 3 пустых интервала, по (16) отсутствующий символов в каждом, находятся после символов с кодами (170, 204 и 238). + +const uint8_t MediumFont[] PROGMEM = // Шрифт MediumFont +{ // +0x0C,0x10,0x20,0x5F, // ширина символов (12), высота символов (16), код первого символа (32), количество символов (95) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 001) 0x20=032 пробел +0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x67,0x00,0x00,0x00,0x00,0x00, // 002) 0x21=033 ! +0x00,0x00,0x00,0x16,0x0E,0x00,0x00,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 003) 0x22=034 " +0x00,0x00,0x60,0xE0,0xF8,0x7E,0x6E,0xE0,0xF8,0x7E,0x6E,0x00,0x00,0x76,0x7E,0x1F,0x07,0x76,0x7E,0x1F,0x07,0x06,0x00,0x00, // 004) 0x23=035 # +0x00,0x78,0xFC,0xCE,0x86,0xFF,0xFF,0x86,0x9E,0x1C,0x18,0x00,0x00,0x18,0x38,0x79,0x61,0xFF,0xFF,0x61,0x73,0x3F,0x1E,0x00, // 005) 0x24=036 $ +0x00,0x3C,0x7E,0x66,0x7E,0xBC,0xE0,0x78,0x1E,0x06,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x3D,0x7E,0x66,0x7E,0x3C,0x00, // 006) 0x25=037 % +0x00,0x00,0x00,0x80,0x80,0xFC,0xFE,0xE6,0xE6,0x7E,0x3C,0x00,0x00,0x1E,0x3F,0x73,0x61,0x61,0x71,0x7F,0x3F,0x7C,0x6C,0x00, // 007) 0x26=038 & +0x00,0x00,0x00,0x00,0x00,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 008) 0x27=039 ' +0x00,0x00,0x00,0x00,0xF0,0xFC,0x0E,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0x70,0xC0,0x00,0x00,0x00,0x00, // 009) 0x28=040 ( +0x00,0x00,0x00,0x00,0x03,0x0E,0xFC,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x70,0x3F,0x0F,0x00,0x00,0x00,0x00, // 010) 0x29=041 ) +0x00,0x00,0x00,0x08,0x78,0x3C,0x3C,0x78,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 011) 0x2A=042 * +0x00,0x00,0x80,0x80,0x80,0xF0,0xF0,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x0F,0x01,0x01,0x01,0x00,0x00, // 012) 0x2B=043 + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x70,0x00,0x00,0x00,0x00,0x00, // 013) 0x2C=044 , +0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00, // 014) 0x2D=045 - +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00, // 015) 0x2E=046 . +0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x78,0x1E,0x06,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x01,0x00,0x00,0x00,0x00,0x00, // 016) 0x2F=047 / + // +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 017) 0x30=048 0 +0x00,0x00,0x00,0x30,0x38,0x1C,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00, // 018) 0x31=049 1 +0x00,0x18,0x1C,0x1E,0x06,0x06,0x06,0x86,0xCE,0xFC,0x78,0x00,0x00,0x78,0x7C,0x7E,0x66,0x67,0x63,0x63,0x61,0x70,0x70,0x00, // 019) 0x32=050 2 +0x00,0x0E,0x0E,0x06,0x06,0xC6,0xE6,0xF6,0xFE,0x9E,0x0E,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 020) 0x33=051 3 +0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0xFE,0xFE,0x06,0x00,0x00,0x07,0x07,0x07,0x06,0x06,0x06,0x66,0x7F,0x7F,0x66,0x00, // 021) 0x34=052 4 +0x00,0xFE,0xFE,0xE6,0x66,0x66,0x66,0x66,0xE6,0xCE,0x8E,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 022) 0x35=053 5 +0x00,0xF8,0xFC,0xCE,0xC6,0xC6,0xC6,0xC6,0xDE,0x9C,0x18,0x00,0x00,0x1F,0x3F,0x71,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 023) 0x36=054 6 +0x00,0x1E,0x1E,0x06,0x06,0x06,0x06,0x86,0xE6,0x7E,0x1E,0x00,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x01,0x00,0x00,0x00, // 024) 0x37=055 7 +0x00,0x78,0xFC,0xCE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x1E,0x3F,0x73,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 025) 0x38=056 8 +0x00,0xF8,0xFC,0x8E,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x18,0x39,0x7B,0x63,0x63,0x63,0x63,0x73,0x3F,0x1F,0x00, // 026) 0x39=057 9 +0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00, // 027) 0x3A=058 : +0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x1C,0x00,0x00,0x00,0x00,0x00, // 028) 0x3B=059 ; +0x00,0x00,0x80,0xC0,0xC0,0xE0,0x60,0x70,0x30,0x30,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x06,0x0E,0x0C,0x0C,0x00,0x00, // 029) 0x3C=060 < +0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // 030) 0x3D=061 = +0x00,0x00,0x30,0x30,0x70,0x60,0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x0C,0x0C,0x0E,0x06,0x07,0x03,0x03,0x01,0x00,0x00, // 031) 0x3E=062 > +0x00,0x18,0x1C,0x1E,0x06,0x06,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x6E,0x6F,0x03,0x01,0x01,0x00,0x00,0x00, // 032) 0x3F=063 ? + // +0x00,0xF8,0xFC,0x0E,0xE6,0xF6,0x36,0xF6,0xF6,0x0E,0xFC,0xF8,0x00,0x1F,0x3F,0x70,0x67,0x6F,0x6C,0x6F,0x67,0x6C,0x2F,0x07, // 033) 0x40=064 @ +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 034) 0x41=065 A +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 035) 0x42=066 B +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 036) 0x43=067 C +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 037) 0x44=068 D +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0xC6,0xC6,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x63,0x63,0x70,0x70,0x00, // 038) 0x45=069 E +0x00,0x06,0xFE,0xFE,0x86,0x86,0xC6,0xC6,0x06,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x03,0x00,0x00,0x00,0x00, // 039) 0x46=070 F +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x63,0x63,0x73,0x3F,0x1F,0x00, // 040) 0x47=071 G +0x00,0x06,0xFE,0xFE,0x86,0x80,0x80,0x86,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x01,0x61,0x7F,0x7F,0x60,0x00, // 041) 0x48=072 H +0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 042) 0x49=073 I +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x70,0x3F,0x1F,0x00,0x00, // 043) 0x4A=074 J +0x00,0x06,0xFE,0xFE,0x86,0x80,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x6F,0x7E,0x78,0x60,0x00, // 044) 0x4B=075 K +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x60,0x70,0x70,0x00, // 045) 0x4C=076 L +0x00,0x06,0xFE,0xFE,0x78,0xE0,0xE0,0x78,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x01,0x60,0x7F,0x7F,0x60,0x00, // 046) 0x4D=077 M +0x00,0x06,0xFE,0xFE,0x78,0xE0,0x80,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x07,0x1E,0x7F,0x7F,0x60,0x00, // 047) 0x4E=078 N +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 048) 0x4F=079 O + // +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x03,0x03,0x01,0x00,0x00, // 049) 0x50=080 P +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x6C,0x7C,0x38,0x7F,0x6F,0x00, // 050) 0x51=081 Q +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x6F,0x7F,0x79,0x60,0x00, // 051) 0x52=082 R +0x00,0x78,0xFC,0xCE,0x86,0x86,0x86,0x86,0x9E,0x1C,0x18,0x00,0x00,0x18,0x38,0x79,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 052) 0x53=083 S +0x00,0x0E,0x0E,0x06,0x06,0xFE,0xFE,0x06,0x06,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 053) 0x54=084 T +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x70,0x3F,0x1F,0x00,0x00, // 054) 0x55=085 U +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x03,0x0F,0x3E,0x78,0x78,0x3E,0x0F,0x03,0x00,0x00, // 055) 0x56=086 V +0x00,0x06,0xFE,0xFE,0x06,0x80,0x80,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x1F,0x7F,0x78,0x1F,0x1F,0x78,0x7F,0x1F,0x00,0x00, // 056) 0x57=087 W +0x00,0x06,0x1E,0x7E,0xF6,0xC0,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x78,0x7E,0x6F,0x03,0x03,0x6F,0x7E,0x78,0x60,0x00, // 057) 0x58=088 X +0x00,0x06,0x7E,0xFE,0xC6,0x00,0x00,0xC6,0xFE,0x7E,0x06,0x00,0x00,0x00,0x00,0x01,0x63,0x7F,0x7F,0x63,0x01,0x00,0x00,0x00, // 058) 0x59=089 Y +0x00,0x0E,0x0E,0x06,0x06,0x86,0xC6,0xE6,0x76,0x3E,0x1E,0x00,0x00,0x78,0x7C,0x6E,0x67,0x63,0x61,0x60,0x60,0x70,0x70,0x00, // 059) 0x5A=090 Z +0x00,0x00,0x00,0x00,0xFF,0xFF,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0x00,0x00,0x00, // 060) 0x5B=091 [ +0x00,0x00,0x06,0x1E,0x78,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x1E,0x78,0x60,0x00,0x00, // 061) 0x5C=092 обратный слеш +0x00,0x00,0x00,0x03,0x03,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFF,0xFF,0x00,0x00,0x00,0x00, // 062) 0x5D=093 ] +0x00,0x00,0x00,0x30,0x3C,0x1E,0x1E,0x3C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 063) 0x5E=094 ^ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00, // 064) 0x5F=095 _ + // +0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 065) 0x60=096 ` +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x1C,0x3E,0x77,0x63,0x63,0x63,0x33,0x7F,0x7F,0x60,0x00, // 066) 0x61=097 a +0x00,0x06,0xFE,0xFE,0x66,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x60,0x7F,0x7F,0x30,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 067) 0x62=098 b +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 068) 0x63=099 c +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x66,0xFE,0xFE,0x06,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x30,0x7F,0x7F,0x60,0x00, // 069) 0x64=100 d +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x76,0x66,0x66,0x66,0x66,0x76,0x37,0x17,0x00, // 070) 0x65=101 e +0x00,0x00,0x00,0x60,0xFC,0xFE,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, // 071) 0x66=102 f +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x60,0xF0,0xF0,0x30,0x00,0x00,0x33,0x77,0xEE,0xCC,0xCC,0xCC,0xEE,0x7F,0x3F,0x00,0x00, // 072) 0x67=103 g +0x00,0x06,0xFE,0xFE,0x66,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 073) 0x68=104 h +0x00,0x00,0x00,0x00,0x30,0xF6,0xF6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 074) 0x69=105 i +0x00,0x00,0x00,0x00,0x00,0x30,0xF6,0xF6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x7F,0x3F,0x00,0x00,0x00,0x00, // 075) 0x6A=106 j +0x00,0x06,0xFE,0xFE,0x06,0x80,0xF0,0xF0,0x70,0x30,0x30,0x00,0x00,0x60,0x7F,0x7F,0x63,0x07,0x0F,0x7C,0x78,0x70,0x60,0x00, // 076) 0x6B=107 k +0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 077) 0x6C=108 l +0x30,0xF0,0xE0,0x30,0x30,0xF0,0xE0,0x30,0x30,0xF0,0xE0,0x00,0x60,0x7F,0x7F,0x60,0x00,0x7F,0x7F,0x00,0x60,0x7F,0x7F,0x60, // 078) 0x6D=109 m +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 079) 0x6E=110 n +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 080) 0x6F=111 o + // +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0xC0,0xFF,0xFF,0xD8,0x30,0x30,0x30,0x38,0x1F,0x0F,0x00, // 081) 0x70=112 p +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x60,0xF0,0xF0,0x30,0x00,0x00,0x0F,0x1F,0x38,0x30,0x30,0x30,0xD8,0xFF,0xFF,0xC0,0x00, // 082) 0x71=113 q +0x00,0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x70,0x60,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // 083) 0x72=114 r +0x00,0xE0,0xF0,0x30,0x30,0x30,0x30,0x30,0x70,0x70,0x60,0x00,0x00,0x19,0x3B,0x7B,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 084) 0x73=115 s +0x00,0x00,0x00,0x30,0xFE,0xFE,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7F,0x60,0x60,0x00,0x00,0x00,0x00, // 085) 0x74=116 t +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x30,0x7F,0x7F,0x60,0x00, // 086) 0x75=117 u +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x07,0x1F,0x78,0x78,0x1F,0x07,0x00,0x00,0x00, // 087) 0x76=118 v +0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x03,0x1F,0x7C,0x70,0x1E,0x1E,0x70,0x7C,0x1F,0x03,0x00, // 088) 0x77=119 w +0x00,0x00,0x30,0x70,0xF0,0x80,0x80,0xF0,0x70,0x30,0x00,0x00,0x00,0x00,0x60,0x70,0x7D,0x0F,0x0F,0x7D,0x70,0x60,0x00,0x00, // 089) 0x78=120 x +0x00,0x00,0x30,0xF0,0xC0,0x00,0x00,0xC0,0xF0,0x30,0x00,0x00,0x00,0x00,0x60,0x60,0x73,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00, // 090) 0x79=121 y +0x00,0x00,0x70,0x70,0x30,0x30,0xB0,0xF0,0xF0,0x70,0x00,0x00,0x00,0x00,0x78,0x7C,0x6E,0x67,0x63,0x61,0x70,0x70,0x00,0x00, // 091) 0x7A=122 z +0x00,0x00,0x80,0xC0,0xFC,0x7E,0x07,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x3F,0x7E,0xE0,0xC0,0xC0,0x00,0x00,0x00, // 092) 0x7B=123 { +0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00, // 093) 0x7C=124 | +0x00,0x00,0x00,0x03,0x03,0x07,0x7E,0xFC,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xE0,0x7E,0x3F,0x03,0x01,0x00,0x00, // 094) 0x7D=125 } +0x00,0x80,0xC0,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x80,0x80,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x01,0x00, // 095) 0x7E=126 ~ + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // + +const uint8_t MediumFontRus[] PROGMEM = // Шрифт MediumFontRus +{ // +0x0C,0x10,0x20,0xB0, // ширина символов (12), высота символов (16), код первого символа (32), количество символов (176) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 001) 0x20=032 пробел +0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x67,0x00,0x00,0x00,0x00,0x00, // 002) 0x21=033 ! +0x00,0x00,0x00,0x16,0x0E,0x00,0x00,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 003) 0x22=034 " +0x00,0x00,0x60,0xE0,0xF8,0x7E,0x6E,0xE0,0xF8,0x7E,0x6E,0x00,0x00,0x76,0x7E,0x1F,0x07,0x76,0x7E,0x1F,0x07,0x06,0x00,0x00, // 004) 0x23=035 # +0x00,0x78,0xFC,0xCE,0x86,0xFF,0xFF,0x86,0x9E,0x1C,0x18,0x00,0x00,0x18,0x38,0x79,0x61,0xFF,0xFF,0x61,0x73,0x3F,0x1E,0x00, // 005) 0x24=036 $ +0x00,0x3C,0x7E,0x66,0x7E,0xBC,0xE0,0x78,0x1E,0x06,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x3D,0x7E,0x66,0x7E,0x3C,0x00, // 006) 0x25=037 % +0x00,0x00,0x00,0x80,0x80,0xFC,0xFE,0xE6,0xE6,0x7E,0x3C,0x00,0x00,0x1E,0x3F,0x73,0x61,0x61,0x71,0x7F,0x3F,0x7C,0x6C,0x00, // 007) 0x26=038 & +0x00,0x00,0x00,0x00,0x00,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 008) 0x27=039 ' +0x00,0x00,0x00,0x00,0xF0,0xFC,0x0E,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0x70,0xC0,0x00,0x00,0x00,0x00, // 009) 0x28=040 ( +0x00,0x00,0x00,0x00,0x03,0x0E,0xFC,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x70,0x3F,0x0F,0x00,0x00,0x00,0x00, // 010) 0x29=041 ) +0x00,0x00,0x00,0x08,0x78,0x3C,0x3C,0x78,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 011) 0x2A=042 * +0x00,0x00,0x80,0x80,0x80,0xF0,0xF0,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x0F,0x01,0x01,0x01,0x00,0x00, // 012) 0x2B=043 + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x70,0x00,0x00,0x00,0x00,0x00, // 013) 0x2C=044 , +0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00, // 014) 0x2D=045 - +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00, // 015) 0x2E=046 . +0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x78,0x1E,0x06,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x01,0x00,0x00,0x00,0x00,0x00, // 016) 0x2F=047 / + // +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 017) 0x30=048 0 +0x00,0x00,0x00,0x30,0x38,0x1C,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00, // 018) 0x31=049 1 +0x00,0x18,0x1C,0x1E,0x06,0x06,0x06,0x86,0xCE,0xFC,0x78,0x00,0x00,0x78,0x7C,0x7E,0x66,0x67,0x63,0x63,0x61,0x70,0x70,0x00, // 019) 0x32=050 2 +0x00,0x0E,0x0E,0x06,0x06,0xC6,0xE6,0xF6,0xFE,0x9E,0x0E,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 020) 0x33=051 3 +0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0xFE,0xFE,0x06,0x00,0x00,0x07,0x07,0x07,0x06,0x06,0x06,0x66,0x7F,0x7F,0x66,0x00, // 021) 0x34=052 4 +0x00,0xFE,0xFE,0xE6,0x66,0x66,0x66,0x66,0xE6,0xCE,0x8E,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 022) 0x35=053 5 +0x00,0xF8,0xFC,0xCE,0xC6,0xC6,0xC6,0xC6,0xDE,0x9C,0x18,0x00,0x00,0x1F,0x3F,0x71,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 023) 0x36=054 6 +0x00,0x1E,0x1E,0x06,0x06,0x06,0x06,0x86,0xE6,0x7E,0x1E,0x00,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x01,0x00,0x00,0x00, // 024) 0x37=055 7 +0x00,0x78,0xFC,0xCE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x1E,0x3F,0x73,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 025) 0x38=056 8 +0x00,0xF8,0xFC,0x8E,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x18,0x39,0x7B,0x63,0x63,0x63,0x63,0x73,0x3F,0x1F,0x00, // 026) 0x39=057 9 +0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00, // 027) 0x3A=058 : +0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x1C,0x00,0x00,0x00,0x00,0x00, // 028) 0x3B=059 ; +0x00,0x00,0x80,0xC0,0xC0,0xE0,0x60,0x70,0x30,0x30,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x06,0x0E,0x0C,0x0C,0x00,0x00, // 029) 0x3C=060 < +0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // 030) 0x3D=061 = +0x00,0x00,0x30,0x30,0x70,0x60,0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x0C,0x0C,0x0E,0x06,0x07,0x03,0x03,0x01,0x00,0x00, // 031) 0x3E=062 > +0x00,0x18,0x1C,0x1E,0x06,0x06,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x6E,0x6F,0x03,0x01,0x01,0x00,0x00,0x00, // 032) 0x3F=063 ? + // +0x00,0xF8,0xFC,0x0E,0xE6,0xF6,0x36,0xF6,0xF6,0x0E,0xFC,0xF8,0x00,0x1F,0x3F,0x70,0x67,0x6F,0x6C,0x6F,0x67,0x6C,0x2F,0x07, // 033) 0x40=064 @ +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 034) 0x41=065 A +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 035) 0x42=066 B +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 036) 0x43=067 C +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 037) 0x44=068 D +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0xC6,0xC6,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x63,0x63,0x70,0x70,0x00, // 038) 0x45=069 E +0x00,0x06,0xFE,0xFE,0x86,0x86,0xC6,0xC6,0x06,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x03,0x00,0x00,0x00,0x00, // 039) 0x46=070 F +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x63,0x63,0x73,0x3F,0x1F,0x00, // 040) 0x47=071 G +0x00,0x06,0xFE,0xFE,0x86,0x80,0x80,0x86,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x01,0x61,0x7F,0x7F,0x60,0x00, // 041) 0x48=072 H +0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 042) 0x49=073 I +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x70,0x3F,0x1F,0x00,0x00, // 043) 0x4A=074 J +0x00,0x06,0xFE,0xFE,0x86,0x80,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x6F,0x7E,0x78,0x60,0x00, // 044) 0x4B=075 K +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x60,0x70,0x70,0x00, // 045) 0x4C=076 L +0x00,0x06,0xFE,0xFE,0x78,0xE0,0xE0,0x78,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x01,0x60,0x7F,0x7F,0x60,0x00, // 046) 0x4D=077 M +0x00,0x06,0xFE,0xFE,0x78,0xE0,0x80,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x07,0x1E,0x7F,0x7F,0x60,0x00, // 047) 0x4E=078 N +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 048) 0x4F=079 O + // +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x03,0x03,0x01,0x00,0x00, // 049) 0x50=080 P +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x6C,0x7C,0x38,0x7F,0x6F,0x00, // 050) 0x51=081 Q +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x6F,0x7F,0x79,0x60,0x00, // 051) 0x52=082 R +0x00,0x78,0xFC,0xCE,0x86,0x86,0x86,0x86,0x9E,0x1C,0x18,0x00,0x00,0x18,0x38,0x79,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 052) 0x53=083 S +0x00,0x0E,0x0E,0x06,0x06,0xFE,0xFE,0x06,0x06,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 053) 0x54=084 T +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x70,0x3F,0x1F,0x00,0x00, // 054) 0x55=085 U +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x03,0x0F,0x3E,0x78,0x78,0x3E,0x0F,0x03,0x00,0x00, // 055) 0x56=086 V +0x00,0x06,0xFE,0xFE,0x06,0x80,0x80,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x1F,0x7F,0x78,0x1F,0x1F,0x78,0x7F,0x1F,0x00,0x00, // 056) 0x57=087 W +0x00,0x06,0x1E,0x7E,0xF6,0xC0,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x78,0x7E,0x6F,0x03,0x03,0x6F,0x7E,0x78,0x60,0x00, // 057) 0x58=088 X +0x00,0x06,0x7E,0xFE,0xC6,0x00,0x00,0xC6,0xFE,0x7E,0x06,0x00,0x00,0x00,0x00,0x01,0x63,0x7F,0x7F,0x63,0x01,0x00,0x00,0x00, // 058) 0x59=089 Y +0x00,0x0E,0x0E,0x06,0x06,0x86,0xC6,0xE6,0x76,0x3E,0x1E,0x00,0x00,0x78,0x7C,0x6E,0x67,0x63,0x61,0x60,0x60,0x70,0x70,0x00, // 059) 0x5A=090 Z +0x00,0x00,0x00,0x00,0xFF,0xFF,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0x00,0x00,0x00, // 060) 0x5B=091 [ +0x00,0x00,0x06,0x1E,0x78,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x1E,0x78,0x60,0x00,0x00, // 061) 0x5C=092 обратный слеш +0x00,0x00,0x00,0x03,0x03,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFF,0xFF,0x00,0x00,0x00,0x00, // 062) 0x5D=093 ] +0x00,0x00,0x00,0x30,0x3C,0x1E,0x1E,0x3C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 063) 0x5E=094 ^ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00, // 064) 0x5F=095 _ + // +0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 065) 0x60=096 ` +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x1C,0x3E,0x77,0x63,0x63,0x63,0x33,0x7F,0x7F,0x60,0x00, // 066) 0x61=097 a +0x00,0x06,0xFE,0xFE,0x66,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x60,0x7F,0x7F,0x30,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 067) 0x62=098 b +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 068) 0x63=099 c +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x66,0xFE,0xFE,0x06,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x30,0x7F,0x7F,0x60,0x00, // 069) 0x64=100 d +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x76,0x66,0x66,0x66,0x66,0x76,0x37,0x17,0x00, // 070) 0x65=101 e +0x00,0x00,0x00,0x60,0xFC,0xFE,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, // 071) 0x66=102 f +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x60,0xF0,0xF0,0x30,0x00,0x00,0x33,0x77,0xEE,0xCC,0xCC,0xCC,0xEE,0x7F,0x3F,0x00,0x00, // 072) 0x67=103 g +0x00,0x06,0xFE,0xFE,0x66,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 073) 0x68=104 h +0x00,0x00,0x00,0x00,0x30,0xF6,0xF6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 074) 0x69=105 i +0x00,0x00,0x00,0x00,0x00,0x30,0xF6,0xF6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x7F,0x3F,0x00,0x00,0x00,0x00, // 075) 0x6A=106 j +0x00,0x06,0xFE,0xFE,0x06,0x80,0xF0,0xF0,0x70,0x30,0x30,0x00,0x00,0x60,0x7F,0x7F,0x63,0x07,0x0F,0x7C,0x78,0x70,0x60,0x00, // 076) 0x6B=107 k +0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 077) 0x6C=108 l +0x30,0xF0,0xE0,0x30,0x30,0xF0,0xE0,0x30,0x30,0xF0,0xE0,0x00,0x60,0x7F,0x7F,0x60,0x00,0x7F,0x7F,0x00,0x60,0x7F,0x7F,0x60, // 078) 0x6D=109 m +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 079) 0x6E=110 n +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 080) 0x6F=111 o + // +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0xC0,0xFF,0xFF,0xD8,0x30,0x30,0x30,0x38,0x1F,0x0F,0x00, // 081) 0x70=112 p +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x60,0xF0,0xF0,0x30,0x00,0x00,0x0F,0x1F,0x38,0x30,0x30,0x30,0xD8,0xFF,0xFF,0xC0,0x00, // 082) 0x71=113 q +0x00,0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x70,0x60,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // 083) 0x72=114 r +0x00,0xE0,0xF0,0x30,0x30,0x30,0x30,0x30,0x70,0x70,0x60,0x00,0x00,0x19,0x3B,0x7B,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 084) 0x73=115 s +0x00,0x00,0x00,0x30,0xFE,0xFE,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7F,0x60,0x60,0x00,0x00,0x00,0x00, // 085) 0x74=116 t +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x30,0x7F,0x7F,0x60,0x00, // 086) 0x75=117 u +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x07,0x1F,0x78,0x78,0x1F,0x07,0x00,0x00,0x00, // 087) 0x76=118 v +0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x03,0x1F,0x7C,0x70,0x1E,0x1E,0x70,0x7C,0x1F,0x03,0x00, // 088) 0x77=119 w +0x00,0x00,0x30,0x70,0xF0,0x80,0x80,0xF0,0x70,0x30,0x00,0x00,0x00,0x00,0x60,0x70,0x7D,0x0F,0x0F,0x7D,0x70,0x60,0x00,0x00, // 089) 0x78=120 x +0x00,0x00,0x30,0xF0,0xC0,0x00,0x00,0xC0,0xF0,0x30,0x00,0x00,0x00,0x00,0x60,0x60,0x73,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00, // 090) 0x79=121 y +0x00,0x00,0x70,0x70,0x30,0x30,0xB0,0xF0,0xF0,0x70,0x00,0x00,0x00,0x00,0x78,0x7C,0x6E,0x67,0x63,0x61,0x70,0x70,0x00,0x00, // 091) 0x7A=122 z +0x00,0x00,0x80,0xC0,0xFC,0x7E,0x07,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x3F,0x7E,0xE0,0xC0,0xC0,0x00,0x00,0x00, // 092) 0x7B=123 { +0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00, // 093) 0x7C=124 | +0x00,0x00,0x00,0x03,0x03,0x07,0x7E,0xFC,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xE0,0x7E,0x3F,0x03,0x01,0x00,0x00, // 094) 0x7D=125 } +0x00,0x80,0xC0,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x80,0x80,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x01,0x00, // 095) 0x7E=126 ~ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 096) 0x7F=127 ⌂ + // +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 097) 0x80=128 А +0x00,0x06,0xFE,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x8E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 098) 0x81=129 Б +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 099) 0x82=130 В +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 100) 0x83=131 Г +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x78,0x7F,0x1F,0x18,0x18,0x18,0x18,0x1F,0x7F,0x78,0x00, // 101) 0x84=132 Д +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0xC6,0xC6,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x63,0x63,0x70,0x70,0x00, // 102) 0x85=133 Е +0x00,0x06,0x7E,0xFE,0xC0,0xFE,0xFE,0xC0,0xFE,0x7E,0x06,0x00,0x00,0x60,0x7E,0x7F,0x03,0x7F,0x7F,0x03,0x7F,0x7E,0x60,0x00, // 103) 0x86=134 Ж +0x00,0x18,0x1C,0x1E,0x06,0x06,0xC6,0xC6,0xEE,0xFC,0x38,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 104) 0x87=135 З +0x00,0x06,0xFE,0xFE,0x06,0x80,0xE0,0x78,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x1E,0x07,0x01,0x60,0x7F,0x7F,0x60,0x00, // 105) 0x88=136 И +0x00,0x06,0xFE,0xFE,0x01,0x83,0xE3,0x79,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x1E,0x07,0x01,0x60,0x7F,0x7F,0x60,0x00, // 106) 0x89=137 Й +0x00,0x06,0xFE,0xFE,0x86,0x80,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x6F,0x7E,0x78,0x60,0x00, // 107) 0x8A=138 К +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x3F,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 108) 0x8B=139 Л +0x00,0x06,0xFE,0xFE,0x78,0xE0,0xE0,0x78,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x01,0x60,0x7F,0x7F,0x60,0x00, // 109) 0x8C=140 М +0x00,0x06,0xFE,0xFE,0x86,0x80,0x80,0x86,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x01,0x61,0x7F,0x7F,0x60,0x00, // 110) 0x8D=141 Н +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 111) 0x8E=142 О +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 112) 0x8F=143 П + // +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x03,0x03,0x01,0x00,0x00, // 113) 0x90=144 Р +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 114) 0x91=145 С +0x00,0x0E,0x0E,0x06,0x06,0xFE,0xFE,0x06,0x06,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 115) 0x92=146 Т +0x00,0x06,0x1E,0x7E,0xF6,0xC0,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x60,0x70,0x7D,0x1F,0x07,0x01,0x00,0x00,0x00,0x00, // 116) 0x93=147 У +0x00,0xF0,0xF8,0x1C,0x0C,0xFE,0xFE,0x0C,0x1C,0xF8,0xF0,0x00,0x00,0x0F,0x1F,0x38,0x30,0x7F,0x7F,0x30,0x38,0x1F,0x0F,0x00, // 117) 0x94=148 Ф +0x00,0x06,0x1E,0x7E,0xF6,0xC0,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x78,0x7E,0x6F,0x03,0x03,0x6F,0x7E,0x78,0x60,0x00, // 118) 0x95=149 Х +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x7F,0x7F,0xE0,0xE0, // 119) 0x96=150 Ц +0x00,0x06,0xFE,0xFE,0x86,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 120) 0x97=151 Ч +0x00,0x06,0xFE,0xFE,0x06,0xF0,0xF0,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x00, // 121) 0x98=152 Ш +0x00,0x06,0xFE,0xFE,0x06,0xF0,0xF0,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0xE0,0xE0, // 122) 0x99=153 Щ +0x06,0x06,0xFE,0xFE,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 123) 0x9A=154 Ъ +0x00,0x06,0xFE,0xFE,0x86,0x80,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x7F,0x1F,0x60,0x7F,0x7F,0x60,0x00, // 124) 0x9B=155 Ы +0x00,0x06,0xFE,0xFE,0x86,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 125) 0x9C=156 Ь +0x00,0x18,0x1C,0x1E,0x06,0x06,0x86,0x86,0x8E,0xFC,0xF8,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x61,0x61,0x71,0x3F,0x1F,0x00, // 126) 0x9D=157 Э +0x00,0x06,0xFE,0xFE,0x86,0xF8,0xFC,0x0E,0x06,0x0E,0xFC,0xF8,0x00,0x60,0x7F,0x7F,0x61,0x1F,0x3F,0x70,0x60,0x70,0x3F,0x1F, // 127) 0x9E=158 Ю +0x00,0xF8,0xFC,0x8E,0x06,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x79,0x7F,0x6F,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 128) 0x9F=159 Я + // +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x1C,0x3E,0x77,0x63,0x63,0x63,0x33,0x7F,0x7F,0x60,0x00, // 129) 0xA0=160 а +0x00,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0x30,0x70,0x70,0x00,0x00,0x60,0x7F,0x7F,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 130) 0xA1=161 б +0x00,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x60,0x7F,0x7F,0x63,0x63,0x63,0x63,0x77,0x3F,0x1C,0x00, // 131) 0xA2=162 в +0x00,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0x30,0x70,0x70,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 132) 0xA3=163 г +0x00,0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0xF0,0xF0,0x30,0x00,0x00,0xF0,0xFF,0x3F,0x30,0x30,0x30,0x30,0x3F,0xFF,0xF0,0x00, // 133) 0xA4=164 д +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x76,0x66,0x66,0x66,0x66,0x76,0x37,0x17,0x00, // 134) 0xA5=165 е +0x00,0x30,0x70,0xF0,0x80,0xF0,0xF0,0x80,0xF0,0x70,0x30,0x00,0x00,0x60,0x70,0x7D,0x0F,0x7F,0x7F,0x0F,0x7D,0x70,0x60,0x00, // 135) 0xA6=166 ж +0x00,0xC0,0xE0,0xF0,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x18,0x38,0x78,0x60,0x63,0x63,0x63,0x77,0x3F,0x1C,0x00, // 136) 0xA7=167 з +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0xB0,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x7C,0x0E,0x07,0x63,0x7F,0x7F,0x60,0x00, // 137) 0xA8=168 и +0x00,0x30,0xF0,0xF3,0x37,0x06,0x06,0xB7,0xF3,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x7C,0x0E,0x07,0x63,0x7F,0x7F,0x60,0x00, // 138) 0xA9=169 й +0x00,0x30,0xF0,0xF0,0x30,0x00,0x80,0xF0,0xF0,0x70,0x30,0x00,0x00,0x60,0x7F,0x7F,0x63,0x07,0x0F,0x7D,0x78,0x70,0x60,0x00, // 139) 0xAA=170 к +0x00,0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x3F,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 140) 0xAB=171 л +0x00,0x30,0xF0,0xF0,0xC0,0x80,0x80,0xC0,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x61,0x07,0x07,0x61,0x7F,0x7F,0x60,0x00, // 141) 0xAC=172 м +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 142) 0xAD=173 н +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 143) 0xAE=174 о +0x00,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 144) 0xAF=175 п + // +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0xC0,0xFF,0xFF,0xD8,0x30,0x30,0x30,0x38,0x1F,0x0F,0x00, // 145) 0xE0=224 р +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 146) 0xE1=225 с +0x00,0x70,0x70,0x30,0x30,0xF0,0xF0,0x30,0x30,0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 147) 0xE2=226 т +0x00,0x00,0x30,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x60,0x60,0x73,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00, // 148) 0xE3=227 у +0x00,0xC0,0xE0,0x70,0x30,0xF8,0xF8,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0xFF,0xFF,0x60,0x70,0x3F,0x1F,0x00, // 149) 0xE4=228 ф +0x00,0x00,0x30,0x70,0xF0,0x80,0x80,0xF0,0x70,0x30,0x00,0x00,0x00,0x00,0x60,0x70,0x7D,0x0F,0x0F,0x7D,0x70,0x60,0x00,0x00, // 150) 0xE5=229 х +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x7F,0x7F,0xE0,0xE0, // 151) 0xE6=230 ц +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x03,0x07,0x06,0x06,0x06,0x66,0x7F,0x7F,0x60,0x00, // 152) 0xE7=231 ч +0x00,0x30,0xF0,0xF0,0x30,0x80,0x80,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x00, // 153) 0xE8=232 ш +0x00,0x30,0xF0,0xF0,0x30,0x80,0x80,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0xE0,0xE0, // 154) 0xE9=233 щ +0x30,0x30,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 155) 0xEA=234 ъ +0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x30,0xF0,0xF0,0x30,0x60,0x7F,0x7F,0x63,0x63,0x77,0x3E,0x1C,0x60,0x7F,0x7F,0x60, // 156) 0xEB=235 ы +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 157) 0xEC=236 ь +0x00,0xC0,0xE0,0xF0,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x63,0x63,0x73,0x3F,0x1F,0x00, // 158) 0xED=237 э +0x30,0xF0,0xF0,0x30,0xC0,0xE0,0x70,0x30,0x30,0x70,0xE0,0xC0,0x60,0x7F,0x7F,0x63,0x1F,0x3F,0x70,0x60,0x60,0x70,0x3F,0x1F, // 159) 0xEE=238 ю +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0xF0,0xF0,0x30,0x00,0x00,0x61,0x73,0x7F,0x6E,0x06,0x06,0x66,0x7F,0x7F,0x60,0x00, // 160) 0xEF=239 я + // +0x00,0x0C,0xFC,0xFF,0x8F,0x8C,0x8C,0xCF,0xCF,0x1C,0x1C,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x63,0x63,0x70,0x70,0x00, // 161) 0xF0=240 Ё +0x00,0xC0,0xE0,0x76,0x36,0x30,0x30,0x36,0x76,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x76,0x66,0x66,0x66,0x66,0x76,0x37,0x17,0x00, // 162) 0xF1=241 ё +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 163) 0xF2=242 Є +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 164) 0xF3=243 є +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 165) 0xF4=244 Ї +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 166) 0xF5=245 ї +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 167) 0xF6=246 Ў +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 168) 0xF7=247 ў +0x00,0x3C,0x7E,0x66,0x66,0x7E,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 169) 0xF8=248 ° +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 170) 0xF9=249 ∙ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 171) 0xFA=250 · +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 172) 0xFB=251 √ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 173) 0xFC=252 № +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 174) 0xFD=253 ¤ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 175) 0xFE=254 ■ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 176) 0xFF=255   + // +0x01, 0xAF, 0x30 // В таблице имеется (1) пустой интервал, который находится после символа с кодом (175) и состоит из (48) отсутствующих символов. + // Допускается использовать до 3 пустых интервалов. Пример: 0x03, 0xAA, 0x10, 0xCC, 0x10, 0xEE, 0x10 +}; // 3 пустых интервала, по (16) отсутствующий символов в каждом, находятся после символов с кодами (170, 204 и 238). + +const uint8_t MediumNumbers[] PROGMEM = // Шрифт MediumNumbers +{ // +0x0c, 0x10, 0x2d, 0x0d, // ширина символов (12), высота символов (16), код первого символа (45), количество символов (13) +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, // 001) 0x2D=045 - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, // 002) 0x2E=046 . +0x00, 0x00, 0x02, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x02, 0x00, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x81, 0x00, 0x00, // 003) 0x2F=047 / +0x00, 0xfc, 0x7a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7a, 0xfc, 0x00, 0x00, 0x7e, 0xbc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbc, 0x7e, 0x00, // 004) 0x30=048 0 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x00, // 005) 0x31=049 1 +0x00, 0x00, 0x02, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x7a, 0xfc, 0x00, 0x00, 0x7e, 0xbd, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x81, 0x00, 0x00, // 006) 0x32=050 2 +0x00, 0x00, 0x02, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x7a, 0xfc, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 007) 0x33=051 3 +0x00, 0xfc, 0x78, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x78, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3d, 0x7e, 0x00, // 008) 0x34=052 4 +0x00, 0xfc, 0x7a, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x02, 0x00, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 009) 0x35=053 5 +0x00, 0xfc, 0x7a, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x02, 0x00, 0x00, 0x00, 0x7e, 0xbd, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 010) 0x36=054 6 +0x00, 0x00, 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7a, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x00, // 011) 0x37=055 7 +0x00, 0xfc, 0x7a, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x7a, 0xfc, 0x00, 0x00, 0x7e, 0xbd, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 012) 0x38=056 8 +0x00, 0xfc, 0x7a, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x7a, 0xfc, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 013) 0x39=057 9 + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // + +const uint8_t BigNumbers[] PROGMEM = // Шрифт BigNumbers +{ // +0x0e, 0x18, 0x2d, 0x0d, // ширина символов (14), высота символов (24), код первого символа (45), количество символов (13) +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 001) 0x2D=045 - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xe0, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, // 002) 0x2E=046 . +0x00, 0x00, 0x02, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, // 003) 0x2F=047 / +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0xef, 0xc7, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc7, 0xef, 0x00, 0x00, 0x7f, 0xbf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 004) 0x30=048 0 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf8, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc7, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3f, 0x7f, 0x00, // 005) 0x31=049 1 +0x00, 0x00, 0x02, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0xe0, 0xd0, 0xb8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3b, 0x17, 0x0f, 0x00, 0x00, 0x7f, 0xbf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, // 006) 0x32=050 2 +0x00, 0x00, 0x02, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xbb, 0xd7, 0xef, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 007) 0x33=051 3 +0x00, 0xfc, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf8, 0xfc, 0x00, 0x00, 0x0f, 0x17, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xbb, 0xd7, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3f, 0x7f, 0x00, // 008) 0x34=052 4 +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x17, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xb8, 0xd0, 0xe0, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 009) 0x35=053 5 +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0xef, 0xd7, 0xbb, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xb8, 0xd0, 0xe0, 0x00, 0x00, 0x7f, 0xbf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 010) 0x36=054 6 +0x00, 0x00, 0x02, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc7, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3f, 0x7f, 0x00, // 011) 0x37=055 7 +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0xef, 0xd7, 0xbb, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xbb, 0xd7, 0xef, 0x00, 0x00, 0x7f, 0xbf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 012) 0x38=056 8 +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0x0f, 0x17, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xbb, 0xd7, 0xef, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 013) 0x39=057 9 + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // + +const uint8_t MegaNumbers[] PROGMEM = // Шрифт MegaNumbers +{ // +0x18,0x28,0x2D,0x0D, // ширина символов (24), высота символов (40), код первого символа (45), количество символов (13) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 001) 0x2D=045 - () +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF8,0xFC,0xFE,0xFE,0xFC,0xF8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 002) 0x2E=046 . +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x1F,0x3F,0x3F,0x1F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x7C,0xFE,0xFF,0xFF,0xFE,0x7C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 003) 0x2F=047 / (:) +0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF0,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xFC,0xFE,0x3F,0x07,0x01,0x03,0x03,0x07,0x0F,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0xF0,0x00,0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x0F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0xF8,0xF0,0xE0,0xE0,0xC0,0x80,0xE0,0xF8,0xFF,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x07,0x0F,0x1F,0x1F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 004) 0x30=048 0 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x07,0x07,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x0F,0x1F,0x3F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00, // 005) 0x31=049 1 +0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0xF0,0xF0,0xE0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1C,0x3E,0x7F,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x03,0x01,0x83,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFC,0xFF,0xFF,0x7F,0x3F,0x1F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0,0xF8,0xFE,0xDF,0xEF,0xEF,0xE7,0xE3,0xE1,0xE1,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x1E,0x1F,0x0F,0x0F,0x0F,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0F,0x0F,0x1F,0x1F,0x0F,0x07,0x03,0x00,0x00,0x00, // 006) 0x32=050 2 +0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF0,0xF0,0xE0,0xE0,0xC0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x0F,0x1F,0x0F,0x07,0x03,0x01,0x81,0xC0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x0F,0x0F,0x0F,0x1F,0x3F,0xFF,0xFF,0xFF,0xF9,0xF0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xC1,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x0F,0x0F,0x0F,0x07,0x07,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00, // 007) 0x33=051 3 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xF8,0xF8,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF8,0x3C,0x1F,0x07,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFC,0xFF,0xE7,0xE3,0xE0,0xE0,0xE0,0xE0,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0xE0,0xE0,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x83,0xC3,0xC3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x0F,0x0F,0x0F,0x07,0x03,0x01,0x01,0x00,0x00,0x00, // 008) 0x34=052 4 +0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x78,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x07,0x01,0x81,0xC1,0xC1,0xE1,0xF1,0xE1,0xE1,0xC1,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x3F,0x1F,0x0E,0x07,0x07,0x07,0x07,0x0F,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0xF8,0x00,0x00,0x00,0x00,0x00,0x60,0xF0,0xFC,0xFC,0xFC,0xF8,0xF0,0xF0,0xE0,0xC0,0xC0,0x80,0x80,0xE0,0xFF,0xFF,0x7F,0x3F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x07,0x07,0x0F,0x0F,0x0F,0x0F,0x07,0x07,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00, // 009) 0x35=053 5 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF0,0xF0,0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0xFC,0xFE,0x7F,0x0F,0x01,0x01,0x03,0x83,0x87,0xCF,0xCF,0xDF,0x8F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xB8,0x1C,0x1E,0x0E,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFE,0xF8,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0xF8,0xF0,0xE0,0xC0,0xC0,0x80,0xE0,0xFF,0xFF,0x3F,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x07,0x0F,0x0F,0x0F,0x0F,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 010) 0x36=054 6 +0x00,0x00,0x00,0x00,0xC0,0xF0,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x78,0x38,0x00,0x00,0x00,0x00,0x18,0x1E,0x1F,0x07,0x03,0x03,0x01,0x01,0x01,0x81,0xC1,0xF1,0xF9,0xFD,0x3F,0x0F,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFC,0xFE,0xFF,0xFF,0x3F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x07,0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 011) 0x37=055 7 +0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFC,0xFF,0xFF,0xE7,0xC1,0xC1,0x81,0x81,0x81,0x81,0x83,0xC3,0xFF,0xFF,0x7F,0x3F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xCF,0xFF,0xFF,0x7F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F,0x7F,0xFF,0xFF,0xFE,0xF8,0xE0,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xF8,0xF0,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,0xFB,0x7F,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x07,0x0F,0x0F,0x0F,0x0F,0x1F,0x1F,0x0F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 012) 0x38=056 8 +0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF0,0xF8,0xF8,0xF8,0xF0,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF8,0xFE,0xFF,0xFF,0x87,0x01,0x01,0x01,0x03,0x07,0x0F,0x1F,0x7F,0xFF,0xFF,0xFF,0xFE,0xFC,0xE0,0x00,0x00,0x00,0x00,0x03,0x1F,0x7F,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0x70,0x38,0x3C,0x1E,0xCF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0xF9,0xFD,0xFB,0xF1,0xF0,0xE0,0xC0,0xC0,0xE0,0xFC,0xFF,0x7F,0x1F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x07,0x0F,0x0F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 013) 0x39=057 9 + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; + // diff --git a/libraries/iarduino_OLED/src/DefaultImage.c b/libraries/iarduino_OLED/src/DefaultImage.c new file mode 100644 index 0000000..6466075 --- /dev/null +++ b/libraries/iarduino_OLED/src/DefaultImage.c @@ -0,0 +1,213 @@ +#include // Содержимое картинок на примере массива Img_Logo: + // Массивы изображений начинаются с двух чисел - ширины и высоты изображения в пикселях. + // Далее следуют байты данных: + // Для визуализации разбейте массив на несколько строк, так, что бы количество байт в каждой строке совпало с шириной изображения. + // Для массива Img_Logo, имеющего размеры 27x16 получится две строки данных, по 27 байт в каждой строке. + // Если каждый байт записать битами, снизу вверх (внизу старший бит, сверху младший бит), то можно увидеть изображение. + // + // Значение байта (hex): 7F, 7F, 7F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 03, 1B, 1B, 1B, 03, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 0F, 7F, 7F, 7F + // 0 бит: (младший) 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 = 111111111111111111111111111 = ########################### + // 1 бит: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 = 111111111111111111111111111 = ########################### + // 2 бит: 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 = 111111111110000011111111111 = ########### ########### + // 3 бит: 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 = 111111111110111011111111111 = ########### ### ########### + // 4 бит: 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 = 111000000000111000000000111 = ### ### ### + // 5 бит: 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 = 111000000000000000000000111 = ### ### + // 6 бит: 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 = 111000000000000000000000111 = ### ### + // 7 бит: (старший) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = 000000000000000000000000000 = + // Значение байта (hex): FF, FF, FF, F0, F0, F0, C0, D8, D8, D8, C0, F0, F0, 00, F0, F0, C0, D8, D8, D8, C0, F0, F0, F0, FF, FF, FF + // 0 бит: (младший) 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 = 111000000000000000000000111 = ### ### + // 1 бит: 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 = 111000000000000000000000111 = ### ### + // 2 бит: 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 = 111000000000000000000000111 = ### ### + // 3 бит: 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 = 111000011100000001110000111 = ### ### ### ### + // 4 бит: 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 1 = 111111011101101101110111111 = ###### ### ## ## ### ###### + // 5 бит: 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 = 111111000001101100000111111 = ###### ## ## ###### + // 6 бит: 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 = 111111111111101111111111111 = ############# ############# + // 7 бит: (старший) 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 = 111111111111101111111111111 = ############# ############# + // +const uint8_t Img_Logo[] PROGMEM = { // Логотип iArduino +27,16, // Размер картинки 27x16 пикселей (высота должна быть кратна 8). +0x7F, 0x7F, 0x7F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x03, 0x1B, 0x1B, 0x1B, 0x03, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x7F, 0x7F, 0x7F, +0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xC0, 0xD8, 0xD8, 0xD8, 0xC0, 0xF0, 0xF0, 0x00, 0xF0, 0xF0, 0xC0, 0xD8, 0xD8, 0xD8, 0xC0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF +}; // + // +const uint8_t Img_Alarm[] PROGMEM = { // Будильник +9,8, // Размер картинки 9x8 пикселей (высота должна быть кратна 8). +0x06, 0xBB, 0x45, 0x82, 0x9E, 0x92, 0x45, 0xBB, 0x06 +}; // + // +const uint8_t Img_Antenna[] PROGMEM = { // Антенна +10,8, // Размер картинки 10x8 пикселей (высота должна быть кратна 8). +0x01, 0x03, 0x06, 0x0C, 0xFF, 0xFF, 0x0C, 0x06, 0x03, 0x01 +}; // + // +const uint8_t Img_Arrow_down[] PROGMEM = { // Стрелка вниз +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x04, 0x0C, 0x1C, 0x3C, 0x3C, 0x1C, 0x0C, 0x04 // +}; // + // +const uint8_t Img_Arrow_left[] PROGMEM = { // Стрелка влево +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0x00, 0x00 // +}; // + // +const uint8_t Img_Arrow_right[] PROGMEM = { // Стрелка вправо +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x00, 0x00, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00 // +}; // + // +const uint8_t Img_Arrow_up[] PROGMEM = { // Стрелка вверх +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x20, 0x30, 0x38, 0x3C, 0x3C, 0x38, 0x30, 0x20 // +}; // + // +const uint8_t Img_Battery_0[] PROGMEM = { // Батарейка с зарядом 0 +13,8, // Размер картинки 13x8 пикселей (высота должна быть кратна 8). +0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x3C +}; // + // +const uint8_t Img_Battery_1[] PROGMEM = { // Батарейка с зарядом 1 (меньше половины) +13,8, // Размер картинки 13x8 пикселей (высота должна быть кратна 8). +0xFF, 0x81, 0xBD, 0xBD, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x3C +}; // + // +const uint8_t Img_Battery_2[] PROGMEM = { // Батарейка с зарядом 2 (половина) +13,8, // Размер картинки 13x8 пикселей (высота должна быть кратна 8). +0xFF, 0x81, 0xBD, 0xBD, 0x81, 0xBD, 0xBD, 0x81, 0x81, 0x81, 0x81, 0xFF, 0x3C +}; // + // +const uint8_t Img_Battery_3[] PROGMEM = { // Батарейка с зарядом 3 (больше половины) +13,8, // Размер картинки 13x8 пикселей (высота должна быть кратна 8). +0xFF, 0x81, 0xBD, 0xBD, 0x81, 0xBD, 0xBD, 0x81, 0xBD, 0xBD, 0x81, 0xFF, 0x3C +}; // + // +const uint8_t Img_Battery_charging[] PROGMEM = {// Батарейка заряжается +13,8, // Размер картинки 13x8 пикселей (высота должна быть кратна 8). +0xFF, 0x81, 0x81, 0x81, 0x99, 0xBF, 0xB9, 0xBF, 0x99, 0x81, 0x81, 0xFF, 0x3C +}; // + // +const uint8_t Img_Battery_low[] PROGMEM = { // Батарейка разряжена +13,8, // Размер картинки 13x8 пикселей (высота должна быть кратна 8). +0xFF, 0x81, 0x81, 0xC3, 0xA5, 0x99, 0x99, 0xA5, 0xC3, 0x81, 0x81, 0xFF, 0x3C +}; // + // +const uint8_t Img_BigBattery_low[] PROGMEM = { // Батарейка разряжена (большая картинка) +23,16, // Размер картинки 23x8 пикселей (высота должна быть кратна 8). +0xFC, 0xFC, 0x0D, 0x0F, 0x0E, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0x8C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xFC, 0xFC, 0xC0, 0xC0, +0x3F, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x33, 0x36, 0x3C, 0x38, 0x30, 0x70, 0xF0, 0xB0, 0x3F, 0x3F, 0x03, 0x03 +}; // + // +const uint8_t Img_Bluetooth[] PROGMEM = { // Значок Bluetooth +5,8, // Размер картинки 5x8 пикселей (высота должна быть кратна 8). +0x42, 0x24, 0xFF, 0x5A, 0x24 // +}; // + // +const uint8_t Img_Call[] PROGMEM = { // Звонок вызова +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x0E, 0x1F, 0x3E, 0x70, 0xE5, 0xED, 0xE1, 0x4E // +}; // + // +const uint8_t Img_Call_in[] PROGMEM = { // Входящий звонок +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x0E, 0x1F, 0x3E, 0x70, 0xE0, 0xE7, 0xE6, 0x45 // +}; // + // +const uint8_t Img_Call_out[] PROGMEM = { // Исходящий звонок +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x0E, 0x1F, 0x3E, 0x70, 0xE0, 0xE5, 0xE3, 0x47 // +}; // + // +const uint8_t Img_Check[] PROGMEM = { // Галочка +7,8, // Размер картинки 7x8 пикселей (высота должна быть кратна 8). +0x30, 0x70, 0xE0, 0xF0, 0x7C, 0x1F, 0x07 // +}; // + // +const uint8_t Img_Checkbox_off[] PROGMEM = { // +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x7E, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x7E // +}; // + // +const uint8_t Img_Checkbox_on[] PROGMEM = { // +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x7E, 0x81, 0x99, 0xB1, 0x99, 0x8D, 0x81, 0x7E // +}; // + // +const uint8_t Img_Dynamic[] PROGMEM = { // Динамик +10,8, // Размер картинки 10x8 пикселей (высота должна быть кратна 8). +0x3C, 0x24, 0x3C, 0x42, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00 +}; // + // +const uint8_t Img_Dynamic_off[] PROGMEM = { // Динамик выключен +10,8, // Размер картинки 10x8 пикселей (высота должна быть кратна 8). +0x3C, 0x24, 0x3C, 0x42, 0xFF, 0x00, 0x24, 0x18, 0x18, 0x24 +}; // + // +const uint8_t Img_Dynamic_on[] PROGMEM = { // Динамик включен +10,8, // Размер картинки 10x8 пикселей (высота должна быть кратна 8). +0x3C, 0x24, 0x3C, 0x42, 0xFF, 0x00, 0x24, 0x99, 0x42, 0x3C +}; // + // +const uint8_t Img_Level_1[] PROGMEM = { // Уровень приёма 1 (низкий) +11,8, // Размер картинки 11x8 пикселей (высота должна быть кратна 8). +0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; // + // +const uint8_t Img_Level_2[] PROGMEM = { // Уровень приёма 2 (ниже среднего) +11,8, // Размер картинки 11x8 пикселей (высота должна быть кратна 8). +0xC0, 0xC0, 0x00, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; // + // +const uint8_t Img_Level_3[] PROGMEM = { // Уровень приёма 3 (выше среднего) +11,8, // Размер картинки 11x8 пикселей (высота должна быть кратна 8). +0xC0, 0xC0, 0x00, 0xF0, 0xF0, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0x00 +}; // + // +const uint8_t Img_Level_4[] PROGMEM = { // Уровень приёма 4 (уверенный) +11,8, // Размер картинки 11x8 пикселей (высота должна быть кратна 8). +0xC0, 0xC0, 0x00, 0xF0, 0xF0, 0x00, 0xFC, 0xFC, 0x00, 0xFF, 0xFF +}; // + // +const uint8_t Img_Light[] PROGMEM = { // Свет +9,8, // Размер картинки 9x8 пикселей (высота должна быть кратна 8). +0x10, 0x92, 0x6C, 0x44, 0x93, 0x44, 0x6C, 0x92, 0x10 +}; // + // +const uint8_t Img_Melody[] PROGMEM = { // Звонок мелодии +4,8, // Размер картинки 4x8 пикселей (высота должна быть кратна 8). +0x40, 0xEC, 0xE6, 0x7F // +}; // + // +const uint8_t Img_Message[] PROGMEM = { // Сообщение (конверт) +10,8, // Размер картинки 10x8 пикселей (высота должна быть кратна 8). +0x7E, 0xA5, 0x99, 0x91, 0xA1, 0xA1, 0x91, 0x99, 0xA5, 0x7E +}; // + // +const uint8_t Img_Netlevel_1[] PROGMEM = { // Уровень приёма сети 1 (ниже среднего) +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x07, 0x03, 0x05, 0x00, 0x00, 0x00, 0xC0, 0xC0 // +}; // + // +const uint8_t Img_Netlevel_2[] PROGMEM = { // Уровень приёма сети 2 (средний) +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x07, 0x03, 0x05, 0xC0, 0xF0, 0x30, 0xD8, 0xD8 // +}; // + // +const uint8_t Img_Netlevel_3[] PROGMEM = { // Уровень приёма сети 3 (выше среднего) +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0xE3, 0xF9, 0x3C, 0xCE, 0xF6, 0x37, 0xDB, 0xDB // +}; // + // +const uint8_t Img_Radio_off[] PROGMEM = { // +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x3C, 0x42, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3C // +}; // + // +const uint8_t Img_Radio_on[] PROGMEM = { // +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x3C, 0x42, 0x99, 0xBD, 0xBD, 0x99, 0x42, 0x3C // +}; // + // +const uint8_t Img_Settings[] PROGMEM = { // Звонок настроек +8,8, // Размер картинки 8x8 пикселей (высота должна быть кратна 8). +0x5A, 0xFF, 0x66, 0xDB, 0xDB, 0x66, 0xFF, 0x5A // +}; // + // \ No newline at end of file diff --git a/libraries/iarduino_OLED/src/iarduino_OLED.cpp b/libraries/iarduino_OLED/src/iarduino_OLED.cpp new file mode 100644 index 0000000..d9dd65e --- /dev/null +++ b/libraries/iarduino_OLED/src/iarduino_OLED.cpp @@ -0,0 +1,367 @@ +#include "iarduino_OLED.h" // + // +// Инициализация дисплея: // Возвращаемое значение: отсутствует +void iarduino_OLED::begin(void){ // Параметр: отсутствует +// Инициируем работу с шиной I2C: // + objI2C->begin(100); // Инициируем передачу данных по шине I2C на скорости 100 кГц. +// Подготавливаем к работе дисплей: // + _sendCommand(SSD1306_DISPLAY_OFF); // Выключаем дисплей. + _sendCommand(SSD1306_SET_DISPLAY_CLOCK); _sendCommand(0x80); // Устанавливаем частоту обновления дисплея в значение 0x80 (по умолчанию). + _sendCommand(SSD1306_SET_MULTIPLEX_RATIO); _sendCommand(0x3F); // Устанавливаем multiplex ratio (коэффициент мультиплексирования COM выводов) в значение 0x3F (по умолчанию). + _sendCommand(SSD1306_SET_DISPLAY_OFFSET); _sendCommand(0x00); // Устанавливаем смещение дисплея в 0 (без смещения). + _sendCommand(SSD1306_SET_START_LINE|0); // Устанавливаем смещение ОЗУ в значение 0 (без смещения). + _sendCommand(SSD1306_CHARGE_DCDC_PUMP); _sendCommand(0x14); // Настраиваем схему питания (0x14 - включить внутренний DC-DC преобразователь, 0x10 - отключить внутренний DC/DC). + _sendCommand(SSD1306_ADDR_MODE); _sendCommand(0x00); // Устанавливаем режим автоматической адресации (0x00-горизонтальная, 0x01-вертикальная, 0x10-страничная.) + _sendCommand(SSD1306_SET_REMAP_L_TO_R); // Устанавливаем режим строчной развертки (слева/направо). + _sendCommand(SSD1306_SET_REMAP_T_TO_D); // Устанавливаем режим кадровой развертки (сверху/вниз). + _sendCommand(SSD1306_SET_COM_PINS); _sendCommand(0x12); // Устанавливаем аппаратную конфигурация COM выводов в значение 0x12 (по умолчанию) + _sendCommand(SSD1306_SET_CONTRAST); _sendCommand(0xCF); // Устанавливаем контрастность в значение 0xCF (допустимы значения от 0x00 до 0xFF). + _sendCommand(SSD1306_SET_PRECHARGE_PERIOD); _sendCommand(0xF1); // Настраиваем схему DC/DC преобразователя (0xF1 - Vcc снимается с DC/DC преобразователя, 0x22 - Vcc подается извне). + _sendCommand(SSD1306_SET_VCOM_DESELECT); _sendCommand(0x40); // Устанавливаем питание светодиодов VcomH в значение выше чем по умолчанию (0x30), что увеличит яркость дисплея (допустимые значения: 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70). + _sendCommand(SSD1306_RAM_ON); // Разрешаем отображать содержимое RAM памяти. + _sendCommand(SSD1306_INVERT_OFF); // Отключаем инверсию. + _sendCommand(SSD1306_DISPLAY_ON); // Включаем дисплей. + clrScr(); // Чистим экран. +} // + // +// Очистка дисплея: // Возвращаемое значение: отсутствует. +void iarduino_OLED::clrScr(bool color){ // Параметр: флаг закрашивания экрана в белый цвет. + memset(arrBuffer, (color?0xFF:0x00), 1024); // Заполняем все биты массива arrBuffer нулями или единицами, в зависимости от состояния флага color. + numPageS=0; numPageP=7; // Указываем что при записи буфера arrBuffer в дисплей, нужно заполнить строки с 0 по 7. + numCellS=0; numCellP=127; // Указываем что при записи буфера arrBuffer в дисплей, нужно заполнить ячейки с 0 по 127. + if(flgUpdate){_sendBuffer();} // Если установлен флаг flgUpdate, то отправляем массив arrBuffer на дисплей. +} // + // +// Инверсия цвета дисплея: // Возвращаемое значение: отсутствует. +void iarduino_OLED::invScr(bool invert){ // Параметр: флаг инвертирования - да/нет. + if(invert) {_sendCommand(SSD1306_INVERT_ON );} // Если флаг invert установлен - включаем инверсию. + else {_sendCommand(SSD1306_INVERT_OFF);} // Если флаг invert сброшен - отключаем инверсию. +} // + // +// Выбор шрифта для вывода текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED::setFont(uint8_t* font){ // Параметр: название шрифта. + insFont.font = font; // Сохраняем указатель на первый байт массива в области памяти программ. + insFont.width = pgm_read_byte(&font[0]); // Сохраняем ширину символов выбранного шрифта читая её из 0 байта массива по указателю font. + insFont.height = pgm_read_byte(&font[1]); // Сохраняем высоту символов выбранного шрифта читая её из 1 байта массива по указателю font. + insFont.firstSymbol = pgm_read_byte(&font[2]); // Сохраняем код первого симола выбран. шрифта читая его из 2 байта массива по указателю font. + insFont.sumSymbol = pgm_read_byte(&font[3]); // Сохраняем количество символов в выбр шрифте читая их из 3 байта массива по указателю font. + insFont.setFont = true; // Устанавливаем флаг выбора шрифта. + uint16_t i = (uint16_t) insFont.sumSymbol * insFont.width * insFont.height / 8 + 0x04; // Определяем позицию бита указывающего количество пустых интервалов в массиве шрифта. + uint16_t j = pgm_read_byte(&font[i]); // Определяем количество пустых интервалов в массиве шрифта. + insFont.startSpace[0]=0xFF; insFont.sumSpace[0]=0; // Указываем что первый пустой интервал в массиве шрифта находится после символа с кодом (0xFF) и состоит из 0 символов + insFont.startSpace[1]=0xFF; insFont.sumSpace[1]=0; // Указываем что второй пустой интервал в массиве шрифта находится после символа с кодом (0xFF) и состоит из 0 символов + insFont.startSpace[2]=0xFF; insFont.sumSpace[2]=0; // Указываем что третий пустой интервал в массиве шрифта находится после символа с кодом (0xFF) и состоит из 0 символов + if(j>0) { insFont.startSpace[0]=pgm_read_byte(&font[i+1]); // Если количество пустых интервалов больше 0, то сохраняем начало первого пустого интервала символов + insFont.sumSpace [0]=pgm_read_byte(&font[i+2]);} // и размер первого пустого интервала символов + if(j>1) { insFont.startSpace[1]=pgm_read_byte(&font[i+3]); // Если количество пустых интервалов больше 1, то сохраняем начало второго пустого интервала символов + insFont.sumSpace [1]=pgm_read_byte(&font[i+4]);} // и размер второго пустого интервала символов + if(j>2) { insFont.startSpace[2]=pgm_read_byte(&font[i+5]); // Если количество пустых интервалов больше 2, то сохраняем начало третьего пустого интервала символов + insFont.sumSpace [2]=pgm_read_byte(&font[i+6]);} // и размер третьего пустого интервала символов +} // + // +// Установка курсора в указанную позицию // Возвращаемое значение: отсутствует. +void iarduino_OLED::setCursor(int x, int y){ // Параметры: № колонки, № строки. + if(x<128){numX=x;} if(y<64){numY=y;} // Сохраняем указанные позиции курсора, если они входят в диапазон допустимых +} // + // +// Вывод текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(char* txt, int x, int y){ // Параметры: текст, № колонки, № строки. + _print(_codingCP866(txt), x, y); // Вызываем функцию вывода текста _print(). +} // + // +// Вывод текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(String txt, int x, int y){ // Параметры: текст, № колонки, № строки. + char i[txt.length()+1]; txt.toCharArray(i,txt.length()+1); _print(_codingCP866(i), x, y); // Преобразуем String в char* и вызываем функцию вывода текста _print(). +} // + // +// Вывод текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(const char* txt, int x, int y){ // Параметры: текст, № колонки, № строки. + char i[strlen(txt)+1]; for(uint8_t j=0; j<=strlen(txt); j++){i[j]=txt[j];} _print(_codingCP866(i),x,y); // Преобразуем const char* в char* и вызываем функцию вывода текста _print(). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(int8_t num, int x, int y, uint8_t sys){ // Параметры: число, № колонки, № строки, система счисления. + print(int32_t(num), x, y, sys); // Преобразуем int8_t в int32_t и вызываем функцию вывода числа print(int32_t). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(uint8_t num, int x, int y, uint8_t sys){ // Параметры: число, № колонки, № строки, система счисления. + print(uint32_t(num), x, y, sys); // Преобразуем uint8_t в uint32_t и вызываем функцию вывода числа print(uint32_t). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(int16_t num, int x, int y, uint8_t sys){ // Параметры: число, № колонки, № строки, система счисления. + print(int32_t(num), x, y, sys); // Преобразуем int16_t в int32_t и вызываем функцию вывода числа print(int32_t). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(uint16_t num, int x, int y, uint8_t sys){ // Параметры: число, № колонки, № строки, система счисления. + print(uint32_t(num), x, y, sys); // Преобразуем uint16_t в uint32_t и вызываем функцию вывода числа print(uint32_t). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(int32_t num, int x, int y, uint8_t sys){ // Параметры: число, № колонки, № строки, система счисления. + int8_t i=2; int32_t j=1; while(num/j){j*=sys; i++;} // Определяем количество разрядов числа (i = количество разрядов + 2, j = множитель кратный основанию системы счисления) + char k[i]; i--; k[i]=0; i--; if(num>0) {k[i]=0; i--;} // Создаём строку k из i символов и добавляем символ(ы) конца строки. + uint32_t n=num<0?num*-1:num; while(i) {k[i]=_ItoAa(n%sys); n/=sys; i--;} // Заполняем строку k. + if(num>=0){k[i]=_ItoAa(n%sys);}else{k[i]='-';} // Добавляем первый символ (либо первая цифра, либо знак минус). + print(k, x, y); // Выводим строку k. +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(uint32_t num, int x, int y, uint8_t sys){ // Параметры: число, № колонки, № строки, система счисления. + int8_t i=1; uint32_t j=1; while(num/j){j*=sys; i++;} if(num==0){i++;} // Определяем количество разрядов числа (i = количество разрядов + 1, j = множитель кратный основанию системы счисления) + char k[i]; i--; k[i]=0; while(i){k[i-1]=_ItoAa(num%sys); num/=sys; i--;} // Определяем строку k из i символов и заполняем её. + print(k, x, y); // Выводим строку k. +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED::print(double num, int x, int y, uint8_t sum){ // Параметры: число, № колонки, № строки, количество знаков после запятой + uint32_t i=1; while(sum){i*=10; sum--;} // i=10^sum. + print(int32_t(num), x, y); // Выводим целую часть числа. + print("."); // Выводим символ разделителя. + print(uint32_t(num*i*(num<0?-1:1))%i); // Выводим дробную часть числа. +} // + // +// Прорисовка пикселя: // Возвращаемое значение: отсутствует. +void iarduino_OLED::drawPixel(int x, int y, bool c){ // Параметры: № колонки, № строки, цвет. + _drawPixel(x,y,c); // Прорисовываем пиксель в буфере. + if(flgUpdate){_sendBuffer();} // Если установлен флаг flgUpdate, то отправляем массив arrBuffer на дисплей. + numX=x; numY=y; // Сохраняем координаты. +} // + // +// Получение цвета пикселя: // Возвращаемое значение: цвет (0-чёрный, 1-белый) +bool iarduino_OLED::getPixel(int x, int y){ // Параметры: № колонки, № строки. + if(x<0 || x>127 || y<0 || y>63){return 0;} // Если заданы некорректные координаты, то выводим 0 (чёрный цвет пикселя). + uint16_t numByte = ( y/8 * 128 ) + x; // Определяем номер байта массива arrBuffer в котором находится пиксель. + uint8_t numBit = y%8; // Определяем номер бита в найденном байте, который соответсвует искомому пикселю. + return bitRead(arrBuffer[numByte], numBit); // Возвращаем цвет пикселя из бита numBit элемента numByte массива arrBuffer. +} // + // +// Прорисовка линии по двум точкам: // Возвращаемое значение: отсутствует. +void iarduino_OLED::drawLine(int x1, int y1, int x2, int y2, bool c){ // Параметры: № колонки начала, № строки начала, № колонки окончания, № строки окончания, цвет. + _drawLine(x1,y1,x2,y2,c); // Прорисовываем линию в буфере. + if(flgUpdate){_sendBuffer();} // Если установлен флаг flgUpdate, то отправляем массив arrBuffer на дисплей. + numX=x2; numY=y2; // Сохраняем координаты. +} // + // +// Прорисовка линии по одной точке: // Возвращаемое значение: отсутствует. +void iarduino_OLED::drawLine(int x2, int y2, bool c){ // Параметры: № колонки окончания, № строки окончания, цвет. + drawLine(numX,numY,x2,y2,c); // Прорисовываем линию по двум точкам. +} // + // +// Прорисовка прямоугольника по двум точкам: // Возвращаемое значение: отсутствует. +void iarduino_OLED::drawRect(int x1, int y1, int x2, int y2, bool f, bool c){ // Параметры: № колонки начала, № строки начала, № колонки окончания, № строки окончания, закрасить, цвет. + if(f){ // Если прямоугольник требуется закрасить, то ... + if(x1=x2; x--){_drawLine(x,y1,x,y2,c);}} // Рисуем несколко линий. + }else{ // Иначе, если прямоугольник закрашивать не надо, то ... + _drawLine(x1,y1,x2,y1,c); // Прорисовываем линию. + _drawLine(x2,y2,x2,y1,c); // Прорисовываем линию. + _drawLine(x2,y2,x1,y2,c); // Прорисовываем линию. + _drawLine(x1,y1,x1,y2,c); // Прорисовываем линию. + } // + if(flgUpdate){_sendBuffer();} // Если установлен флаг flgUpdate, то отправляем массив arrBuffer на дисплей. + numX=x2; numY=y2; // Сохраняем координаты. +} // + // +// Прорисовка круга: // Возвращаемое значение: отсутствует. +void iarduino_OLED::drawCircle(int x, int y, uint8_t r, bool f, bool c){ // Параметры: № колонки, № строки, радиус, закрасить, цвет + int x1=0, y1=r, p=1-r; // Определяем переменные: x1,y1 - положительные координаты точек круга с центром 00. p - отрицательная парабола. + while(x1 < y1+1){ // Цикл будет выполняться пока координата x не станет чуть меньше y (прочертит дугу от 0 до 45°) - это 1/8 часть круга + if(f){ // Если круг требуется закрасить, то ... + _drawLine(x-x1,y-y1,x+x1,y-y1,c); // Прорисовываем горизонтальные линии вверху круга (между точками 3 и 1 дуг, см. ниже). + _drawLine(x-x1,y+y1,x+x1,y+y1,c); // Прорисовываем горизонтальные линии внизу круга (между точками 4 и 2 дуг, см. ниже). + _drawLine(x-y1,y-x1,x+y1,y-x1,c); // Прорисовываем горизонтальные линии выше середины круга (между точками 7 и 5 дуг, см. ниже). + _drawLine(x-y1,y+x1,x+y1,y+x1,c); // Прорисовываем горизонтальные линии выше середины круга (между точками 8 и 6 дуг, см. ниже). + }else{ // Иначе, если круг закрашивать не надо, то ... + _drawPixel(x+x1, y-y1, c); // 1 дуга 0° - 45° (построенная в соответствии с уравнением) + _drawPixel(x+x1, y+y1, c); // 2 дуга 180° - 135° (1 дуга отражённая по вертикали) + _drawPixel(x-x1, y-y1, c); // 3 дуга 360° - 315° (1 дуга отражённая по горизонтали) + _drawPixel(x-x1, y+y1, c); // 4 дуга 180° - 225° (2 дуга отражённая по горизонтали) + _drawPixel(x+y1, y-x1, c); // 5 дуга 90° - 45° (2 дуга повёрнутая на -90°) + _drawPixel(x+y1, y+x1, c); // 6 дуга 90° - 135° (1 дуга повёрнутая на +90°) + _drawPixel(x-y1, y-x1, c); // 7 дуга 270° - 315° (1 дуга повёрнутая на -90°) + _drawPixel(x-y1, y+x1, c); // 8 дуга 270° - 225° (2 дуга повёрнутая на +90°) + } if(p>=0){y1--; p-=y1*2;} // Если парабола p вышла в положительный диапазон, то сдвигаем её вниз на y1*2 (каждый такой сдвиг провоцирет смещение точки y1 первой дуги вниз). + p++; x1++; p+=x1*2; // С каждым проходом цикла, смещаем точку x1 первой дуги влево и находим новую координату параболы p. + } // + if(flgUpdate){_sendBuffer();} // Если установлен флаг flgUpdate, то отправляем массив arrBuffer на дисплей. + numX=x; numY=y; // Сохраняем координаты. +} // + // +// Прорисовка изображения: // Возвращаемое значение: отсутствует. +void iarduino_OLED::drawImage(uint8_t* image, int x, int y, uint8_t mem){ // Параметры: изображение, № колонки, № строки, тип памяти. + uint8_t w = getImageWidth(image, mem); // Получаем ширину изображения. + uint8_t h = getImageHeight(image, mem); // Получаем высоту изображения. + bool c; // Объявляем переменную для хранения цвета + switch(x){ // Колонка с которой требуется начать вывод изображения ... + case OLED_L: numX=0; break; // Определяем начальную колонку для выравнивания по левому краю. + case OLED_C: numX=(128-w)/2; break; // Определяем начальную колонку для выравнивания по центру. + case OLED_R: numX= 128-w; break; // Определяем начальную колонку для выравнивания по правому краю. + case OLED_N: numX=numX; break; // Начальной колонкой останется та, на которой был закончен вывод предыдущего текста или изображения. + default : numX=x; break; // Начальная колонка определена пользователем. + } // + switch(y){ // Строка с которой требуется начать вывод изображения ... + case OLED_T: numY=h-1; break; // Определяем начальную строку для выравнивания по верхнему краю. + case OLED_C: numY=(64-h)/2+h; break; // Определяем начальную строку для выравнивания по центру. + case OLED_B: numY=63; break; // Определяем начальную строку для выравнивания по нижнему краю. + case OLED_N: numY=numY; break; // Начальной строкой останется та, на которой выведен предыдущий текст или изображение. + default : numY=y; break; // Начальная строка определена пользователем. + } // + for (uint8_t p=0; p0){return;} // Если шрифт не выбран или его высота не кратна 8 пикселям, то выходим из функции. + uint16_t len=strlen(txt)*insFont.width; if(len>128){len=128/insFont.width*insFont.width;} // Определяем количество колонок которое занимают выводимые символы. + uint16_t num; // Объявляем переменную для хранения номера байта в массиве шрифта. + int x1, y1; // Объявляем переменные для хранения координат точек. + bool c; // Объявляем переменную для хранения цвета точек. + switch(x){ // Колонка с которой требуется начать вывод текста ... + case OLED_L: numX=0; break; // Определяем начальную колонку для выравнивания по левому краю. + case OLED_C: numX=(128-len)/2; break; // Определяем начальную колонку для выравнивания по центру. + case OLED_R: numX= 128-len; break; // Определяем начальную колонку для выравнивания по правому краю. + case OLED_N: numX=numX; break; // Начальной колонкой останется та, на которой был закончен вывод предыдущего текста или изображения. + default : numX=x; break; // Начальная колонка определена пользователем. + } // + switch(y){ // Строка с которой требуется начать вывод текста ... + case OLED_T: numY=insFont.height-1; break; // Определяем начальную строку для выравнивания по верхнему краю. + case OLED_C: numY=(64-insFont.height)/2+insFont.height; break; // Определяем начальную строку для выравнивания по центру. + case OLED_B: numY=63; break; // Определяем начальную строку для выравнивания по нижнему краю. + case OLED_N: numY=numY; break; // Начальной строкой останется та, на которой выведен предыдущий текст или изображение. + default : numY=y; break; // Начальная строка определена пользователем. + } // + if(numX+len>128){len=(128-numX)/insFont.width*insFont.width;} // Пересчитываем количество колонок которое занимают выводимые символы, с учётом начальной позиции. + for(int8_t p=0; p 0 &&numIn <0xFF ){ // Если код текущего символа строки StrIn больше 0 и № текушего символа строки StrIn меньше 255, то ... + if(charThis==0xD0&&charNext>=0x90&&charNext<=0xBF){StrOut[numOut]=charNext-0x10; numIn++;}else // Если код текущего символа равен 208, а за ним следует символ с кодом 144...191, значит это буква «А»...«п» требующая преобразования к коду 128...175 + if(charThis==0xD0&&charNext==0x81 ){StrOut[numOut]= 0xF0; numIn++;}else // Если код текущего символа равен 208, а за ним следует символ с кодом 129 , значит это буква «Ё» требующая преобразования к коду 240 + if(charThis==0xD1&&charNext>=0x80&&charNext<=0x8F){StrOut[numOut]=charNext+0x60; numIn++;}else // Если код текущего символа равен 209, а за ним следует символ с кодом 128...143, значит это буква «р»...«я» требующая преобразования к коду 224...239 + if(charThis==0xD1&&charNext==0x91 ){StrOut[numOut]= 0xF1; numIn++;}else // Если код текущего символа равен 209, а за ним следует символ с кодом 145 , значит это буква «ё» требующая преобразования к коду 241 + {StrOut[numOut]=charThis;} numIn++; // Иначе не меняем символ. + numOut++; charThis=StrIn[numIn]; charNext=StrIn[numIn+1]; // Переходим к следующему символу. + } StrOut[numOut]='\0'; // Добавляем символ конца строки и возвращаем строку StrOut. + break; // + // Преобразуем текст из кодировки WINDOWS-1251: // + case TXT_WIN1251: // + while (charThis> 0 &&numIn <0xFF){ // Если код текущего символа строки StrIn больше 0 и № текушего символа строки StrIn меньше 255, то ... + if(charThis>=0xC0&&charThis<=0xEF){StrOut[numOut]=charThis-0x40;}else // Если код текущего символа равен 192...239, значит это буква «А»...«п» требующая преобразования к коду 128...175 + if(charThis>=0xF0&&charThis<=0xFF){StrOut[numOut]=charThis-0x10;}else // Если код текущего символа равен 240...255, значит это буква «р»...«я» требующая преобразования к коду 224...239 + if(charThis==0xA8 ){StrOut[numOut]= 0xF0;}else // Если код текущего символа равен 168 , значит это буква «Ё» требующая преобразования к коду 240 + if(charThis==0xB8 ){StrOut[numOut]= 0xF1;}else // Если код текущего символа равен 184 , значит это буква «ё» требующая преобразования к коду 241 + {StrOut[numOut]=charThis;} // Иначе не меняем символ. + numIn++; numOut++; charThis=StrIn[numIn]; // Переходим к следующему символу. + } StrOut[numOut]='\0'; // Добавляем символ конца строки и возвращаем строку StrOut. + break; // + } return StrOut; // Возвращаем строку StrOut. +} // + // +// Прорисковка пикселя в буффере: // Возвращаемое значение: отсутствует. +void iarduino_OLED::_drawPixel(int x, int y, bool c){ // Параметры: x, y, цвет + if(x<0 || x>127 || y<0 || y>63){return;} // Если заданы некорректные координаты, то выходим из функции. + uint8_t p=y/8; // Определяем номер страницы в которой должен находиться пиксель + uint16_t numByte = ( p * 128 ) + x; // Определяем номер байта массива arrBuffer в котором требуется прорисовать пиксель. + uint8_t numBit = y%8; // Определяем номер бита в найденном байте, который соответсвует рисуемому пикселю. + if(c) {arrBuffer[numByte] |= 1<numPageP){numPageP=p;} // Обновляем номер последней страницы в которую требуется записать данные из буфера arrBuffer. + if(xnumCellP){numCellP=x;} // Обновляем номер последней ячейки в которую требуется записать данные из буфера arrBuffer. +} // + // +// Прорисковка линии в буффере: // Возвращаемое значение: отсутствует. +void iarduino_OLED::_drawLine(int x1, int y1, int x2, int y2, bool c){ // Параметры: x1, y1, x2, y2, цвет. + int x3 = x2-x1; // + int y3 = y2-y1; // + if(abs(x3)>abs(y3)) { if(x1=x2; x--){_drawPixel(x, ((x-x1)*y3/x3+y1), c);}}} // Первое условие определяет где больше расстояние (по оси x или y), по той оси о проходим в цикле, для поиска точек на другой оси + else { if(y1=y2; y--){_drawPixel(((y-y1)*x3/y3+x1), y, c);}}} // +} // + // +// Отправка байта команды: // Возвращаемое значение: отсутствует. +void iarduino_OLED::_sendCommand(uint8_t command){ // Параметр: код команды. + objI2C->writeByte(dispAddr, SSD1306_COMMAND, command); // Отправляем 3 байта: адрес dispAddr с битом rw=0 (запись), SSD1306_COMMAND, command. +} // + // +// Отправка указанного количества байтов данных: // Возвращаемое значение: отсутствует. +void iarduino_OLED::_sendData(uint8_t* data, uint8_t sum){ // Параметры: указатель на начало массива данных, количество передаваемых байт + if(objI2C->getType()==4){ + uint8_t i=0, j=0; + while(i24){j=24;} objI2C->writeBytes(dispAddr, SSD1306_DATA, &data[i],j); i+=24;} // Отправляем адрес dispAddr с битом rw=0 (запись), SSD1306_DATA и sum байт из массива data. + }else{ objI2C->writeBytes(dispAddr, SSD1306_DATA, data, sum);} // Отправляем адрес dispAddr с битом rw=0 (запись), SSD1306_DATA и sum байт из массива data. +} // + // +// Отправка буфера (массива arrBuffer) в дисплей: // Возвращаемое значение: отсутствует. +void iarduino_OLED::_sendBuffer(void){ // Параметр: отсутствует. + for(uint8_t p=numPageS; p<=numPageP; p++){ // Проходим по страницам экрана, от numPageS до numPageP включительно. + _sendCommand(SSD1306_ADDR_PAGE); // Установка адреса страницы. + _sendCommand(p); // Начало. + _sendCommand(p); // Конец. + _sendCommand(SSD1306_ADDR_COLUMN); // Установка адреса колонки. + _sendCommand(numCellS); // Начало. + _sendCommand(numCellP); // Конец. + _sendData(&arrBuffer[(p*128+numCellS)], (numCellP-numCellS+1)); // Заполняем все колонки очередной страницы. + } // + numPageS=numPageP=0; // Указываем что при записи буфера arrBuffer в дисплей, нужно заполнить строки с 0 по 0. + numCellS=numCellP=0; // Указываем что при записи буфера arrBuffer в дисплей, нужно заполнить ячейки с 0 по 0. +} // \ No newline at end of file diff --git a/libraries/iarduino_OLED/src/iarduino_OLED.h b/libraries/iarduino_OLED/src/iarduino_OLED.h new file mode 100644 index 0000000..ea0be9f --- /dev/null +++ b/libraries/iarduino_OLED/src/iarduino_OLED.h @@ -0,0 +1,167 @@ +// Библиотека для вывода текста на OLED дисплеи: http://iarduino.ru/shop/Displei/ekran-0-96-128x64-oled-i2c-belyy.html +// Версия: 1.0.0 +// Последнюю версию библиотеки Вы можете скачать по ссылке: http://iarduino.ru +// Для вывода текста и графики воспользуйтесь библиотекой: http://iarduino.ru +// Подробное описание функции бибилиотеки доступно по ссылке: http://wiki.iarduino.ru +// Библиотека является собственностью интернет магазина iarduino.ru и может свободно использоваться и распространяться! +// При публикации устройств или скетчей с использованием данной библиотеки, как целиком, так и её частей, +// в том числе и в некоммерческих целях, просим Вас опубликовать ссылку: http://iarduino.ru +// Автор библиотеки: Панькин Павел sajaem@narod.ru +// Если у Вас возникли технические вопросы, напишите нам: shop@iarduino.ru + // +#ifndef iarduino_OLED_h // +#define iarduino_OLED_h // + // +#if defined(ARDUINO) && (ARDUINO >= 100) // +#include // +#else // +#include // +#endif // + // +#include // Подключаем файл iarduino_OLED_I2C.h - для работы с шиной I2C (используя функции производного класса iarduino_I2C) + // +#define OLED_T 250 // Выравнивание по верхнему краю. +#define OLED_B 251 // Выравнивание по нижнему краю. +#define OLED_L 252 // Выравнивание по левому краю. +#define OLED_C 253 // Выравнивание по центру. +#define OLED_R 254 // Выравнивание по правому краю. +#define OLED_N 255 // Оставить текущее значение строки/столбца. +#define IMG_RAM 0 // Тип памяти в которой хранится массив изображения - ОЗУ +#define IMG_ROM 1 // Тип памяти в которой хранится массив изображения - ПЗУ +#define TXT_CP866 0 // Название кодировки в которой написан текст для функции print. +#define TXT_UTF8 1 // Название кодировки в которой написан текст для функции print. +#define TXT_WIN1251 2 // Название кодировки в которой написан текст для функции print. + // +#define SSD1306_ADDRESS 0x3C // Установка контрастности. За данной командой должен быть отправлен байт контрастности от 00 до FF (по умолчанию 7F=127). +// Базовые команды: // +#define SSD1306_SET_CONTRAST 0x81 // Установка контрастности. За данной командой должен быть отправлен байт контрастности от 00 до FF (по умолчанию 7F=127). +#define SSD1306_RAM_ON 0xA4 // Включить изображение. Разрешить отображать содержимое RAM памяти. +#define SSD1306_RAM_OFF 0xA5 // Выключить изображение. Запретить отображать содержимое RAM памяти. +#define SSD1306_INVERT_OFF 0xA6 // Активный бит данных = 1. Пиксель установленный в 1 будет светиться. +#define SSD1306_INVERT_ON 0xA7 // Активный бит данных = 1. Пиксель установленный в 1 будет выключен. +#define SSD1306_DISPLAY_OFF 0xAE // Выключить дисплей (спящий режим). +#define SSD1306_DISPLAY_ON 0xAF // Включить дисплей (нормальный режим). +#define SSD1306_NOP 0xE3 // Пустая команда (как NOP в Ассемблере). +// Команды прокрутки: // +#define SSD1306_SCROLL_HORIZONTAL_RIGHT 0x26 // Настройка непрерывной горизонтальной прокрутки вправо. За данной командой должны быть отправлены 6 байт настроек +#define SSD1306_SCROLL_HORIZONTAL_LEFT 0x27 // Настройка непрерывной горизонтальной прокрутки влево. За данной командой должны быть отправлены 6 байт настроек +#define SSD1306_SCROLL_DIAGONAL_RIGHT 0x29 // Настройка непрерывной диагональной прокрутки вправо. За данной командой должны быть отправлены 5 байт настроек +#define SSD1306_SCROLL_DIAGONAL_LEFT 0x2A // Настройка непрерывной диагональной прокрутки влево. За данной командой должны быть отправлены 5 байт настроек +#define SSD1306_SCROLL_OFF 0x2E // Включить прокрутку. +#define SSD1306_SCROLL_ON 0x2F // Выключить прокрутку. +#define SSD1306_SCROLL_VERTICAL 0xA3 // Настройка непрерывной вертикальной прокрутки. За данной командой должны быть отправлены 2 байта настроек +// Команды адресации: // +#define SSD1306_ADDR_COLUMN_LBS 0x00 // Установка младшей части адреса колонки на странице. У данной команды младщие 4 бита должны быть изменены на младшие биты адреса. Комадна предназначена только для режима страничной адресации. +#define SSD1306_ADDR_COLUMN_MBS 0x10 // Установка старшей части адреса колонки на странице. У данной команды младщие 4 бита должны быть изменены на старшие биты адреса. Комадна предназначена только для режима страничной адресации. +#define SSD1306_ADDR_MODE 0x20 // Выбор режима адресации. За данной командой должен быть отправлен байт младшие биты которого определяют режим: 00-горизонтальная (с переходом на новую страницу (строку)) / 01-вертикальная (с переходом на новую колонку) / 10-страничная (только по выбранной странице). +#define SSD1306_ADDR_COLUMN 0x21 // Установка адреса колонки. За данной командой должны быть отправлены 2 байта: начальный адрес, конечный адрес. Так можно определить размер экрана в колонках по ширине. +#define SSD1306_ADDR_PAGE 0x22 // Установка адреса страницы. За данной командой должны быть отправлены 2 байта: начальный адрес, конечный адрес. Так можно определить размер экрана в строках по высоте. +#define SSD1306_ADDR_ONE_PAGE 0xB0 // Установка номера страницы которая будет выбрана для режима страничной адресации. У данной команды младщие 3 бита должны быть изменены на номер страницы. Комадна предназначена только для режима страничной адресации. +// Команды аппаратной настройки: // +#define SSD1306_SET_START_LINE 0x40 // Установить начальный адрес ОЗУ (смещение памяти). У данной команды младщие 6 битов должны быть изменены на начальный адрес ОЗУ. +#define SSD1306_SET_REMAP_R_TO_L 0xA0 // Установить режим строчной развёртки справа-налево +#define SSD1306_SET_REMAP_L_TO_R 0xA1 // Установить режим строчной развёртки слева-направо +#define SSD1306_SET_MULTIPLEX_RATIO 0xA8 // Установить multiplex ratio (количество используемых выводов COM для вывода данных на дисплей). За данной командой должны быть отправлен 1 байт с указанием количества COM выводов (от 15 до 63). +#define SSD1306_SET_REMAP_D_TO_T 0xC0 // Установить режим кадровой развёртки снизу-верх +#define SSD1306_SET_REMAP_T_TO_D 0xC8 // Установить режим кадровой развёртки сверху-вниз +#define SSD1306_SET_DISPLAY_OFFSET 0xD3 // Установить смещение дисплея. За данной командой должны быть отправлен 1 байт с указанием вертикального сдвига чтения выходов COM (от 0 до 63). +#define SSD1306_SET_COM_PINS 0xDA // Установить тип аппаратной конфигурации COM выводов. За данной командой должны быть отправлен 1 байт, у которого 4-ый бит: 0-последовательная / 1-альтернативная, 5-ой бит: 0-отключить COM Left/Right remap / 1-включить COM Left/Right remap. +// Команды тайминга и схемы управления: // +#define SSD1306_SET_DISPLAY_CLOCK 0xD5 // Установить частоту обновления дисплея. За данной командой должны быть отправлен 1 байт, старшие 4 бита которого определяют частоту, а младшие делитель. +#define SSD1306_SET_PRECHARGE_PERIOD 0xD9 // Установить Фазы DC/DC преобразователя. За данной командой должны быть отправлен 1 байт, старшие 4 бита которого определяют период, а младшие период. +#define SSD1306_SET_VCOM_DESELECT 0xDB // Установить VcomH (влияет на яркость). За данной командой должны быть отправлен 1 байт, старшие 4 бита которого определяют напряжение (пример: 0000 - VcomH=0.65Vcc, 0010 - VcomH=0.77Vcc, 0011 - VcomH=0.83Vcc и т.д.). +#define SSD1306_CHARGE_DCDC_PUMP 0x8D // Управление DC/DC преобразователем. За данной командой должны быть отправлен 1 байт: 0x10 - отключить (VCC подается извне), 0x14 - запустить внутренний DC/DC. +// Статусный регистр: // +// -X------ // Доступен для чтения и содержит только 1 значащий бит X: 1-выкл / 0-вкл дисплей +// Контрольный байт: // Байт который следует после отправки байта адреса дисплея, до байта команды или данных. Другими словами это байт который мы отправляем вместо адреса регистра, при работе с другими модулями на шине I2C. +#define SSD1306_SHIFT_DC 0x06 // Положение бита DC в командном байте. Этот бит указывает что следующим байтом будет: 0-команда, 1-данные. +#define SSD1306_SHIFT_CO 0x07 // Положение бита Co в командном байте. Этот бит указывает что после следующего байта (команды или данных) будет следовать (если будет): 0-байт данных, 1-новый командный байт. + // +#define SSD1306_COMMAND (0< 0x00 Контрольный байт после которого следует байт команды +#define SSD1306_DATA (0< 0x40 Контрольный байт после которого следует байт данных + // +class iarduino_OLED{ // + public: // + /** Конструктор класса **/ // + iarduino_OLED (uint8_t address=0x3C){ // Конструктор класса (Параметр: адрес дисплея на шине I2C) + if(address==0x78){ address=0x3C;} // Корректируем адрес введённый с учётом бита RW. + if(address==0x7A){ address=0x3D;} // Корректируем адрес введённый с учётом бита RW. + dispAddr = address; // Сохраняем переданный адрес дисплея + objI2C = new iarduino_I2C; // Переопределяем указатель objI2C на объект производного класса iarduino_I2C + } // + /** Пользовательские функции **/ // + void begin (void ); // Объявляем функцию инициализации дисплея (Параметр: отсутствует) + void clrScr (bool=false ); // Объявляем функцию очистки дисплея (Параметр: флаг закрашивания экрана в белый цвет) + void fillScr (bool i=true ){ clrScr(i); } // Определяем функцию заливки дисплея (Параметр: флаг закрашивания экрана в белый цвет) + void invScr (bool=true ); // Объявляем функцию инвертирования цвета дисплея (Параметр: флаг инвертирования - да/нет) + void invText (bool i=true ){ insFont.inverted=i; } // Определяем функцию инвертирования цвета текста (Параметр: флаг инвертирования - да/нет) + void bgText (bool i=true ){ insFont.background=i; } // Определяем функцию определяющую наличие фона у текста (Параметр: флаг наличия фона - да/нет) + void bgImage (bool i=true ){ flgImgBG=i; } // Определяем функцию определяющую наличие фона у картинок (Параметр: флаг наличия фона - да/нет) + void setFont (uint8_t* ); // Объявляем функцию выбора шрифта для вывода текста (Параметр: название шрифта) + uint8_t getFontWidth (void ){ return insFont.width; } // Определяем функцию возвращающую ширину символов шрифта (Параметр: отсутствует) + uint8_t getFontHeight (void ){ return insFont.height; } // Определяем функцию возвращающую высоту символов шрифта (Параметр: отсутствует) + void setCoding (uint8_t i=false){ codingName=i; } // Определяем функцию указывающую тип кодировки для print (Параметры: название кодировки текста для функции print) + void setCursor ( int=OLED_N, int=OLED_N ); // Объявляем функцию установки курсора (Параметры: № колонки, № строки) + void setCursorShift ( int x=0 , int y=0 ){ numX+=x;numY+=y; } // Определяем функцию сдвига курсора (Параметры: № колонки, № строки) + void print (char* , int=OLED_N, int=OLED_N ); // Объявляем функцию вывода текста (Параметры: текст, № колонки, № строки) + void print (const char* , int=OLED_N, int=OLED_N ); // Объявляем функцию вывода текста (Параметры: текст, № колонки, № строки) + void print (String , int=OLED_N, int=OLED_N ); // Объявляем функцию вывода текста (Параметры: текст, № колонки, № строки) + void print (int8_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (uint8_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (int16_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (uint16_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (int32_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (uint32_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (double , int=OLED_N, int=OLED_N, uint8_t=2 ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, количество знаков после запятой) + void drawImage (uint8_t* , int=OLED_N, int=OLED_N, uint8_t=IMG_ROM ); // Объявляем функцию прорисовки изображения (Параметры: изображение, № колонки, № строки, тип памяти) + uint8_t getImageWidth (uint8_t* , uint8_t=IMG_ROM ); // Объявляем функцию возвращающую ширину изображения (Параметры: изображение, тип памяти) + uint8_t getImageHeight (uint8_t* , uint8_t=IMG_ROM ); // Объявляем функцию возвращающую высоту изображения (Параметры: изображение, тип памяти) + void drawPixel ( int, int, bool=1 ); // Объявляем функцию прорисовки пикселя (Параметры: № колонки, № строки, цвет) + bool getPixel ( int, int ); // Объявляем функцию возвращающую цвет пикселя (Параметры: № колонки, № строки) + void drawLine ( int, int, int, int, bool=1 ); // Объявляем функцию прорисовки линии по двум точкам (Параметры: № колонки начала, № строки начала, № колонки окончания, № строки окончания, цвет) + void drawLine ( int, int, bool=1 ); // Объявляем функцию прорисовки линии по одной точке (Параметры: № колонки окончания, № строки окончания, цвет) + void drawRect ( int, int, int, int, bool=0, bool=1 ); // Объявляем функцию прорисовки прямоугольника (Параметры: № колонки начала, № строки начала, № колонки окончания, № строки окончания, закрасить, цвет) + void drawCircle ( int, int, uint8_t, bool=0, bool=1 ); // Объявляем функцию прорисовки круга (Параметры: № колонки, № строки, радиус, закрасить, цвет) + void autoUpdate (bool i ){ flgUpdate=i; } // Определяем функцию автоматического вывода изображения (Параметр: флаг разрашающий автоматический вывод прорисованного изображения на дисплей) + void update (void ){ _sendBuffer(); } // Определяем функцию вывода прорисованного изображения (Параметр: отсутствует) + // + /** Переменные доступные для пользователя **/ // + int numX; // Объявляем переменную для хранения № колонки начиная с которой должен выводиться текст + int numY; // Объявляем переменную для хранения № строки на которой должен выводиться текст + // + private: // + /** Внутренние переменные **/ // + uint8_t dispAddr; // Объявляем переменную для хранения адреса дисплея на шине I2C. + uint8_t codingName = TXT_UTF8; // Определяем переменную для хранения текущей кодировки. + uint8_t arrBuffer [1024]; // Объявляем массив хранящий копию изображения экрана. + bool flgUpdate = true; // Определяем флаг разрешающий автоматический вывод прорисованного изображения на дисплей (устанавливается/сбрасывается функцией autoUpdate). + bool flgImgBG = true; // Определяем флаг указывающий на то, что у изображений есть фон. + uint8_t numPageS = 0; // Определяем номер младшей страницы, значения которой требуется обновить из буфера arrBuffer. + uint8_t numPageP = 0; // Определяем номер старшей страницы, значения которой требуется обновить из буфера arrBuffer. + uint8_t numCellS = 0; // Определяем номер младшей ячейки, значения которой требуется обновить из буфера arrBuffer. + uint8_t numCellP = 0; // Определяем номер старшей ячейки, значения которой требуется обновить из буфера arrBuffer. + iarduino_I2C_BASE* objI2C; // Объявляем указатель на объект полиморфного класса iarduino_I2C_BASE, но в конструкторе данного класса этому указателю будет присвоена ссылка на производный класс iarduino_I2C. + struct{ // Определяем структуру параметров используемого шрифта: + uint8_t* font; // - указатель на первый байт массива шрифта. + uint8_t width = 0; // - ширина каждого символа шрифта (в пикселях). + uint8_t height = 0; // - высота каждого символа шрифта (в пикселях). + uint8_t firstSymbol = 0; // - код ASCII первого символа в массиве шрифта (шрифт может состоять, например, только цифр, значит первый символ шрифта, это "0", его код = 48). + uint8_t sumSymbol = 0; // - количество символов имеющихся в используемом в шрифте (если шрифт состоит только из цифр, то количество симолов шрифта равно 10). + bool inverted = false; // - флаг указывающий на необходимость вывода шрифта с инвертированием его цвета. Флаг устанавливается/сбрасывается функцией invText(). + bool background = true; // - флаг указывающий на то, что у шрифта есть фон. + bool setFont = false; // - флаг указывающий на то, что шрифт выбран. + uint8_t startSpace [3]; // - начальная позиция пустых интервалов в массиве символов. + uint8_t sumSpace [3]; // - количество отсутсвующих символов (ширина пустых интервалов). + } insFont; // Имя структуры. + /** Внутренние функции **/ // + void _print (char*, int=255, int=255); // Объявляем функцию вывода текста (Параметры: текст, № строки, № колонки) + char* _codingCP866 (char*); // Объявляем функцию преобразования кодировки в CP866 (Параметр: строка в кодировке UTF-8) + char _ItoAa (uint8_t); // Объявляем функцию преобразования одной цифры в символ (Параметр: цифра от 0 до 15) + void _drawPixel (int, int, bool=1); // Объявляем функцию прорисковки одного пикселя в буффере (Параметры: x, y, цвет) + void _drawLine (int, int, int, int, bool=1); // Объявляем функцию прорисковки линии в буффере (Параметры: x1, y1, x2, y2, цвет) + void _sendCommand (uint8_t); // Объявляем функцию отправки байта команды (Параметр: код команды) + void _sendData (uint8_t*, uint8_t); // Объявляем функцию отправки байта данных (Параметры: указатель на начало массива данных, количество передаваемых байт) + void _sendBuffer (void); // Объявляем функцию отправки буфера в дисплей (Параметр: отсутствует) +}; // + // +#endif // diff --git a/libraries/iarduino_OLED/src/iarduino_OLED_I2C.h b/libraries/iarduino_OLED/src/iarduino_OLED_I2C.h new file mode 100644 index 0000000..0d7d02c --- /dev/null +++ b/libraries/iarduino_OLED/src/iarduino_OLED_I2C.h @@ -0,0 +1,456 @@ +#ifndef iarduino_I2C_h // Разрешаем включить данный код в скетч, только если он не был включён ранее +#define iarduino_I2C_h // Запрещаем повторное включение данного кода в скетч + // +// Определяем тип реализации шины I2C: // + #define iarduino_I2C_SW // Объявляем константу iarduino_I2C_SW - Возможна программная реализация шины I2C. +#if (!defined(pin_SW_SDA) || !defined(pin_SW_SCL)) // Если выводы не определены пользователем, то ... + #undef iarduino_I2C_SW // Отменяем объявление константы iarduino_I2C_SW - Программная реализация шины I2C не возможна (так как выводы не указаны). + #if defined(TwoWire_h) // Проверяем не подключена ли библиотека Wire. + #define pin_SW_SDA 255 // № вывода SDA не определён + #define pin_SW_SCL 255 // № вывода SCL не определён + #define iarduino_I2C_TW // Объявляем константу iarduino_I2C_TW - Будет использована аппаратная реализация шины I2C под управлением библиотеки Wire. + #elif (defined(SDA) && defined(SCL)) // Определяем выводы для шины I2C + #define pin_SW_SDA SDA // № вывода SDA = SDA + #define pin_SW_SCL SCL // № вывода SCL = SCL + #define iarduino_I2C_HW // Объявляем константу iarduino_I2C_HW - Будет использована аппаратная реализация шины I2C. + #elif (defined(PIN_WIRE_SDA) && defined(PIN_WIRE_SCL)) // Определяем выводы для шины I2C + #define pin_SW_SDA PIN_WIRE_SDA // № вывода SDA = PIN_WIRE_SDA + #define pin_SW_SCL PIN_WIRE_SCL // № вывода SCL = PIN_WIRE_SCL + #define iarduino_I2C_HW // Объявляем константу iarduino_I2C_HW - Будет использована аппаратная реализация шины I2C. + #elif (defined(SDA1) && defined(SCL1)) // Определяем выводы для шины I2C-1 + #define pin_SW_SDA SDA1 // № вывода SDA = SDA1 + #define pin_SW_SCL SCL1 // № вывода SCL = SCL1 + #define iarduino_I2C_HW_1 // Объявляем константу iarduino_I2C_HW_1 - Будет использована аппаратная реализация шины I2C-1. + #else // Если выводы определить не удалось, то ... + #define pin_SW_SDA 255 // № вывода SDA не определён - Аппаратная реализация шины I2C не возможна. + #define pin_SW_SCL 255 // № вывода SCL не определён - Аппаратная реализация шины I2C не возможна. + #endif // +#endif // + // +class iarduino_I2C_BASE{ // Определяем полиморфный класс + public: // Доступные методы и функции: +// ОСНОВНЫЕ ФУНКЦИИ: (поддерживаются библиотекой Wire) // + virtual void begin (uint32_t); // Объявляем функцию указания скорости шины I2C. Аргументы: скорость в кГц. + virtual uint8_t readByte (uint8_t, uint8_t ); // Объявляем функцию чтения байта данных из регистра модуля. Аргументы: адрес_модуля, адрес_регистра. (адрес регистра указывает модулю, данные какого регистра требуется отправить мастеру) + virtual bool writeByte (uint8_t, uint8_t, uint8_t); // Объявляем функцию записи байта данных в регистр модуля. Аргументы: адрес_модуля, адрес_регистра, байт_данных. (адрес регистра указывает модулю, в какой регистр требуется сохранить данные) + virtual uint8_t readByte (uint8_t ); // Объявляем функцию чтения байта данных из модуля. Аргументы: адрес_модуля (функция отличается тем, что она не отправляет модулю адрес регистра) + virtual bool writeByte (uint8_t, uint8_t); // Объявляем функцию записи байта данных в модуль. Аргументы: адрес_модуля, байт_данных. (функция отличается тем, что она не отправляет модулю адрес регистра) + virtual bool readBytes (uint8_t, uint8_t, uint8_t*, uint8_t); // Объявляем функцию чтения байтов данных из регистров модуля. Аргументы: адрес_модуля, адрес_первого_регистра, указатель_на_массив, количество_байт. (адрес первого регистра указывает модулю, с какого регистра требуется начать передачу данных мастеру) + virtual bool writeBytes (uint8_t, uint8_t, uint8_t*, uint8_t); // Объявляем функцию записи байтов данных в регистры модуля. Аргументы: адрес_модуля, адрес_первого_регистра, указатель_на_массив, количество_байт. (адрес первого регистра указывает модулю, начиная с какого регистра требуется сохранять данные) + virtual bool readBytes (uint8_t, uint8_t*, uint8_t); // Объявляем функцию чтения байтов данных из модуля. Аргументы: адрес_модуля, указатель_на_массив, количество_байт. (функция отличается тем, что она не отправляет модулю адрес первого регистра, а начинает цикл чтения сразу после отправки адреса модуля.) + virtual bool writeBytes (uint8_t, uint8_t*, uint8_t); // Объявляем функцию записи байтов данных в модуль. Аргументы: адрес_модуля, указатель_на_массив, количество_байт. (функция отличается тем, что после отправки адреса модуля она сразу начинает цикл отправки данных, без передачи адреса первого регистра.) +// ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ: (поддерживаются библиотекой Wire) // + virtual uint8_t getType (void); // Объявляем функцию получения типа реализации шины I2C. Аргументы: отсутствуют. + virtual bool checkAddress(uint8_t); // Объявляем функцию поиска модуля на шине I2C. Аргументы: адрес_модуля. +// ФУНКЦИИ НИЖНЕГО УРОВНЯ: (не поддерживаются библиотекой Wire) // + virtual bool start (void); // Объявляем функцию установки состояния START. Аргументы: отсутствуют. + virtual bool reStart (void); // Объявляем функцию установки состояния RESTART. Аргументы: отсутствуют. + virtual void stop (void); // Объявляем функцию установки состояния STOP. Аргументы: отсутствуют. + virtual bool sendID (uint8_t, bool); // Объявляем функцию передачи адреса модуля. Аргументы: ID-адрес модуля, бит RW (0-запись, 1-чтение). + virtual bool setByte (uint8_t); // Объявляем функцию передачи байта данных. Аргументы: байт для передачи. + virtual uint8_t getByte (bool); // Объявляем функцию получения байта данных. Аргументы: бит подтверждения ACK/NACK + private: // + virtual bool setSCL (bool); // Объявляем функцию установки уровня на линии SCL. Аргументы: логический уровень. + virtual void setSDA (bool); // Объявляем функцию установки уровня на линии SDA. Аргументы: логический уровень. + virtual bool getSDA (void); // Объявляем функцию чтения уровня с линии SDA. Аргументы: отсутствуют. +}; // + // +class iarduino_I2C: public iarduino_I2C_BASE{ // Определяем производный класс + public: // Доступные методы и функции: + // + /** ОСНОВНЫЕ ФУНКЦИИ: **/ // + // +// Функция подготовки шины I2C: // Определяем функцию подготовки шины I2C. + void begin(uint32_t speed){ // Аргумент: скорость шины в кГц. +// _ _ _ _______ _ _ _ // +// SCL: _?_?_/ OUTPUT // +// _ _ _ _ _____ _ _ _ // +// SDA: _?_?_ _/ OUTPUT // +// // + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + Wire.setClock(speed*1000L); // Устанавливаем скорость передачи данных по шине I2C. + Wire.begin(); // Инициируем работу на шине I2C в качестве мастера. + #elif defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + pinMode(pin_SDA, INPUT ); digitalWrite(pin_SDA, HIGH); // Определяем вывод pin_SDA как вход и подтягиваем его к Vcc. + pinMode(pin_SCL, INPUT ); digitalWrite(pin_SCL, HIGH); // Определяем вывод pin_SCL как вход и подтягиваем его к Vcc. + TWBR=((F_CPU/(speed*1000L))-16)/2; // Определяем значение регистра скорости связи TWBR: speed = F_CPU / (16 + 2 * TWBR * 4^TWPS). Значит TWBR = (F_CPU/speed - 16) / (2 * 4^TWPS), но так как биты предделителя TWPS мы далее сбросим в 0, то формула упростится до: TWBR = (F_CPU/speed - 16) / 2. Так как speed указана в кГц, а F_CPU в Гц, то умножаем speed на 1000. + if(TWBR<10){TWBR=10;} // Если значение регистра скорости TWBR стало меньше 10 (параметр speed > 400 кГ) то оставляем значение этого регистра равным 10 иначе шина будет работать нестабильно. + TWSR&=(~(_BV(TWPS1)|_BV(TWPS0))); // Определяем значение регистра статуса TWSR: оставляем все его биты не тронутыми, кроме двух битов предделитея TWPS сбрасывая их в 0. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + port_SDA = digitalPinToPort (pin_SDA); // Определяем номер порта для вывода pin_SDA. + port_SCL = digitalPinToPort (pin_SCL); // Определяем номер порта для вывода pin_SCL. + mask_SDA = digitalPinToBitMask (pin_SDA); // Определяем маску для вывода pin_SDA. в переменной mask_SDA будет установлен только тот бит который соответствует позиции бита управления выводом pin_SDA. + mask_SCL = digitalPinToBitMask (pin_SCL); // Определяем маску для вывода pin_SCL. в переменной mask_SCL будет установлен только тот бит который соответствует позиции бита управления выводом pin_SCL. + mod_SDA = portModeRegister (port_SDA); // Определяем указатель на адрес регистра конфигурации направления работы выводов порта port_SDA. + mod_SCL = portModeRegister (port_SCL); // Определяем указатель на адрес регистра конфигурации направления работы выводов порта port_SCL. + inp_SDA = portInputRegister (port_SDA); // Определяем указатель на адрес регистра входных значений для управления портом port_SDA. + inp_SCL = portInputRegister (port_SCL); // Определяем указатель на адрес регистра входных значений для управления портом port_SCL. + out_SDA = portOutputRegister (port_SDA); // Определяем указатель на адрес регистра выходных значений для управления портом port_SDA. + out_SCL = portOutputRegister (port_SCL); // Определяем указатель на адрес регистра выходных значений для управления портом port_SCL. + setSCL(1); // Переводим вывод SCL в режим входа с подтяжкой к Vcc + setSDA(1); // Переводим вывод SDA в режим входа с подтяжкой к Vcc + #endif // + } // + // +// Функция чтения одного байта из регистра модуля: // + uint8_t readByte(uint8_t adr, uint8_t reg){ // Определяем функцию чтения одного байта данных из регистра модуля (аргументы: адрес_модуля, адрес_регистра) + uint8_t i=0; readBytes(adr, reg, &i, 1); return i; // Объявляем переменную i и указываем её ссылку для получения 1 байта из регистра reg модуля с адресом adr + } // + // +// Функция чтения одного байта из модуля: // + uint8_t readByte(uint8_t adr){ // Определяем функцию чтения одного байта данных из регистра модуля (аргументы: адрес_модуля) + uint8_t i=0; readBytes(adr, &i, 1); return i; // Объявляем переменную i и указываем её ссылку для получения 1 байта из модуля с адресом adr + } // + // +// Функция записи одного байта в регистр модуля: // + bool writeByte(uint8_t adr, uint8_t reg, uint8_t data){ // Определяем функцию записи одного байта данных в регистр модуля (аргументы: адрес_модуля, адрес_регистра, байт_данных) + return writeBytes(adr, reg, &data, 1); // Запысываем 1 байт по ссылке на переменную data в регистр reg модуля с адресом adr + } // + // +// Функция записи одного байта в модуль: // + bool writeByte(uint8_t adr, uint8_t data){ // Определяем функцию записи одного байта данных в регистр модуля (аргументы: адрес_модуля, байт_данных) + return writeBytes(adr, &data, 1); // Запысываем 1 байт по ссылке на переменную data в модуль с адресом adr + } // + // +// Функция пакетного чтения нескольких байт данных из регистров модуля: // + bool readBytes(uint8_t adr, uint8_t reg, uint8_t *data, uint8_t sum){ // Определяем функцию пакетного чтения нескольких байт данных из регистров модуля (аргументы: адрес_модуля, адрес_первого_регистра, указатель_на_массив, количество_байт) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это ответ по умолчанию. + Wire.beginTransmission(adr); // Инициируем передачу данных по шине I2C к устройству с адресом adr и битом RW=0 => запись. При этом сама передача не начнётся. + Wire.write(reg); // Определяем значение первого байта (reg - адреса регистра) который будет отправлен после байта адреса. Функция write() поместит указанный байт в буфер для передачи. + Wire.endTransmission(false); // Выполняем инициированную ранее передачу данных (без установки состояния STOP). Функция endTransmission() возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка. + if(!Wire.requestFrom( adr, sum )) {return i;} // Читаем (запрашиваем) sum байт данных от устройства с адресом adr и битом RW=1 => чтение. Функция requestFrom() возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START данной функции будет расценено как RESTART. + while(Wire.available() && i0){ *data=getByte(sum>1); // Получаем по одному байту из очередного регистра за каждый проход цикла while. Прочитанный байт записываются по указателю data. Аргумент функции getByte имеет значение true на всех проходах цикла кроме последнего + data++; sum--; // Увеличиваем адрес указателя data, и уменьшаем сумму прочитанных байт sum. + #if defined(iarduino_I2C_HW) // Проверить корректность чтения каждого байта можно только на аппаратном уровне + if (sum) { if(TWSR&0xF8!=0x50) { i=0;}} // Если после чтения очередного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x50 значит произошла ошибка при чтении + else { if(TWSR&0xF8!=0x58) { i=0;}} // Если после чтения последного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x58 значит произошла ошибка при чтении + #endif // + }}}}}} stop (); return i==5; // Отправляем команду STOP и возвращаем результат успешности чтения + #endif // + } // + // +// Функция пакетного чтения нескольких байт данных из модуля: // + bool readBytes(uint8_t adr, uint8_t *data, uint8_t sum){ // Определяем функцию пакетного чтения нескольких байт данных из модуля (аргументы: адрес_модуля, указатель_на_массив, количество_байт) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это ответ по умолчанию. + if(!Wire.requestFrom( adr, sum )) {return i;} // Читаем (запрашиваем) sum байт данных от устройства с адресом adr и битом RW=1 => чтение. Функция requestFrom() возвращает количество реально принятых байтов. + while(Wire.available() && i0){ *data=getByte(sum>1); // Получаем по одному байту из очередного регистра за каждый проход цикла while. Прочитанный байт записываются по указателю data. Аргумент функции getByte имеет значение true на всех проходах цикла кроме последнего + data++; sum--; // Увеличиваем адрес указателя data, и уменьшаем сумму прочитанных байт sum. + #if defined(iarduino_I2C_HW) // Проверить корректность чтения каждого байта можно только на аппаратном уровне + if (sum) { if(TWSR&0xF8!=0x50) { i=0;}} // Если после чтения очередного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x50 значит произошла ошибка при чтении + else { if(TWSR&0xF8!=0x58) { i=0;}} // Если после чтения последного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x58 значит произошла ошибка при чтении + #endif // + }}} stop (); return i==2; // Отправляем команду STOP и возвращаем результат успешности чтения + #endif // + } // + // +// Функция пакетной записи нескольких байт данных в регистр модуля: // + bool writeBytes(uint8_t adr, uint8_t reg, uint8_t *data, uint8_t sum){ // Определяем функцию пакетной записи нескольких байт данных в регистры модуля (аргументы: адрес_модуля, адрес_первого_регистра, указатель_на_массив, количество_байт) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи + Wire.beginTransmission(adr); // Инициируем передачу данных по шине I2C к устройству с адресом adr и битом RW=0 => запись. При этом сама передача не начнётся. + Wire.write(reg); // Определяем значение первого байта (reg - адреса регистра) который будет отправлен после байта адреса. Функция write() поместит указанный байт в буфер для передачи. + Wire.write(data, sum); // Определяем значения следующих байт (data - массив данных) который будет отправлен после байта регистра. Функция write() поместит sum элементов массива data в буфер для передачи. + i = Wire.endTransmission(); return i==0; // Выполняем инициированную ранее передачу данных. Функция endTransmission() возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка. В качестве параметра функция endTransmission() может принимать флаг установки стсояния STOP - по умолчанию true. + #else // + // Если шина управляется функциями нижнего уровня данного класса: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи + if ( start () ) { i=1; // Если на шине I2C установилось состояние START, то ... + if ( sendID (adr,0) ) { i=2; // Если модуль ответил ACK на получение адреса устройства adr с битом RW=0 (запись), то ... + if ( setByte (reg) ) { i=3; // Если модуль ответил ACK на получение адреса регистра reg, то ... + while(sum>0){if(!setByte(*data )) { i=0;} // Передаём один байт из массива по указателю data в очередной регистр за каждый проход цикла while. Увеличиваем адрес указателя data, и уменьшаем сумму переданных байт sum. + data++; sum--; // Увеличиваем адрес указателя data, и уменьшаем сумму переданных байт sum. + }}}} stop (); return i==3; // Отправляем команду STOP и возвращаем результат записи. + #endif // + } // + // +// Функция пакетной записи нескольких байт данных в модуль: // + bool writeBytes(uint8_t adr, uint8_t *data, uint8_t sum){ // Определяем функцию пакетной записи нескольких байт данных в модуль (аргументы: адрес_модуля, указатель_на_массив, количество_байт) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи + Wire.beginTransmission(adr); // Инициируем передачу данных по шине I2C к устройству с адресом adr и битом RW=0 => запись. При этом сама передача не начнётся. + Wire.write(data, sum); // Указываем массив данных который будет отправлен после байта адреса. Функция write() поместит sum элементов массива data в буфер для передачи. + i = Wire.endTransmission(); return i==0; // Выполняем инициированную ранее передачу данных. Функция endTransmission() возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка. В качестве параметра функция endTransmission() может принимать флаг установки стсояния STOP - по умолчанию true. + #else // + // Если шина управляется функциями нижнего уровня данного класса: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи + if ( start () ) { i=1; // Если на шине I2C установилось состояние START, то ... + if ( sendID (adr,0) ) { i=2; // Если модуль ответил ACK на получение адреса устройства adr с битом RW=0 (запись), то ... + while(sum>0){if(!setByte(*data )) { i=0;} // Передаём один байт из массива по указателю data в очередной регистр за каждый проход цикла while. Увеличиваем адрес указателя data, и уменьшаем сумму переданных байт sum. + data++; sum--; // Увеличиваем адрес указателя data, и уменьшаем сумму переданных байт sum. + }}} stop (); return i==2; // Отправляем команду STOP и возвращаем результат записи. + #endif // + } // + // + /** ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ: **/ // + // +// Функция получения типа реализации шины I2C: // Определяем функцию получения типа шины Ш2С. + uint8_t getType(void){ // Аргументы: отсутсвуют. + #if defined(iarduino_I2C_TW) // + return 4; // Используется программная реализация шины I2C под управлением библиотеки Wire. + #elif defined(iarduino_I2C_HW) // + return 3; // Используется программная реализация шины I2C. + #elif defined(iarduino_I2C_HW_1) // + return 2; // Используется программная реализация шины I2C-1. + #elif defined(iarduino_I2C_SW) // + return 1; // Используется аппаратная реализация шины I2C. + #else // + return 0; // Тип реализации шины I2C не определён. + #endif // + } // + // +// Функция проверки наличия ведомого по его адресу: // + bool checkAddress(uint8_t adr){ // Определяем функцию записи одного байта данных в регистр модуля (аргументы: адрес_регистра, байт_данных) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат проверки. + Wire.beginTransmission(adr); // Инициируем передачу данных по шине I2C к устройству с адресом adr и битом RW=0 => запись. При этом сама передача не начнётся. + i=Wire.endTransmission(); return i==0; // Выполняем инициированную ранее передачу но без данных (отправится только START, байт адреса, STOP). Функция endTransmission() возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка. В качестве параметра функция endTransmission() может принимать флаг установки стсояния STOP - по умолчанию true. + #else // + // Если шина управляется функциями нижнего уровня данного класса: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи. + if ( start () ) { i=1; // Если на шине I2C установилось состояние START, то ... + if ( sendID (adr,0) ) { i=2; // Если модуль ответил ACK на получение адреса устройства adr с битом RW=0 (запись), то ... + }} stop (); return i==2; // Отправляем команду STOP и возвращаем результат записи. + #endif // + } // + // + /** ФУНКЦИИ НИЖНЕГО УРОВНЯ: **/ // + // +// Функция нижнего уровня - установка состояния START: // Определяем функцию установки состояния START. + bool start(void){ // Аргументы: отсутствуют. +// _ _ _ _____:___ _ _ _ // +// SCL: : \___ _ _ _ _ _/ // +// _ _ _ _____: _ _ _ _ _ _ // Спад логического уровня на линии SDA с «1» в «0», при наличии уровня логической «1» на линии SCL +// SDA: :\______ _ _/_ _ _ _ _ _ // +// // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания установки состояния start. + TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTA); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания), TWEN (бит разрешения работы шины), TWSTA (бит условия START). + while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов. + if((TWSR & 0xF8)==0x08){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x08, значит состояние START установилось на шине I2C. + return false; // Если предыдущая строка не вернула true, значит состояние START не установилось на шине I2C, возвращаем false. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + bool i= setSCL(1); // Устанавливаем «1» на линии SCL. Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSDA(0); // Устанавливаем «0» на линии SDA + setSCL(0); // Устанавливаем «0» на линии SCL + return i; // Если счетчик i не дошел до 0 при ожидании «1» на линии SCL, то вернётся true. + #else // + // Если тип шины I2C не поддерживается или не определён: // + return false; // Возвращаем false. + #endif // + } // + // +// Функция нижнего уровня - установка состояния RESTART: // Определяем функцию установки состояния RESTART. + bool reStart(void){ // Аргументы: отсутствуют. +// _ _ _ ___:___ _ _ _ // +// SCL: \_ _ _ _ / : \___ _ _ _ _ _/ // +// _ _ _ _ _ ________: _ _ _ _ _ _ // Спад логического уровня на линии SDA с «1» в «0», при наличии уровня логической «1» на линии SCL +// SDA: _ _ _ _ _/ :\______ _ _/_ _ _ _ _ _ // Сигнал рестрат аналогичен сигналу старт и отличается лишь тем, что ему не предшествует сигнал STOP +// // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания установки состояния RESTART. + TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTA); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания), TWEN (бит разрешения работы шины), TWSTA (бит условия START). + while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов. + if((TWSR & 0xF8)==0x10){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x10, значит состояние RESTART установилось на шине I2C. + return false; // Если предыдущая строка не вернула true, значит состояние RESTART не установилось на шине I2C, возвращаем false. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + return start(); // Программная реализация состояния RESTART идентична программной реализации состояния START. + #else // + // Если тип шины I2C не поддерживается или не определён: // + return false; // Возвращаем false. + #endif // + } // + // +// Функция нижнего уровня - установка состояния STOP: // Определяем функцию установки состояния STOP. + void stop(void){ // Аргументы: отсутствуют. +// _ _ _ ___:____ _ _ _ // +// SCL: \_ _ _ _/ : // +// _ _ _ _ _ :____ _ _ _ // Подъём логического уровня на линии SDA с «0» в «1», при наличии уровня логической «1» на линии SCL +// SDA: _ _ _ _ _\______/: // +// // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания установки состояния STOP + TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTO); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания), TWEN (бит разрешения работы шины), TWSTO (бит условия STOP). + while((!(TWCR & _BV(TWSTO))) && i){i--;} // Ждём сброса бита условия стоп TWSTO в регистре управления TWCR, но не дольше чем i циклов + // if((TWSR & 0xF8)==0xA0){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0xA0, значит состояние STOP установилось на шине I2C. + delayMicroseconds(20); // Данная функция не возвращает результат, но в любом случае делаем задержку меджу завершением текущего пакета и возможным началом следующего + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + setSDA(0); // Устанавливаем «0» на линии SDA + setSCL(1); // Устанавливаем «1» на линии SCL. Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSDA(1); // Устанавливаем «1» на линии SDA + #endif // + } // + // +// Функция нижнего уровня - передача первого байта АДРЕС+RW: // Определяем функцию передачи первого байта после cигнала START. Это байт адреса модуля с битом RW + bool sendID(uint8_t adr, bool rw){ // Аргументы: ID-адрес модуля, бит RW (0-запись, 1-чтение) +// 1 2 3 4 5 6 7 8 9 // +// SCL: _ _ _ _____/\_/\_/\_/\_/\_/\_/\_/\__/\_____ _ _ _ // +// ________________________ // Передача 7-битного адреса и 1 бита RW. На 9 тактирубщем импульсе модуль отвечает ACK («0» - «я сдесь»), или NACK («1» - «нет») +// SDA: _ _ _ ___/________ADDRESS_______RW>----____ _ _ _ // +// вход // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания получения подтверждения от ведомого ввиде бита ACK. + TWDR = (adr<<1)+rw; // Определяем значение регистра данных TWDR: записываем в него адрес adr сдвигая его на 1 бит влево, при этом младший бит (освободившийся) займёт бит RW (0-запись / 1-чтение) + TWCR = _BV(TWINT) | _BV(TWEN); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания) и TWEN (бит разрешения работы шины). + while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов + if((TWSR & 0xF8)==0x40 && rw){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x40, значит ведомый опознал свой адрес с битом RW=1 и отправил бит подтверждения ACK (в противном случае значение регистра TWSR будет равно 0x48). + if((TWSR & 0xF8)==0x18 && !rw){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x18, значит ведомый опознал свой адрес с битом RW=0 и отправил бит подтверждения ACK (в противном случае значение регистра TWSR будет равно 0x20). + return false; // Если предыдущая строка не вернула true, значит на шине нет ведомых у сказанным адресом, возвращаем false. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + bool i=true; // Определяем флаг возвращаемый данной функцией. + uint8_t j=7; // Определяем счётчик количества переданных бит адреса. + while(j){ j--; // Передаём 7 бит адреса adr в цикле + setSDA(adr & bit(j)); // Устанавливаем очередной бит адреса на линии SDA + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + } setSDA(rw); // Устанавливаем бит RW на линии SDA + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + setSDA(1); // Переводим вывод SDA в режим входа с подтяжкой к Vcc + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + if( getSDA( ) ) {i=false;} // Если на линии SDA установлена «1» значит ведомый ответил NACK + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + return i; // Если линия SCL была занята или модуль ответил NACK, то вернётся false. + #else // + // Если тип шины I2C не поддерживается или не определён: // + return false; // Возвращаем false + #endif // + } // + // +// Функция нижнего уровня - передача одного байта данных: // Определяем функцию передачи одного байта (в любом месте между байтом адреса с битом RW=0 и сигналом STOP). + bool setByte(uint8_t data){ // Аргумент: байт для передачи. +// 1 2 3 4 5 6 7 8 9 // +// SCL: _ _ _ _____/\_/\_/\_/\_/\_/\_/\_/\__/\_____ _ _ _ // +// ________________________ // Передача 1 байта, каждый бит читается модулем по фронту тактирубщих импульсов. На 9 тактирубщем импульсе модуль отвечает ACK («0» - «принял»), или NACK («1» - «нет») +// SDA: _ _ _ ___/__________DATA__________>----____ _ _ _ // +// вход // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания получения подтверждения от ведомого ввиде бита ACK. + TWDR = data; // Определяем значение регистра данных TWDR: записываем в него байт для передачи по шине I2C. + TWCR = _BV(TWINT) | _BV(TWEN); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания) и TWEN (бит разрешения работы шины). + while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов + if((TWSR & 0xF8)==0x28){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x28, значит ведомый отправил бит подтверждения приёма данных ACK (в противном случае значение регистра TWSR будет равно 0x30). + return false; // Если предыдущая строка не вернула true, значит ведомый не принял отправленный ему байт, возвращаем false. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + bool i=true; // Определяем флаг возвращаемый данной функцией. + uint8_t j=8; // Определяем счётчик количества переданных байт. + while(j){ j--; // Передаём 8 бит байта data в цикле + setSDA(data & bit(j)); // Устанавливаем очередной бит байта на линии SDA + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + } setSDA(1); // Переводим вывод SDA в режим входа с подтяжкой к Vcc + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + if( getSDA( ) ) {i=false;} // Если на линии SDA установлена «1» значит ведомый ответил NACK + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + return i; // Если счетчик i не дошел до 0 и не был сброшен в 0 при получении NACK, то вернётся true. + #else // + // Если тип шины I2C не поддерживается или не определён: // + return false; // Возвращаем false + #endif // + } // + // +// Функция нижнего уровня - получение одного байта данных: // Определяем функцию получения одного байта (в любом месте между байтом адреса с битом RW=1 и сигналом STOP). + uint8_t getByte(bool ack){ // Аргумент: бит подтверждения ACK/NACK +// 1 2 3 4 5 6 7 8 9 // +// SCL: _ _ _ _____/\_/\_/\_/\_/\_/\_/\_/\__/\_____ _ _ _ // +// __ // Получение 1 байта, каждый бит читается мастером по фронту тактирубщих импульсов. На 9 тактирубщем импульсе мастер отвечает ACK («0» - «давай еще»), или NACK («1» - «хватит») +// SDA: _ _ _ ___/----------DATA-----------<__\____ _ _ _ // +// вход выход // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания. + TWCR = _BV(TWINT) | _BV(TWEN) | ack< // Библиотека iarduino_OLED_txt будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED_txt. +iarduino_OLED_txt myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t MediumFontRus[]; // Подключаем шрифт MediumFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт MediumFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // + // +void loop(){ // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("iArduino"), 15, 4); // Выводим текст начиная с 15 столбца 4 строки (высота шрифта 2 строки, он займёт строки 3 и 4). + delay (500); // Ждём пол секунды. + myOLED.print(F("ABC"), 0, 1); // Выводим текст начиная с 0 столбца 1 строки (высота шрифта 2 строки, он займёт строки 0 и 1). + delay (500); // Ждём пол секунды. + myOLED.print(F("XYZ"), 92, 7); // Выводим текст начиная с 92 столбца 7 строки (высота шрифта 2 строки, он займёт строки 6 и 7). + delay (500); // Ждём пол секунды. + myOLED.print(F("abc"), 92, 1); // Выводим текст начиная с 92 столбца 1 строки (высота шрифта 2 строки, он займёт строки 0 и 1). + delay (500); // Ждём пол секунды. + myOLED.print(F("xyz"), 0, 7); // Выводим текст начиная с 0 столбца 7 строки (высота шрифта 2 строки, он займёт строки 6 и 7). + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("iАрдуино"), OLED_C, 4); // Выводим по центру 4 строки (высота шрифта 2 строки, он займёт строки 3 и 4). + delay (500); // Ждём пол секунды. + myOLED.print(F("АБВ"), OLED_L, 1); // Выводим по левому краю 1 строки (высота шрифта 2 строки, он займёт строки 0 и 1). + delay (500); // Ждём пол секунды. + myOLED.print(F("ЭЮЯ"), OLED_R, 7); // Выводим по правому краю 7 строки (высота шрифта 2 строки, он займёт строки 6 и 7). + delay (500); // Ждём пол секунды. + myOLED.print(F("абв"), OLED_R, 1); // Выводим по правому краю 1 строки (высота шрифта 2 строки, он займёт строки 0 и 1). + delay (500); // Ждём пол секунды. + myOLED.print(F("эюя"), OLED_L, 7); // Выводим по левому краю 7 строки (высота шрифта 2 строки, он займёт строки 6 и 7). + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print( 77, 0, 2 ); // Выводим число 77 начиная с 0 столбца 2 строки. + delay (500); // Ждём пол секунды. + myOLED.print( "+" ); // Выводим текст в той же строке сразу после предыдущего числа. + delay (500); // Ждём пол секунды. + myOLED.print( 77 ); // Выводим число 77 в той же строке сразу после предыдущего текста. + delay (500); // Ждём пол секунды. + myOLED.print( "=" ); // Выводим текст в той же строке сразу после предыдущего числа. + delay (500); // Ждём пол секунды. + myOLED.print( 77+77 ); // Выводим результат сложения чисел 77+77, в той же строке сразу после предыдущего текста. + delay (500); // Ждём пол секунды. + myOLED.print( 77, 0, 6, HEX ); // Выводим число 77 начиная с 0 столбца 6 строки, вывод осуществляется в 16-ричной системе. + delay (500); // Ждём пол секунды. + myOLED.print( "+" ); // Выводим текст в той же строке сразу после предыдущего числа. + delay (500); // Ждём пол секунды. + myOLED.print( 77, OLED_N, OLED_N, HEX ); // Выводим число 77 в той же строке сразу после предыдущего текста, вывод осуществляется в 16-ричной системе. + delay (500); // Ждём пол секунды. + myOLED.print( "=" ); // Выводим текст в той же строке сразу после предыдущего числа. + delay (500); // Ждём пол секунды. + myOLED.print( 77+77, OLED_N, OLED_N, HEX ); // Выводим результат сложения чисел 77+77, в той же строке сразу после предыдущего текста, вывод осуществляется в 16-ричной системе. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("{}[]()<>?!" ), OLED_C, 1); // Выводим текст по центру 1 строки (высота шрифта 2 строки, он займёт строки 0 и 1). + myOLED.print(F("#$%&*~`'\"^"), OLED_C, 4); // Выводим текст по центру 4 строки (высота шрифта 2 строки, он займёт строки 3 и 4). + myOLED.print(F("_-+=,.:;|/" ), OLED_C, 7); // Выводим текст по центру 7 строки (высота шрифта 2 строки, он займёт строки 6 и 7). + delay (5000); // Ждём 5 секунд. +} // diff --git a/libraries/iarduino_OLED_txt/examples/ShowNumber/ShowNumber.ino b/libraries/iarduino_OLED_txt/examples/ShowNumber/ShowNumber.ino new file mode 100644 index 0000000..a8203d9 --- /dev/null +++ b/libraries/iarduino_OLED_txt/examples/ShowNumber/ShowNumber.ino @@ -0,0 +1,31 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED_txt будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED_txt. +iarduino_OLED_txt myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт SmallFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. + // + myOLED.print( 123456789 , 0, 0); // Выводим целое положительное число начиная с 0 столбца 0 строки. + myOLED.print(-123456789 , 0, 1); // Выводим целое отрицательное число начиная с 0 столбца 1 строки. + myOLED.print( 123456789 , 0, 2, HEX); // Выводим целое положительное число начиная с 0 столбца 2 строки, в 16-ричной системе счисления. + myOLED.print( 123456789 , 0, 3, OCT); // Выводим целое положительное число начиная с 0 столбца 3 строки, в 8-ричной системе счисления. + myOLED.print(-123.456789, 0, 4); // Выводим число с плавающей точкой начиная с 0 столбца 4 строки, по умолчанию отобразится 2 знака после запятой. + myOLED.print( 123.456789, 0, 5, 3); // Выводим число с плавающей точкой начиная с 0 столбца 5 строки, указывая 3 знака после запятой. + myOLED.print( 123 , 0, 6, BIN); // Выводим целое положительное число начиная с 0 столбца 6 строки, в 2-ичной системе счисления. + myOLED.print( 123 , 0, 7, 12); // Выводим целое положительное число начиная с 0 столбца 7 строки, в 12-ричной системе счисления. +} // + // +void loop(){} // diff --git a/libraries/iarduino_OLED_txt/examples/ShowRus/ShowRus.ino b/libraries/iarduino_OLED_txt/examples/ShowRus/ShowRus.ino new file mode 100644 index 0000000..8836ce6 --- /dev/null +++ b/libraries/iarduino_OLED_txt/examples/ShowRus/ShowRus.ino @@ -0,0 +1,72 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED_txt будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED_txt. +iarduino_OLED_txt myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт SmallFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // + // +void loop(){ // + // +// Вывод текста в кодировке UTF-8: // + myOLED.clrScr(); // Чистим экран. + myOLED.print("UTF8", 0, 0); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.setCoding(TXT_UTF8); // Меняем кодировку на UTF-8 (по умолчанию). + myOLED.print("Ардуино iArduino", OLED_C, 4); // Выводим текст по центру 4 строки. + delay (5000); // Ждём 5 секунд. + // +// Вывод текста в кодировке CP866: // + myOLED.clrScr(); // Чистим экран. + myOLED.print("CP866", 0, 0); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.setCoding(TXT_CP866); // Меняем кодировку на CP866. + myOLED.print("Ардуино iArduino", OLED_C, 4); // Выводим текст по центру 4 строки. + delay (5000); // Ждём 5 секунд. + // +// Вывод текста в кодировке WINDOWS-1251: // + myOLED.clrScr(); // Чистим экран. + myOLED.print("WIN1251", 0, 0); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.setCoding(TXT_WIN1251); // Меняем кодировку на WINDOWS-1251. + myOLED.print("Ардуино iArduino", OLED_C, 4); // Выводим текст по центру 4 строки. + delay (5000); // Ждём 5 секунд. + // +// Вывод текста по коду символов: // + myOLED.clrScr(); // Чистим экран. + myOLED.print("CODE", 0, 0); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.setCoding(false); // Отменяем кодировку. + myOLED.print("\200\340\244\343\250\255\256 iArduino", OLED_C, 4); // Выводим текст кодами символов по центру 4 строки. + delay (5000); // Ждём 5 секунд. +} // + // +/* КОДЫ СИМВОЛОВ: // + * Латинские буквы A-Z и a-z // Вводятся как есть, вне зависимости от кодировки. + * Цифры 0-9 и символы !"#$%&'()*+,-./:;<=>?@[]^_`{|}~ // Вводятся как есть, вне зависимости от кодировки. + * Буквы АБВГДЕЖЗИЙКЛМНОП // Код: 128-143 в 10-тичной системе счисления. + * Буквы РСТУФХЦЧШЩЪЫЬЭЮЯ // Код: 144-159 в 10-тичной системе счисления. + * Буквы абвгдежзийклмноп // Код: 160-175 в 10-тичной системе счисления. + * Буквы рстуфхцчшщъыьэюя // Код: 224-239 в 10-тичной системе счисления. + * Буквы Ё,ё // Код: 240,241 в 10-тичной системе счисления. + * // + * Для вывода буквы нужно указать её код в 8-ричной системе счисления // + * которому должен предшествовать символ \ // + * // + * Пример вывода Русской буквы «А»: // + * - буква «А» имеет код 128. // Для перевода чисел из 10-тичной в 8-ричную систему можно воспользоваться стандартным калькулятором в windows. + * - 128 в 10-тичной системе равно числу 200 в 8-ричной системе. // Выберите вид калькулятора - «Программист» и введите число, Вы увидите его представление в разных системах счисления: HEX(16), DEC(10), OCT(8) и BIN(2). + * - Значит буква «А» записывается как \200 // Далее в примере следует буква «р» \340, «д» \244, «у» \343, «и» \250, «н» \255, «о» \256. + * // + * Запись текста кодами символов кажется более громоздкой, но // + * на самом деле, такая запись занимает в 2 раза меньше памяти! // + */ diff --git a/libraries/iarduino_OLED_txt/examples/ShowSmallFont/ShowSmallFont.ino b/libraries/iarduino_OLED_txt/examples/ShowSmallFont/ShowSmallFont.ino new file mode 100644 index 0000000..ab10004 --- /dev/null +++ b/libraries/iarduino_OLED_txt/examples/ShowSmallFont/ShowSmallFont.ino @@ -0,0 +1,69 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED_txt будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED_txt. +iarduino_OLED_txt myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт SmallFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // + // +void loop(){ // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Большие буквы:"), 0, 0); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.print(F("ABCDEFGHIJKLM"), OLED_C, 2); // Выводим текст по центру 2 строки. + myOLED.print(F("NOPQRSTUVWXYZ"), OLED_C, 3); // Выводим текст по центру 3 строки. + myOLED.print(F("АБВГДЕЁЖЗИЙКЛМНОП"), OLED_C, 5); // Выводим текст по центру 5 строки. + myOLED.print(F("РСТУФХЦЧШЩЪЫЬЭЮЯ"), OLED_C, 6); // Выводим текст по центру 6 строки. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Маленькие буквы:"), 0, 0); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.print(F("abcdefghijklm"), OLED_C, 2); // Выводим текст по центру 2 строки. + myOLED.print(F("nopqrstuvwxyz"), OLED_C, 3); // Выводим текст по центру 3 строки. + myOLED.print(F("абвгдеёжзийклмноп"), OLED_C, 5); // Выводим текст по центру 5 строки. + myOLED.print(F("рстуфхцчшщъыьэюя"), OLED_C, 6); // Выводим текст по центру 6 строки. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Цифры:"), 0, 0); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.print(F("012346789"), OLED_C, 2); // Выводим текст по центру 2 строки. + myOLED.print( 100, 0, 4 ); // Выводим число начиная с 0 столбца 4 строки. + myOLED.print( 100, 0, 5, HEX); myOLED.print("h"); // Выводим число начиная с 0 столбца 5 строки в 16-ричной системе и выводим текст в той же строке сразу после числа. + myOLED.print( 100, 0, 6, OCT); myOLED.print("o"); // Выводим число начиная с 0 столбца 6 строки в 8-ричной системе и выводим текст в той же строке сразу после числа. + myOLED.print( 100, 0, 7, BIN); myOLED.print("b"); // Выводим число начиная с 0 столбца 7 строки в 2-ичной системе и выводим текст в той же строке сразу после числа. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Символы:"), 0, 0); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.print(F("{}[]()<>?!#$%&*"), OLED_C, 3); // Выводим текст по центру 3 строки. + myOLED.print(F("~`'\"^_-+=,.:;|/"), OLED_C, 5); // Выводим текст по центру 5 строки. + delay (5000); // Ждём 5 секунд. + // + myOLED.clrScr(); // Чистим экран. + myOLED.print(F("Вычисления:"), 0, 0 ); delay(1000); // Выводим текст начиная с 0 столбца 0 строки. + myOLED.print( 2, 0, 3 ); delay(1000); // Выводим число 2 начиная с 0 столбца 3 строки. + myOLED.print( "+" ); delay(1000); // Выводим текст в той же строке сразу после предыдущего числа. + myOLED.print( 2 ); delay(1000); // Выводим число 2 в той же строке сразу после предыдущего текста. + myOLED.print( "=" ); delay(1000); // Выводим текст в той же строке сразу после предыдущего числа. + myOLED.print( 2+2 ); delay(1000); // Выводим результат сложения чисел 2+2, в той же строке сразу после предыдущего текста. + delay(1000); // Ждём 1 секунду. + myOLED.print( 2, 0, 5, 4); delay(1000); // Выводим число 2 начиная с 0 столбца 5 строки, вывод осуществляется в 4-ричной системе. + myOLED.print( "+" ); delay(1000); // Выводим текст в той же строке сразу после предыдущего числа. + myOLED.print( 2, OLED_N, OLED_N, 4); delay(1000); // Выводим число 2 в той же строке сразу после предыдущего текста, вывод осуществляется в 4-ричной системе. + myOLED.print( "=" ); delay(1000); // Выводим текст в той же строке сразу после предыдущего числа. + myOLED.print( 2+2, OLED_N, OLED_N, 4); delay(1000); // Выводим результат сложения чисел 2+2, в той же строке сразу после предыдущего текста, вывод осуществляется в 4-ричной системе. + myOLED.print( " в 4-ой системе" ); // Выводим текст в той же строке сразу после предыдущего результата. + delay (5000); // Ждём 5 секунд. +} // diff --git a/libraries/iarduino_OLED_txt/examples/ShowTextInvert/ShowTextInvert.ino b/libraries/iarduino_OLED_txt/examples/ShowTextInvert/ShowTextInvert.ino new file mode 100644 index 0000000..06067bd --- /dev/null +++ b/libraries/iarduino_OLED_txt/examples/ShowTextInvert/ShowTextInvert.ino @@ -0,0 +1,26 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED_txt будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED_txt. +iarduino_OLED_txt myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифт SmallFont, он займет меньше места в памяти программ. +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста. + myOLED.invText(); // Указываем что цвет текста выводимого после данной функции должен быть инвертирован. + myOLED.print("*** iarduino.ru ***", OLED_C, 3); // Выводим текст по центру 3 строки. Текст будет написан чёрными буквами на белом фоне. + myOLED.invText(false); // Указываем что цвет текста выводимого после данной функции не требуется инвертировать. + myOLED.print("*** iarduino.ru ***", OLED_C, 5); // Выводим текст по центру 5 строки. Текст будет написан белыми буквами на чёрном фоне. +} // + // +void loop(){} // diff --git a/libraries/iarduino_OLED_txt/examples/ShowTime/ShowTime.ino b/libraries/iarduino_OLED_txt/examples/ShowTime/ShowTime.ino new file mode 100644 index 0000000..480f286 --- /dev/null +++ b/libraries/iarduino_OLED_txt/examples/ShowTime/ShowTime.ino @@ -0,0 +1,35 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED_txt будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED_txt. +iarduino_OLED_txt myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D. + // +extern uint8_t MediumFont[]; // Подключаем шрифт MediumFont. +uint32_t i; // Объявляем переменную для хранения времени прошедшего с момента старта скетча. +int h, m, s; // Объявляем переменную для хранения времени в часах, минутах и секундах. + // +void setup(){ // + myOLED.begin(); // Инициируем работу с дисплеем. + myOLED.setFont(MediumFont); // Указываем шрифт который требуется использовать для вывода цифр и текста. +} // +void loop(){ // + i=millis(); // Получаем количество миллисекунд прошедшее с момента старта скетча. + if(i%1000==0){ delay(1); // Выполняем скетч 1 раз в секунду. Так как условие истинно в течении 1 миллисекунды, то устанавливаем задержку в 1 миллисекунду. + i/=1000; h=i/60/60%24; m=i/60%60; s=i%60; // Рассчитываем часы, минуты и секунды. + myOLED.setCursor(16,4); // Устанавливаем курсор в 16 столбец 4 строки. + if(h<10){myOLED.print(0);} myOLED.print(h); // Выводим часы прошедшие с момента старта скетча, в формате ЧЧ. + myOLED.print(":"); // Выводим текст состоящий из одного символа «:» + if(m<10){myOLED.print(0);} myOLED.print(m); // Выводим минуты прошедшие с момента старта скетча, в формате ММ. + myOLED.print(":"); // Выводим текст состоящий из одного символа «:» + if(s<10){myOLED.print(0);} myOLED.print(s); // Выводим секунды прошедшие с момента старта скетча, в формате СС. + } // +} // + // diff --git a/libraries/iarduino_OLED_txt/examples/TwoDisplays/TwoDisplays.ino b/libraries/iarduino_OLED_txt/examples/TwoDisplays/TwoDisplays.ino new file mode 100644 index 0000000..19c65ad --- /dev/null +++ b/libraries/iarduino_OLED_txt/examples/TwoDisplays/TwoDisplays.ino @@ -0,0 +1,32 @@ +// Раскомментируйте для программной реализации шины I2C: // +// #define pin_SW_SDA 3 // Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. +// #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. +// Раскомментируйте для совместимости с большинством плат: // +// #include // Библиотека iarduino_OLED_txt будет использовать методы и функции библиотеки Wire. +// Ссылки для ознакомления: // +// Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ +// Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/OLED_trema/ +// Библиотека iarduino_OLED_txt (текстовая) экономит ОЗУ: // http://iarduino.ru/file/341.html +// Бибилиотека iarduino_OLED (графическая): // http://iarduino.ru/file/340.html + // +#include // Подключаем библиотеку iarduino_OLED_txt. +iarduino_OLED_txt myOLED_1(0x3C); // Объявляем объект myOLED_1, указывая адрес первого дисплея на шине I2C: 0x3C. +iarduino_OLED_txt myOLED_2(0x3D); // Объявляем объект myOLED_2, указывая адрес второго дисплея на шине I2C: 0x3D. + // +extern uint8_t MediumFontRus[]; // Подключаем шрифт MediumFontRus. +extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus. + // Если Вы не используете Кириллицу, то лучше подключить шрифты MediumFont и SmallFont, они займут меньше места в памяти программ. +void setup(){ // + myOLED_1.begin (); // Инициируем работу с первым дисплеем. + myOLED_2.begin (); // Инициируем работу с вторым дисплеем. + myOLED_1.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста на первом дисплее. + myOLED_2.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста на втором дисплее. + myOLED_1.print ("1 дисплей", OLED_C, 3); // Выводим текст на первый дисплей по центру 3 строки (высота шрифта 2 строки, он займёт строки 2 и 3). + myOLED_2.print ("2 дисплей", OLED_C, 3); // Выводим текст на второй дисплей по центру 3 строки (высота шрифта 2 строки, он займёт строки 2 и 3). + myOLED_1.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста на первом дисплее. + myOLED_2.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста на втором дисплее. + myOLED_1.print ("Адрес дисплея 0x3C", OLED_C, 5); // Выводим текст на первый дисплей по центру 5 строки (высота шрифта 1 строка). + myOLED_2.print ("Адрес дисплея 0x3D", OLED_C, 5); // Выводим текст на второй дисплей по центру 5 строки (высота шрифта 1 строка). +} // + // +void loop(){} // diff --git a/libraries/iarduino_OLED_txt/keywords.txt b/libraries/iarduino_OLED_txt/keywords.txt new file mode 100644 index 0000000..2f16374 --- /dev/null +++ b/libraries/iarduino_OLED_txt/keywords.txt @@ -0,0 +1,31 @@ +# #################################################### +# СИНТАКСИЧЕСКАЯ РАСКРАСКА ДЛЯ БИБИЛИОТЕКИ: +# iarduino_OLED_txt +# #################################################### +# ТИПЫ ДАННЫХ: (KEYWORD1) + iarduino_OLED_txt KEYWORD1 +# #################################################### +# МЕТОДЫ И ФУНКЦИИ: (KEYWORD2) + begin KEYWORD2 + clrScr KEYWORD2 + fillScr KEYWORD2 + invScr KEYWORD2 + invText KEYWORD2 + setFont KEYWORD2 + getFontWidth KEYWORD2 + getFontHeight KEYWORD2 + setCursor KEYWORD2 + setCoding KEYWORD2 + setCursorShift KEYWORD2 + print KEYWORD2 +# #################################################### +# КОНСТАНТЫ: (LITERAL1) + OLED_T LITERAL1 + OLED_B LITERAL1 + OLED_L LITERAL1 + OLED_C LITERAL1 + OLED_R LITERAL1 + OLED_N LITERAL1 + TXT_UTF8 LITERAL1 + TXT_CP866 LITERAL1 + TXT_WIN1251 LITERAL1 diff --git a/libraries/iarduino_OLED_txt/library.properties b/libraries/iarduino_OLED_txt/library.properties new file mode 100644 index 0000000..4595e3a --- /dev/null +++ b/libraries/iarduino_OLED_txt/library.properties @@ -0,0 +1,10 @@ +name = iarduino OLED txt (вывод текста и чисел на OLED дисплеи) +version = 1.0.0 +author = iarduino +maintainer = Панькин Павел +sentence = Библиотека для вывода текста и чисел на OLED дисплеи. +paragraph = Позволяет выводить текст и числа на OLED дисплеи 128x64 по шине I2C. Есть возможность выбора адреса для работы с несколькими дисплеями. Для вывода графики воспользуйтесь библиотекой iarduino OLED. +category = Display +url = http://iarduino.ru/file/341.html +architectures = avr +includes = iarduino_OLED_txt.h \ No newline at end of file diff --git a/libraries/iarduino_OLED_txt/src/DefaultFonts.c b/libraries/iarduino_OLED_txt/src/DefaultFonts.c new file mode 100644 index 0000000..6bc9250 --- /dev/null +++ b/libraries/iarduino_OLED_txt/src/DefaultFonts.c @@ -0,0 +1,677 @@ +#include // Номер байта п/п: 0 1 2 3 4 5 Номер байта п/п: 0 1 2 3 4 5 + // Значение байта (hex): 00, 20, 54, 54, 54, 78, буква «а» Значение байта (hex): 00, 7F, 28, 44, 44, 38 буква «b» + // 0 бит: (младший) 0 0 0 0 0 0 = | | 0 бит: (младший) 0 1 0 0 0 0 = | # | + // 1 бит: 0 0 0 0 0 0 = | | 1 бит: 0 1 0 0 0 0 = | # | + // 2 бит: 0 0 1 1 1 0 = | ### | 2 бит: 0 1 0 1 1 0 = | # ## | + // 3 бит: 0 0 0 0 0 1 = | #| 3 бит: 0 1 1 0 0 1 = | ## #| + // 4 бит: 0 0 1 1 1 1 = | ####| 4 бит: 0 1 0 0 0 1 = | # #| + // 5 бит: 0 1 0 0 0 1 = | # #| 5 бит: 0 1 1 0 0 1 = | ## #| + // 6 бит: 0 0 1 1 1 1 = | ####| 6 бит: 0 1 0 1 1 0 = | # ## | + // 7 бит: (старший) 0 0 0 0 0 0 = | | 7 бит: (старший) 0 0 0 0 0 0 = | | + // + // Для Кириллицы используется кодировка CP866. + // + +const uint8_t SmallFont[] PROGMEM = // Шрифт SmallFont +{ // +0x06, 0x08, 0x20, 0x5F, // ширина символов (6), высота символов (8), код первого символа (32), количество символов (95) + // +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 001) 0x20=032 пробел +0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, // 002) 0x21=033 ! +0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // 003) 0x22=034 " +0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, // 004) 0x23=035 # +0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, // 005) 0x24=036 $ +0x00, 0x23, 0x13, 0x08, 0x64, 0x62, // 006) 0x25=037 % +0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // 007) 0x26=038 & +0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // 008) 0x27=039 ' +0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, // 009) 0x28=040 ( +0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, // 010) 0x29=041 ) +0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // 011) 0x2A=042 * +0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // 012) 0x2B=043 + +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // 013) 0x2C=044 , +0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // 014) 0x2D=045 - +0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // 015) 0x2E=046 . +0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // 016) 0x2F=047 / + // +0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 017) 0x30=048 0 +0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 018) 0x31=049 1 +0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 019) 0x32=050 2 +0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 020) 0x33=051 3 +0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 021) 0x34=052 4 +0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 022) 0x35=053 5 +0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 023) 0x36=054 6 +0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 024) 0x37=055 7 +0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 025) 0x38=056 8 +0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 026) 0x39=057 9 +0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // 027) 0x3A=058 : +0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // 028) 0x3B=059 ; +0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // 029) 0x3C=060 < +0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // 030) 0x3D=061 = +0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // 031) 0x3E=062 > +0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // 032) 0x3F=063 ? + // +0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // 033) 0x40=064 @ +0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // 034) 0x41=065 A +0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // 035) 0x42=066 B +0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // 036) 0x43=067 C +0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // 037) 0x44=068 D +0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // 038) 0x45=069 E +0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // 039) 0x46=070 F +0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // 040) 0x47=071 G +0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // 041) 0x48=072 H +0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // 042) 0x49=073 I +0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // 043) 0x4A=074 J +0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // 044) 0x4B=075 K +0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // 045) 0x4C=076 L +0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // 046) 0x4D=077 M +0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // 047) 0x4E=078 N +0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // 048) 0x4F=079 O + // +0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // 049) 0x50=080 P +0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // 050) 0x51=081 Q +0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // 051) 0x52=082 R +0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // 052) 0x53=083 S +0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // 053) 0x54=084 T +0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // 054) 0x55=085 U +0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // 055) 0x56=086 V +0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // 056) 0x57=087 W +0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // 057) 0x58=088 X +0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // 058) 0x59=089 Y +0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // 059) 0x5A=090 Z +0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // 060) 0x5B=091 [ +0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, // 061) 0x5C=092 обратный слеш +0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // 062) 0x5D=093 ] +0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // 063) 0x5E=094 ^ +0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // 064) 0x5F=095 _ + // +0x00, 0x00, 0x03, 0x05, 0x00, 0x00, // 065) 0x60=096 ` +0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // 066) 0x61=097 a +0x00, 0x7F, 0x28, 0x44, 0x44, 0x38, // 067) 0x62=098 b +0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // 068) 0x63=099 c +0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // 069) 0x64=100 d +0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // 070) 0x65=101 e +0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // 071) 0x66=102 f +0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // 072) 0x67=103 g +0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // 073) 0x68=104 h +0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // 074) 0x69=105 i +0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // 075) 0x6A=106 j +0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // 076) 0x6B=107 k +0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // 077) 0x6C=108 l +0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // 078) 0x6D=109 m +0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // 079) 0x6E=110 n +0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // 080) 0x6F=111 o + // +0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // 081) 0x70=112 p +0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // 082) 0x71=113 q +0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // 083) 0x72=114 r +0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // 084) 0x73=115 s +0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // 085) 0x74=116 t +0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // 086) 0x75=117 u +0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // 087) 0x76=118 v +0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // 088) 0x77=119 w +0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // 089) 0x78=120 x +0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // 090) 0x79=121 y +0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // 091) 0x7A=122 z +0x00, 0x00, 0x10, 0x7C, 0x82, 0x00, // 092) 0x7B=123 { +0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, // 093) 0x7C=124 | +0x00, 0x00, 0x82, 0x7C, 0x10, 0x00, // 094) 0x7D=125 } +0x00, 0x00, 0x06, 0x09, 0x09, 0x06, // 095) 0x7E=126 ~ + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // + +const uint8_t SmallFontRus[] PROGMEM = // Шрифт SmallFontRus +{ // +0x06, 0x08, 0x20, 0xB0, // ширина символов (6), высота символов (8), код первого символа (32), количество символов (176) + // +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 001) 0x20=032 пробел +0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, // 002) 0x21=033 ! +0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // 003) 0x22=034 " +0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, // 004) 0x23=035 # +0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, // 005) 0x24=036 $ +0x00, 0x23, 0x13, 0x08, 0x64, 0x62, // 006) 0x25=037 % +0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // 007) 0x26=038 & +0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // 008) 0x27=039 ' +0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, // 009) 0x28=040 ( +0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, // 010) 0x29=041 ) +0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // 011) 0x2A=042 * +0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // 012) 0x2B=043 + +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // 013) 0x2C=044 , +0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // 014) 0x2D=045 - +0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // 015) 0x2E=046 . +0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // 016) 0x2F=047 / + // +0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 017) 0x30=048 0 +0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 018) 0x31=049 1 +0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 019) 0x32=050 2 +0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 020) 0x33=051 3 +0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 021) 0x34=052 4 +0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 022) 0x35=053 5 +0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 023) 0x36=054 6 +0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 024) 0x37=055 7 +0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 025) 0x38=056 8 +0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 026) 0x39=057 9 +0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // 027) 0x3A=058 : +0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // 028) 0x3B=059 ; +0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // 029) 0x3C=060 < +0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // 030) 0x3D=061 = +0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // 031) 0x3E=062 > +0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // 032) 0x3F=063 ? + // +0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // 033) 0x40=064 @ +0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // 034) 0x41=065 A +0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // 035) 0x42=066 B +0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // 036) 0x43=067 C +0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // 037) 0x44=068 D +0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // 038) 0x45=069 E +0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // 039) 0x46=070 F +0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // 040) 0x47=071 G +0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // 041) 0x48=072 H +0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // 042) 0x49=073 I +0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // 043) 0x4A=074 J +0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // 044) 0x4B=075 K +0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // 045) 0x4C=076 L +0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // 046) 0x4D=077 M +0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // 047) 0x4E=078 N +0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // 048) 0x4F=079 O + // +0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // 049) 0x50=080 P +0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // 050) 0x51=081 Q +0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // 051) 0x52=082 R +0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // 052) 0x53=083 S +0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // 053) 0x54=084 T +0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // 054) 0x55=085 U +0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // 055) 0x56=086 V +0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // 056) 0x57=087 W +0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // 057) 0x58=088 X +0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // 058) 0x59=089 Y +0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // 059) 0x5A=090 Z +0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // 060) 0x5B=091 [ +0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, // 061) 0x5C=092 обратный слеш +0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // 062) 0x5D=093 ] +0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // 063) 0x5E=094 ^ +0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // 064) 0x5F=095 _ + // +0x00, 0x00, 0x03, 0x05, 0x00, 0x00, // 065) 0x60=096 ` +0x00, 0x20, 0x54, 0x54, 0x78, 0x40, // 066) 0x61=097 a +0x00, 0x7F, 0x28, 0x44, 0x44, 0x38, // 067) 0x62=098 b +0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // 068) 0x63=099 c +0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // 069) 0x64=100 d +0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // 070) 0x65=101 e +0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // 071) 0x66=102 f +0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // 072) 0x67=103 g +0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // 073) 0x68=104 h +0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // 074) 0x69=105 i +0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // 075) 0x6A=106 j +0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // 076) 0x6B=107 k +0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // 077) 0x6C=108 l +0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // 078) 0x6D=109 m +0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // 079) 0x6E=110 n +0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // 080) 0x6F=111 o + // +0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // 081) 0x70=112 p +0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // 082) 0x71=113 q +0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // 083) 0x72=114 r +0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // 084) 0x73=115 s +0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // 085) 0x74=116 t +0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // 086) 0x75=117 u +0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // 087) 0x76=118 v +0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // 088) 0x77=119 w +0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // 089) 0x78=120 x +0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // 090) 0x79=121 y +0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // 091) 0x7A=122 z +0x00, 0x00, 0x10, 0x7C, 0x82, 0x00, // 092) 0x7B=123 { +0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, // 093) 0x7C=124 | +0x00, 0x00, 0x82, 0x7C, 0x10, 0x00, // 094) 0x7D=125 } +0x00, 0x10, 0x08, 0x10, 0x20, 0x10, // 095) 0x7E=126 ~ +0 , 0 , 0 , 0 , 0 , 0 , // 096) 0x7F=127 ⌂ + // +0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // 097) 0x80=128 А +0x00, 0x7F, 0x49, 0x49, 0x49, 0x31, // 098) 0x81=129 Б +0x00, 0x7F, 0x45, 0x45, 0x45, 0x3A, // 099) 0x82=130 В +0x00, 0x7F, 0x01, 0x01, 0x01, 0x03, // 100) 0x83=131 Г +0x00, 0x60, 0x3F, 0x21, 0x3F, 0x60, // 101) 0x84=132 Д +0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // 102) 0x85=133 Е +0x00, 0x73, 0x0C, 0x7F, 0x0C, 0x73, // 103) 0x86=134 Ж +0x00, 0x22, 0x41, 0x49, 0x49, 0x36, // 104) 0x87=135 З +0x00, 0x7F, 0x10, 0x08, 0x04, 0x7F, // 105) 0x88=136 И +0x00, 0x7E, 0x20, 0x11, 0x08, 0x7E, // 106) 0x89=137 Й +0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // 107) 0x8A=138 К +0x00, 0x40, 0x3F, 0x01, 0x01, 0x7F, // 108) 0x8B=139 Л +0x00, 0x7F, 0x06, 0x08, 0x06, 0x7F, // 109) 0x8C=140 М +0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // 110) 0x8D=141 Н +0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // 111) 0x8E=142 О +0x00, 0x7F, 0x01, 0x01, 0x01, 0x7F, // 112) 0x8F=143 П + // +0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // 113) 0x90=144 Р +0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // 114) 0x91=145 С +0x00, 0x03, 0x01, 0x7F, 0x01, 0x03, // 115) 0x92=146 Т +0x00, 0x61, 0x26, 0x18, 0x06, 0x01, // 116) 0x93=147 У +0x00, 0x1C, 0x22, 0x7F, 0x22, 0x1C, // 117) 0x94=148 Ф +0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // 118) 0x95=149 Х +0x00, 0x3F, 0x20, 0x20, 0x3F, 0x60, // 119) 0x96=150 Ц +0x00, 0x07, 0x08, 0x08, 0x08, 0x7F, // 120) 0x97=151 Ч +0x00, 0x7F, 0x40, 0x7F, 0x40, 0x7F, // 121) 0x98=152 Ш +0x00, 0x3F, 0x20, 0x3F, 0x20, 0x7F, // 122) 0x99=153 Щ +0x00, 0x01, 0x7F, 0x48, 0x48, 0x30, // 123) 0x9A=154 Ъ +0x00, 0x7F, 0x48, 0x78, 0x00, 0x7F, // 124) 0x9B=155 Ы +0x00, 0x7F, 0x48, 0x48, 0x30, 0x00, // 125) 0x9C=156 Ь +0x00, 0x41, 0x49, 0x49, 0x2A, 0x1C, // 126) 0x9D=157 Э +0x00, 0x7F, 0x10, 0x3E, 0x41, 0x3E, // 127) 0x9E=158 Ю +0x00, 0x66, 0x19, 0x09, 0x09, 0x7F, // 128) 0x9F=159 Я + // +0x00, 0x20, 0x54, 0x54, 0x78, 0x40, // 129) 0xA0=160 а +0x00, 0x3E, 0x49, 0x45, 0x45, 0x38, // 130) 0xA1=161 б +0x00, 0x7C, 0x54, 0x54, 0x58, 0x20, // 131) 0xA2=162 в +0x00, 0x7C, 0x04, 0x04, 0x0C, 0x00, // 132) 0xA3=163 г +0x00, 0x38, 0x45, 0x45, 0x49, 0x3E, // 133) 0xA4=164 д +0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // 134) 0xA5=165 е +0x00, 0x4C, 0x30, 0x7C, 0x30, 0x4C, // 135) 0xA6=166 ж +0x00, 0x28, 0x44, 0x54, 0x28, 0x00, // 136) 0xA7=167 з +0x00, 0x7C, 0x20, 0x10, 0x7C, 0x00, // 137) 0xA8=168 и +0x00, 0x7C, 0x21, 0x11, 0x7C, 0x00, // 138) 0xA9=169 й +0x00, 0x7C, 0x10, 0x28, 0x44, 0x00, // 139) 0xAA=170 к +0x00, 0x40, 0x3C, 0x04, 0x04, 0x7C, // 140) 0xAB=171 л +0x00, 0x7C, 0x08, 0x10, 0x08, 0x7C, // 141) 0xAC=172 м +0x00, 0x7C, 0x10, 0x10, 0x7C, 0x00, // 142) 0xAD=173 н +0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // 143) 0xAE=174 о +0x00, 0x7C, 0x04, 0x04, 0x7C, 0x00, // 144) 0xAF=175 п + // +0x00, 0xFC, 0x28, 0x44, 0x44, 0x38, // 145) 0xE0=224 р +0x00, 0x38, 0x44, 0x44, 0x44, 0x28, // 146) 0xE1=225 с +0x00, 0x04, 0x04, 0x7C, 0x04, 0x04, // 147) 0xE2=226 т +0x00, 0x4C, 0x50, 0x50, 0x50, 0x3C, // 148) 0xE3=227 у +0x00, 0x38, 0x44, 0xFE, 0x44, 0x38, // 149) 0xE4=228 ф +0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // 150) 0xE5=229 х +0x00, 0x7C, 0x40, 0x40, 0x7C, 0xC0, // 151) 0xE6=230 ц +0x00, 0x1C, 0x10, 0x10, 0x7C, 0x00, // 152) 0xE7=231 ч +0x00, 0x7C, 0x40, 0x7C, 0x40, 0x7C, // 153) 0xE8=232 ш +0x00, 0x7C, 0x40, 0x7C, 0x40, 0xFC, // 154) 0xE9=233 щ +0x00, 0x04, 0x7C, 0x50, 0x70, 0x00, // 155) 0xEA=234 ъ +0x00, 0x7C, 0x50, 0x70, 0x00, 0x7C, // 156) 0xEB=235 ы +0x00, 0x00, 0x7C, 0x50, 0x70, 0x00, // 157) 0xEC=236 ь +0x00, 0x28, 0x44, 0x54, 0x38, 0x00, // 158) 0xED=237 э +0x00, 0x7C, 0x10, 0x38, 0x44, 0x38, // 159) 0xEE=238 ю +0x00, 0x08, 0x54, 0x34, 0x14, 0x7C, // 160) 0xEF=239 я + // +0x00, 0x7E, 0x4B, 0x4A, 0x4B, 0x42, // 161) 0xF0=240 Ё +0x00, 0x38, 0x55, 0x54, 0x55, 0x18, // 162) 0xF1=241 ё +0 , 0 , 0 , 0 , 0 , 0 , // 163) 0xF2=242 Є +0 , 0 , 0 , 0 , 0 , 0 , // 164) 0xF3=243 є +0 , 0 , 0 , 0 , 0 , 0 , // 165) 0xF4=244 Ї +0 , 0 , 0 , 0 , 0 , 0 , // 166) 0xF5=245 ї +0 , 0 , 0 , 0 , 0 , 0 , // 167) 0xF6=246 Ў +0 , 0 , 0 , 0 , 0 , 0 , // 168) 0xF7=247 ў +0x00, 0x00, 0x06, 0x09, 0x09, 0x06, // 169) 0xF8=248 ° +0 , 0 , 0 , 0 , 0 , 0 , // 170) 0xF9=249 ∙ +0 , 0 , 0 , 0 , 0 , 0 , // 171) 0xFA=250 · +0 , 0 , 0 , 0 , 0 , 0 , // 172) 0xFB=251 √ +0 , 0 , 0 , 0 , 0 , 0 , // 173) 0xFC=252 № +0 , 0 , 0 , 0 , 0 , 0 , // 174) 0xFD=253 ¤ +0 , 0 , 0 , 0 , 0 , 0 , // 175) 0xFE=254 ■ +0 , 0 , 0 , 0 , 0 , 0 , // 176) 0xFF=255   + // +0x01, 0xAF, 0x30 // В таблице имеется (1) пустой интервал, который находится после символа с кодом (175) и состоит из (48) отсутствующих символов. + // Допускается использовать до 3 пустых интервалов. Пример: 0x03, 0xAA, 0x10, 0xCC, 0x10, 0xEE, 0x10 +}; // 3 пустых интервала, по (16) отсутствующий символов в каждом, находятся после символов с кодами (170, 204 и 238). + +const uint8_t MediumFont[] PROGMEM = // Шрифт MediumFont +{ // +0x0C,0x10,0x20,0x5F, // ширина символов (12), высота символов (16), код первого символа (32), количество символов (95) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 001) 0x20=032 пробел +0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x67,0x00,0x00,0x00,0x00,0x00, // 002) 0x21=033 ! +0x00,0x00,0x00,0x16,0x0E,0x00,0x00,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 003) 0x22=034 " +0x00,0x00,0x60,0xE0,0xF8,0x7E,0x6E,0xE0,0xF8,0x7E,0x6E,0x00,0x00,0x76,0x7E,0x1F,0x07,0x76,0x7E,0x1F,0x07,0x06,0x00,0x00, // 004) 0x23=035 # +0x00,0x78,0xFC,0xCE,0x86,0xFF,0xFF,0x86,0x9E,0x1C,0x18,0x00,0x00,0x18,0x38,0x79,0x61,0xFF,0xFF,0x61,0x73,0x3F,0x1E,0x00, // 005) 0x24=036 $ +0x00,0x3C,0x7E,0x66,0x7E,0xBC,0xE0,0x78,0x1E,0x06,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x3D,0x7E,0x66,0x7E,0x3C,0x00, // 006) 0x25=037 % +0x00,0x00,0x00,0x80,0x80,0xFC,0xFE,0xE6,0xE6,0x7E,0x3C,0x00,0x00,0x1E,0x3F,0x73,0x61,0x61,0x71,0x7F,0x3F,0x7C,0x6C,0x00, // 007) 0x26=038 & +0x00,0x00,0x00,0x00,0x00,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 008) 0x27=039 ' +0x00,0x00,0x00,0x00,0xF0,0xFC,0x0E,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0x70,0xC0,0x00,0x00,0x00,0x00, // 009) 0x28=040 ( +0x00,0x00,0x00,0x00,0x03,0x0E,0xFC,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x70,0x3F,0x0F,0x00,0x00,0x00,0x00, // 010) 0x29=041 ) +0x00,0x00,0x00,0x08,0x78,0x3C,0x3C,0x78,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 011) 0x2A=042 * +0x00,0x00,0x80,0x80,0x80,0xF0,0xF0,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x0F,0x01,0x01,0x01,0x00,0x00, // 012) 0x2B=043 + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x70,0x00,0x00,0x00,0x00,0x00, // 013) 0x2C=044 , +0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00, // 014) 0x2D=045 - +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00, // 015) 0x2E=046 . +0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x78,0x1E,0x06,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x01,0x00,0x00,0x00,0x00,0x00, // 016) 0x2F=047 / + // +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 017) 0x30=048 0 +0x00,0x00,0x00,0x30,0x38,0x1C,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00, // 018) 0x31=049 1 +0x00,0x18,0x1C,0x1E,0x06,0x06,0x06,0x86,0xCE,0xFC,0x78,0x00,0x00,0x78,0x7C,0x7E,0x66,0x67,0x63,0x63,0x61,0x70,0x70,0x00, // 019) 0x32=050 2 +0x00,0x0E,0x0E,0x06,0x06,0xC6,0xE6,0xF6,0xFE,0x9E,0x0E,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 020) 0x33=051 3 +0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0xFE,0xFE,0x06,0x00,0x00,0x07,0x07,0x07,0x06,0x06,0x06,0x66,0x7F,0x7F,0x66,0x00, // 021) 0x34=052 4 +0x00,0xFE,0xFE,0xE6,0x66,0x66,0x66,0x66,0xE6,0xCE,0x8E,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 022) 0x35=053 5 +0x00,0xF8,0xFC,0xCE,0xC6,0xC6,0xC6,0xC6,0xDE,0x9C,0x18,0x00,0x00,0x1F,0x3F,0x71,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 023) 0x36=054 6 +0x00,0x1E,0x1E,0x06,0x06,0x06,0x06,0x86,0xE6,0x7E,0x1E,0x00,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x01,0x00,0x00,0x00, // 024) 0x37=055 7 +0x00,0x78,0xFC,0xCE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x1E,0x3F,0x73,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 025) 0x38=056 8 +0x00,0xF8,0xFC,0x8E,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x18,0x39,0x7B,0x63,0x63,0x63,0x63,0x73,0x3F,0x1F,0x00, // 026) 0x39=057 9 +0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00, // 027) 0x3A=058 : +0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x1C,0x00,0x00,0x00,0x00,0x00, // 028) 0x3B=059 ; +0x00,0x00,0x80,0xC0,0xC0,0xE0,0x60,0x70,0x30,0x30,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x06,0x0E,0x0C,0x0C,0x00,0x00, // 029) 0x3C=060 < +0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // 030) 0x3D=061 = +0x00,0x00,0x30,0x30,0x70,0x60,0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x0C,0x0C,0x0E,0x06,0x07,0x03,0x03,0x01,0x00,0x00, // 031) 0x3E=062 > +0x00,0x18,0x1C,0x1E,0x06,0x06,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x6E,0x6F,0x03,0x01,0x01,0x00,0x00,0x00, // 032) 0x3F=063 ? + // +0x00,0xF8,0xFC,0x0E,0xE6,0xF6,0x36,0xF6,0xF6,0x0E,0xFC,0xF8,0x00,0x1F,0x3F,0x70,0x67,0x6F,0x6C,0x6F,0x67,0x6C,0x2F,0x07, // 033) 0x40=064 @ +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 034) 0x41=065 A +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 035) 0x42=066 B +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 036) 0x43=067 C +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 037) 0x44=068 D +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0xC6,0xC6,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x63,0x63,0x70,0x70,0x00, // 038) 0x45=069 E +0x00,0x06,0xFE,0xFE,0x86,0x86,0xC6,0xC6,0x06,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x03,0x00,0x00,0x00,0x00, // 039) 0x46=070 F +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x63,0x63,0x73,0x3F,0x1F,0x00, // 040) 0x47=071 G +0x00,0x06,0xFE,0xFE,0x86,0x80,0x80,0x86,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x01,0x61,0x7F,0x7F,0x60,0x00, // 041) 0x48=072 H +0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 042) 0x49=073 I +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x70,0x3F,0x1F,0x00,0x00, // 043) 0x4A=074 J +0x00,0x06,0xFE,0xFE,0x86,0x80,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x6F,0x7E,0x78,0x60,0x00, // 044) 0x4B=075 K +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x60,0x70,0x70,0x00, // 045) 0x4C=076 L +0x00,0x06,0xFE,0xFE,0x78,0xE0,0xE0,0x78,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x01,0x60,0x7F,0x7F,0x60,0x00, // 046) 0x4D=077 M +0x00,0x06,0xFE,0xFE,0x78,0xE0,0x80,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x07,0x1E,0x7F,0x7F,0x60,0x00, // 047) 0x4E=078 N +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 048) 0x4F=079 O + // +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x03,0x03,0x01,0x00,0x00, // 049) 0x50=080 P +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x6C,0x7C,0x38,0x7F,0x6F,0x00, // 050) 0x51=081 Q +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x6F,0x7F,0x79,0x60,0x00, // 051) 0x52=082 R +0x00,0x78,0xFC,0xCE,0x86,0x86,0x86,0x86,0x9E,0x1C,0x18,0x00,0x00,0x18,0x38,0x79,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 052) 0x53=083 S +0x00,0x0E,0x0E,0x06,0x06,0xFE,0xFE,0x06,0x06,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 053) 0x54=084 T +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x70,0x3F,0x1F,0x00,0x00, // 054) 0x55=085 U +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x03,0x0F,0x3E,0x78,0x78,0x3E,0x0F,0x03,0x00,0x00, // 055) 0x56=086 V +0x00,0x06,0xFE,0xFE,0x06,0x80,0x80,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x1F,0x7F,0x78,0x1F,0x1F,0x78,0x7F,0x1F,0x00,0x00, // 056) 0x57=087 W +0x00,0x06,0x1E,0x7E,0xF6,0xC0,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x78,0x7E,0x6F,0x03,0x03,0x6F,0x7E,0x78,0x60,0x00, // 057) 0x58=088 X +0x00,0x06,0x7E,0xFE,0xC6,0x00,0x00,0xC6,0xFE,0x7E,0x06,0x00,0x00,0x00,0x00,0x01,0x63,0x7F,0x7F,0x63,0x01,0x00,0x00,0x00, // 058) 0x59=089 Y +0x00,0x0E,0x0E,0x06,0x06,0x86,0xC6,0xE6,0x76,0x3E,0x1E,0x00,0x00,0x78,0x7C,0x6E,0x67,0x63,0x61,0x60,0x60,0x70,0x70,0x00, // 059) 0x5A=090 Z +0x00,0x00,0x00,0x00,0xFF,0xFF,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0x00,0x00,0x00, // 060) 0x5B=091 [ +0x00,0x00,0x06,0x1E,0x78,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x1E,0x78,0x60,0x00,0x00, // 061) 0x5C=092 обратный слеш +0x00,0x00,0x00,0x03,0x03,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFF,0xFF,0x00,0x00,0x00,0x00, // 062) 0x5D=093 ] +0x00,0x00,0x00,0x30,0x3C,0x1E,0x1E,0x3C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 063) 0x5E=094 ^ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00, // 064) 0x5F=095 _ + // +0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 065) 0x60=096 ` +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x1C,0x3E,0x77,0x63,0x63,0x63,0x33,0x7F,0x7F,0x60,0x00, // 066) 0x61=097 a +0x00,0x06,0xFE,0xFE,0x66,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x60,0x7F,0x7F,0x30,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 067) 0x62=098 b +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 068) 0x63=099 c +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x66,0xFE,0xFE,0x06,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x30,0x7F,0x7F,0x60,0x00, // 069) 0x64=100 d +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x76,0x66,0x66,0x66,0x66,0x76,0x37,0x17,0x00, // 070) 0x65=101 e +0x00,0x00,0x00,0x60,0xFC,0xFE,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, // 071) 0x66=102 f +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x60,0xF0,0xF0,0x30,0x00,0x00,0x33,0x77,0xEE,0xCC,0xCC,0xCC,0xEE,0x7F,0x3F,0x00,0x00, // 072) 0x67=103 g +0x00,0x06,0xFE,0xFE,0x66,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 073) 0x68=104 h +0x00,0x00,0x00,0x00,0x30,0xF6,0xF6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 074) 0x69=105 i +0x00,0x00,0x00,0x00,0x00,0x30,0xF6,0xF6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x7F,0x3F,0x00,0x00,0x00,0x00, // 075) 0x6A=106 j +0x00,0x06,0xFE,0xFE,0x06,0x80,0xF0,0xF0,0x70,0x30,0x30,0x00,0x00,0x60,0x7F,0x7F,0x63,0x07,0x0F,0x7C,0x78,0x70,0x60,0x00, // 076) 0x6B=107 k +0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 077) 0x6C=108 l +0x30,0xF0,0xE0,0x30,0x30,0xF0,0xE0,0x30,0x30,0xF0,0xE0,0x00,0x60,0x7F,0x7F,0x60,0x00,0x7F,0x7F,0x00,0x60,0x7F,0x7F,0x60, // 078) 0x6D=109 m +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 079) 0x6E=110 n +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 080) 0x6F=111 o + // +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0xC0,0xFF,0xFF,0xD8,0x30,0x30,0x30,0x38,0x1F,0x0F,0x00, // 081) 0x70=112 p +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x60,0xF0,0xF0,0x30,0x00,0x00,0x0F,0x1F,0x38,0x30,0x30,0x30,0xD8,0xFF,0xFF,0xC0,0x00, // 082) 0x71=113 q +0x00,0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x70,0x60,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // 083) 0x72=114 r +0x00,0xE0,0xF0,0x30,0x30,0x30,0x30,0x30,0x70,0x70,0x60,0x00,0x00,0x19,0x3B,0x7B,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 084) 0x73=115 s +0x00,0x00,0x00,0x30,0xFE,0xFE,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7F,0x60,0x60,0x00,0x00,0x00,0x00, // 085) 0x74=116 t +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x30,0x7F,0x7F,0x60,0x00, // 086) 0x75=117 u +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x07,0x1F,0x78,0x78,0x1F,0x07,0x00,0x00,0x00, // 087) 0x76=118 v +0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x03,0x1F,0x7C,0x70,0x1E,0x1E,0x70,0x7C,0x1F,0x03,0x00, // 088) 0x77=119 w +0x00,0x00,0x30,0x70,0xF0,0x80,0x80,0xF0,0x70,0x30,0x00,0x00,0x00,0x00,0x60,0x70,0x7D,0x0F,0x0F,0x7D,0x70,0x60,0x00,0x00, // 089) 0x78=120 x +0x00,0x00,0x30,0xF0,0xC0,0x00,0x00,0xC0,0xF0,0x30,0x00,0x00,0x00,0x00,0x60,0x60,0x73,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00, // 090) 0x79=121 y +0x00,0x00,0x70,0x70,0x30,0x30,0xB0,0xF0,0xF0,0x70,0x00,0x00,0x00,0x00,0x78,0x7C,0x6E,0x67,0x63,0x61,0x70,0x70,0x00,0x00, // 091) 0x7A=122 z +0x00,0x00,0x80,0xC0,0xFC,0x7E,0x07,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x3F,0x7E,0xE0,0xC0,0xC0,0x00,0x00,0x00, // 092) 0x7B=123 { +0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00, // 093) 0x7C=124 | +0x00,0x00,0x00,0x03,0x03,0x07,0x7E,0xFC,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xE0,0x7E,0x3F,0x03,0x01,0x00,0x00, // 094) 0x7D=125 } +0x00,0x80,0xC0,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x80,0x80,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x01,0x00, // 095) 0x7E=126 ~ + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // + +const uint8_t MediumFontRus[] PROGMEM = // Шрифт MediumFontRus +{ // +0x0C,0x10,0x20,0xB0, // ширина символов (12), высота символов (16), код первого символа (32), количество символов (176) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 001) 0x20=032 пробел +0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x67,0x00,0x00,0x00,0x00,0x00, // 002) 0x21=033 ! +0x00,0x00,0x00,0x16,0x0E,0x00,0x00,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 003) 0x22=034 " +0x00,0x00,0x60,0xE0,0xF8,0x7E,0x6E,0xE0,0xF8,0x7E,0x6E,0x00,0x00,0x76,0x7E,0x1F,0x07,0x76,0x7E,0x1F,0x07,0x06,0x00,0x00, // 004) 0x23=035 # +0x00,0x78,0xFC,0xCE,0x86,0xFF,0xFF,0x86,0x9E,0x1C,0x18,0x00,0x00,0x18,0x38,0x79,0x61,0xFF,0xFF,0x61,0x73,0x3F,0x1E,0x00, // 005) 0x24=036 $ +0x00,0x3C,0x7E,0x66,0x7E,0xBC,0xE0,0x78,0x1E,0x06,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x3D,0x7E,0x66,0x7E,0x3C,0x00, // 006) 0x25=037 % +0x00,0x00,0x00,0x80,0x80,0xFC,0xFE,0xE6,0xE6,0x7E,0x3C,0x00,0x00,0x1E,0x3F,0x73,0x61,0x61,0x71,0x7F,0x3F,0x7C,0x6C,0x00, // 007) 0x26=038 & +0x00,0x00,0x00,0x00,0x00,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 008) 0x27=039 ' +0x00,0x00,0x00,0x00,0xF0,0xFC,0x0E,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0x70,0xC0,0x00,0x00,0x00,0x00, // 009) 0x28=040 ( +0x00,0x00,0x00,0x00,0x03,0x0E,0xFC,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x70,0x3F,0x0F,0x00,0x00,0x00,0x00, // 010) 0x29=041 ) +0x00,0x00,0x00,0x08,0x78,0x3C,0x3C,0x78,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 011) 0x2A=042 * +0x00,0x00,0x80,0x80,0x80,0xF0,0xF0,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x0F,0x01,0x01,0x01,0x00,0x00, // 012) 0x2B=043 + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0x70,0x00,0x00,0x00,0x00,0x00, // 013) 0x2C=044 , +0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00, // 014) 0x2D=045 - +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00, // 015) 0x2E=046 . +0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x78,0x1E,0x06,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x01,0x00,0x00,0x00,0x00,0x00, // 016) 0x2F=047 / + // +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 017) 0x30=048 0 +0x00,0x00,0x00,0x30,0x38,0x1C,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00, // 018) 0x31=049 1 +0x00,0x18,0x1C,0x1E,0x06,0x06,0x06,0x86,0xCE,0xFC,0x78,0x00,0x00,0x78,0x7C,0x7E,0x66,0x67,0x63,0x63,0x61,0x70,0x70,0x00, // 019) 0x32=050 2 +0x00,0x0E,0x0E,0x06,0x06,0xC6,0xE6,0xF6,0xFE,0x9E,0x0E,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 020) 0x33=051 3 +0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0xFE,0xFE,0x06,0x00,0x00,0x07,0x07,0x07,0x06,0x06,0x06,0x66,0x7F,0x7F,0x66,0x00, // 021) 0x34=052 4 +0x00,0xFE,0xFE,0xE6,0x66,0x66,0x66,0x66,0xE6,0xCE,0x8E,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 022) 0x35=053 5 +0x00,0xF8,0xFC,0xCE,0xC6,0xC6,0xC6,0xC6,0xDE,0x9C,0x18,0x00,0x00,0x1F,0x3F,0x71,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 023) 0x36=054 6 +0x00,0x1E,0x1E,0x06,0x06,0x06,0x06,0x86,0xE6,0x7E,0x1E,0x00,0x00,0x00,0x00,0x00,0x60,0x78,0x1E,0x07,0x01,0x00,0x00,0x00, // 024) 0x37=055 7 +0x00,0x78,0xFC,0xCE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x1E,0x3F,0x73,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 025) 0x38=056 8 +0x00,0xF8,0xFC,0x8E,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x18,0x39,0x7B,0x63,0x63,0x63,0x63,0x73,0x3F,0x1F,0x00, // 026) 0x39=057 9 +0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00, // 027) 0x3A=058 : +0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x1C,0x00,0x00,0x00,0x00,0x00, // 028) 0x3B=059 ; +0x00,0x00,0x80,0xC0,0xC0,0xE0,0x60,0x70,0x30,0x30,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x06,0x0E,0x0C,0x0C,0x00,0x00, // 029) 0x3C=060 < +0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // 030) 0x3D=061 = +0x00,0x00,0x30,0x30,0x70,0x60,0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x0C,0x0C,0x0E,0x06,0x07,0x03,0x03,0x01,0x00,0x00, // 031) 0x3E=062 > +0x00,0x18,0x1C,0x1E,0x06,0x06,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x6E,0x6F,0x03,0x01,0x01,0x00,0x00,0x00, // 032) 0x3F=063 ? + // +0x00,0xF8,0xFC,0x0E,0xE6,0xF6,0x36,0xF6,0xF6,0x0E,0xFC,0xF8,0x00,0x1F,0x3F,0x70,0x67,0x6F,0x6C,0x6F,0x67,0x6C,0x2F,0x07, // 033) 0x40=064 @ +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 034) 0x41=065 A +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 035) 0x42=066 B +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 036) 0x43=067 C +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 037) 0x44=068 D +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0xC6,0xC6,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x63,0x63,0x70,0x70,0x00, // 038) 0x45=069 E +0x00,0x06,0xFE,0xFE,0x86,0x86,0xC6,0xC6,0x06,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x03,0x00,0x00,0x00,0x00, // 039) 0x46=070 F +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x63,0x63,0x73,0x3F,0x1F,0x00, // 040) 0x47=071 G +0x00,0x06,0xFE,0xFE,0x86,0x80,0x80,0x86,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x01,0x61,0x7F,0x7F,0x60,0x00, // 041) 0x48=072 H +0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 042) 0x49=073 I +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x70,0x3F,0x1F,0x00,0x00, // 043) 0x4A=074 J +0x00,0x06,0xFE,0xFE,0x86,0x80,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x6F,0x7E,0x78,0x60,0x00, // 044) 0x4B=075 K +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x60,0x70,0x70,0x00, // 045) 0x4C=076 L +0x00,0x06,0xFE,0xFE,0x78,0xE0,0xE0,0x78,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x01,0x60,0x7F,0x7F,0x60,0x00, // 046) 0x4D=077 M +0x00,0x06,0xFE,0xFE,0x78,0xE0,0x80,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x07,0x1E,0x7F,0x7F,0x60,0x00, // 047) 0x4E=078 N +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 048) 0x4F=079 O + // +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x03,0x03,0x01,0x00,0x00, // 049) 0x50=080 P +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x6C,0x7C,0x38,0x7F,0x6F,0x00, // 050) 0x51=081 Q +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x6F,0x7F,0x79,0x60,0x00, // 051) 0x52=082 R +0x00,0x78,0xFC,0xCE,0x86,0x86,0x86,0x86,0x9E,0x1C,0x18,0x00,0x00,0x18,0x38,0x79,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 052) 0x53=083 S +0x00,0x0E,0x0E,0x06,0x06,0xFE,0xFE,0x06,0x06,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 053) 0x54=084 T +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x70,0x3F,0x1F,0x00,0x00, // 054) 0x55=085 U +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x03,0x0F,0x3E,0x78,0x78,0x3E,0x0F,0x03,0x00,0x00, // 055) 0x56=086 V +0x00,0x06,0xFE,0xFE,0x06,0x80,0x80,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x1F,0x7F,0x78,0x1F,0x1F,0x78,0x7F,0x1F,0x00,0x00, // 056) 0x57=087 W +0x00,0x06,0x1E,0x7E,0xF6,0xC0,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x78,0x7E,0x6F,0x03,0x03,0x6F,0x7E,0x78,0x60,0x00, // 057) 0x58=088 X +0x00,0x06,0x7E,0xFE,0xC6,0x00,0x00,0xC6,0xFE,0x7E,0x06,0x00,0x00,0x00,0x00,0x01,0x63,0x7F,0x7F,0x63,0x01,0x00,0x00,0x00, // 058) 0x59=089 Y +0x00,0x0E,0x0E,0x06,0x06,0x86,0xC6,0xE6,0x76,0x3E,0x1E,0x00,0x00,0x78,0x7C,0x6E,0x67,0x63,0x61,0x60,0x60,0x70,0x70,0x00, // 059) 0x5A=090 Z +0x00,0x00,0x00,0x00,0xFF,0xFF,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0x00,0x00,0x00, // 060) 0x5B=091 [ +0x00,0x00,0x06,0x1E,0x78,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x1E,0x78,0x60,0x00,0x00, // 061) 0x5C=092 обратный слеш +0x00,0x00,0x00,0x03,0x03,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFF,0xFF,0x00,0x00,0x00,0x00, // 062) 0x5D=093 ] +0x00,0x00,0x00,0x30,0x3C,0x1E,0x1E,0x3C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 063) 0x5E=094 ^ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00, // 064) 0x5F=095 _ + // +0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 065) 0x60=096 ` +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x1C,0x3E,0x77,0x63,0x63,0x63,0x33,0x7F,0x7F,0x60,0x00, // 066) 0x61=097 a +0x00,0x06,0xFE,0xFE,0x66,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x60,0x7F,0x7F,0x30,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 067) 0x62=098 b +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 068) 0x63=099 c +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x66,0xFE,0xFE,0x06,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x30,0x7F,0x7F,0x60,0x00, // 069) 0x64=100 d +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x76,0x66,0x66,0x66,0x66,0x76,0x37,0x17,0x00, // 070) 0x65=101 e +0x00,0x00,0x00,0x60,0xFC,0xFE,0x66,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, // 071) 0x66=102 f +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x60,0xF0,0xF0,0x30,0x00,0x00,0x33,0x77,0xEE,0xCC,0xCC,0xCC,0xEE,0x7F,0x3F,0x00,0x00, // 072) 0x67=103 g +0x00,0x06,0xFE,0xFE,0x66,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 073) 0x68=104 h +0x00,0x00,0x00,0x00,0x30,0xF6,0xF6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 074) 0x69=105 i +0x00,0x00,0x00,0x00,0x00,0x30,0xF6,0xF6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x7F,0x3F,0x00,0x00,0x00,0x00, // 075) 0x6A=106 j +0x00,0x06,0xFE,0xFE,0x06,0x80,0xF0,0xF0,0x70,0x30,0x30,0x00,0x00,0x60,0x7F,0x7F,0x63,0x07,0x0F,0x7C,0x78,0x70,0x60,0x00, // 076) 0x6B=107 k +0x00,0x00,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 077) 0x6C=108 l +0x30,0xF0,0xE0,0x30,0x30,0xF0,0xE0,0x30,0x30,0xF0,0xE0,0x00,0x60,0x7F,0x7F,0x60,0x00,0x7F,0x7F,0x00,0x60,0x7F,0x7F,0x60, // 078) 0x6D=109 m +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 079) 0x6E=110 n +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 080) 0x6F=111 o + // +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0xC0,0xFF,0xFF,0xD8,0x30,0x30,0x30,0x38,0x1F,0x0F,0x00, // 081) 0x70=112 p +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x60,0xF0,0xF0,0x30,0x00,0x00,0x0F,0x1F,0x38,0x30,0x30,0x30,0xD8,0xFF,0xFF,0xC0,0x00, // 082) 0x71=113 q +0x00,0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x70,0x60,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00, // 083) 0x72=114 r +0x00,0xE0,0xF0,0x30,0x30,0x30,0x30,0x30,0x70,0x70,0x60,0x00,0x00,0x19,0x3B,0x7B,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 084) 0x73=115 s +0x00,0x00,0x00,0x30,0xFE,0xFE,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7F,0x60,0x60,0x00,0x00,0x00,0x00, // 085) 0x74=116 t +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x30,0x7F,0x7F,0x60,0x00, // 086) 0x75=117 u +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x07,0x1F,0x78,0x78,0x1F,0x07,0x00,0x00,0x00, // 087) 0x76=118 v +0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x03,0x1F,0x7C,0x70,0x1E,0x1E,0x70,0x7C,0x1F,0x03,0x00, // 088) 0x77=119 w +0x00,0x00,0x30,0x70,0xF0,0x80,0x80,0xF0,0x70,0x30,0x00,0x00,0x00,0x00,0x60,0x70,0x7D,0x0F,0x0F,0x7D,0x70,0x60,0x00,0x00, // 089) 0x78=120 x +0x00,0x00,0x30,0xF0,0xC0,0x00,0x00,0xC0,0xF0,0x30,0x00,0x00,0x00,0x00,0x60,0x60,0x73,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00, // 090) 0x79=121 y +0x00,0x00,0x70,0x70,0x30,0x30,0xB0,0xF0,0xF0,0x70,0x00,0x00,0x00,0x00,0x78,0x7C,0x6E,0x67,0x63,0x61,0x70,0x70,0x00,0x00, // 091) 0x7A=122 z +0x00,0x00,0x80,0xC0,0xFC,0x7E,0x07,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x3F,0x7E,0xE0,0xC0,0xC0,0x00,0x00,0x00, // 092) 0x7B=123 { +0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00, // 093) 0x7C=124 | +0x00,0x00,0x00,0x03,0x03,0x07,0x7E,0xFC,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xE0,0x7E,0x3F,0x03,0x01,0x00,0x00, // 094) 0x7D=125 } +0x00,0x80,0xC0,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x80,0x80,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x01,0x00, // 095) 0x7E=126 ~ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 096) 0x7F=127 ⌂ + // +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 097) 0x80=128 А +0x00,0x06,0xFE,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x8E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 098) 0x81=129 Б +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0x86,0xCE,0xFC,0x78,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 099) 0x82=130 В +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 100) 0x83=131 Г +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x78,0x7F,0x1F,0x18,0x18,0x18,0x18,0x1F,0x7F,0x78,0x00, // 101) 0x84=132 Д +0x00,0x06,0xFE,0xFE,0x86,0x86,0x86,0xC6,0xC6,0x0E,0x0E,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x63,0x63,0x70,0x70,0x00, // 102) 0x85=133 Е +0x00,0x06,0x7E,0xFE,0xC0,0xFE,0xFE,0xC0,0xFE,0x7E,0x06,0x00,0x00,0x60,0x7E,0x7F,0x03,0x7F,0x7F,0x03,0x7F,0x7E,0x60,0x00, // 103) 0x86=134 Ж +0x00,0x18,0x1C,0x1E,0x06,0x06,0xC6,0xC6,0xEE,0xFC,0x38,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x60,0x60,0x71,0x3F,0x1F,0x00, // 104) 0x87=135 З +0x00,0x06,0xFE,0xFE,0x06,0x80,0xE0,0x78,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x1E,0x07,0x01,0x60,0x7F,0x7F,0x60,0x00, // 105) 0x88=136 И +0x00,0x06,0xFE,0xFE,0x01,0x83,0xE3,0x79,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x1E,0x07,0x01,0x60,0x7F,0x7F,0x60,0x00, // 106) 0x89=137 Й +0x00,0x06,0xFE,0xFE,0x86,0x80,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x03,0x6F,0x7E,0x78,0x60,0x00, // 107) 0x8A=138 К +0x00,0x00,0xF0,0xFC,0x1E,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x3F,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 108) 0x8B=139 Л +0x00,0x06,0xFE,0xFE,0x78,0xE0,0xE0,0x78,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x01,0x01,0x60,0x7F,0x7F,0x60,0x00, // 109) 0x8C=140 М +0x00,0x06,0xFE,0xFE,0x86,0x80,0x80,0x86,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x01,0x01,0x61,0x7F,0x7F,0x60,0x00, // 110) 0x8D=141 Н +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x0E,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 111) 0x8E=142 О +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 112) 0x8F=143 П + // +0x00,0x06,0xFE,0xFE,0x06,0x06,0x06,0x06,0x8E,0xFC,0xF8,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x03,0x03,0x01,0x00,0x00, // 113) 0x90=144 Р +0x00,0xF8,0xFC,0x0E,0x06,0x06,0x06,0x06,0x1E,0x1C,0x18,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 114) 0x91=145 С +0x00,0x0E,0x0E,0x06,0x06,0xFE,0xFE,0x06,0x06,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 115) 0x92=146 Т +0x00,0x06,0x1E,0x7E,0xF6,0xC0,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x60,0x70,0x7D,0x1F,0x07,0x01,0x00,0x00,0x00,0x00, // 116) 0x93=147 У +0x00,0xF0,0xF8,0x1C,0x0C,0xFE,0xFE,0x0C,0x1C,0xF8,0xF0,0x00,0x00,0x0F,0x1F,0x38,0x30,0x7F,0x7F,0x30,0x38,0x1F,0x0F,0x00, // 117) 0x94=148 Ф +0x00,0x06,0x1E,0x7E,0xF6,0xC0,0xC0,0xF6,0x7E,0x1E,0x06,0x00,0x00,0x60,0x78,0x7E,0x6F,0x03,0x03,0x6F,0x7E,0x78,0x60,0x00, // 118) 0x95=149 Х +0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x7F,0x7F,0xE0,0xE0, // 119) 0x96=150 Ц +0x00,0x06,0xFE,0xFE,0x86,0x00,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 120) 0x97=151 Ч +0x00,0x06,0xFE,0xFE,0x06,0xF0,0xF0,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x00, // 121) 0x98=152 Ш +0x00,0x06,0xFE,0xFE,0x06,0xF0,0xF0,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0xE0,0xE0, // 122) 0x99=153 Щ +0x06,0x06,0xFE,0xFE,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 123) 0x9A=154 Ъ +0x00,0x06,0xFE,0xFE,0x86,0x80,0x00,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x7F,0x7F,0x61,0x7F,0x1F,0x60,0x7F,0x7F,0x60,0x00, // 124) 0x9B=155 Ы +0x00,0x06,0xFE,0xFE,0x86,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x61,0x73,0x3F,0x1E,0x00, // 125) 0x9C=156 Ь +0x00,0x18,0x1C,0x1E,0x06,0x06,0x86,0x86,0x8E,0xFC,0xF8,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x61,0x61,0x71,0x3F,0x1F,0x00, // 126) 0x9D=157 Э +0x00,0x06,0xFE,0xFE,0x86,0xF8,0xFC,0x0E,0x06,0x0E,0xFC,0xF8,0x00,0x60,0x7F,0x7F,0x61,0x1F,0x3F,0x70,0x60,0x70,0x3F,0x1F, // 127) 0x9E=158 Ю +0x00,0xF8,0xFC,0x8E,0x06,0x06,0x06,0x06,0xFE,0xFE,0x06,0x00,0x00,0x60,0x79,0x7F,0x6F,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 128) 0x9F=159 Я + // +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x00,0x1C,0x3E,0x77,0x63,0x63,0x63,0x33,0x7F,0x7F,0x60,0x00, // 129) 0xA0=160 а +0x00,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0x30,0x70,0x70,0x00,0x00,0x60,0x7F,0x7F,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 130) 0xA1=161 б +0x00,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x60,0x7F,0x7F,0x63,0x63,0x63,0x63,0x77,0x3F,0x1C,0x00, // 131) 0xA2=162 в +0x00,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0x30,0x70,0x70,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 132) 0xA3=163 г +0x00,0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0xF0,0xF0,0x30,0x00,0x00,0xF0,0xFF,0x3F,0x30,0x30,0x30,0x30,0x3F,0xFF,0xF0,0x00, // 133) 0xA4=164 д +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x76,0x66,0x66,0x66,0x66,0x76,0x37,0x17,0x00, // 134) 0xA5=165 е +0x00,0x30,0x70,0xF0,0x80,0xF0,0xF0,0x80,0xF0,0x70,0x30,0x00,0x00,0x60,0x70,0x7D,0x0F,0x7F,0x7F,0x0F,0x7D,0x70,0x60,0x00, // 135) 0xA6=166 ж +0x00,0xC0,0xE0,0xF0,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x18,0x38,0x78,0x60,0x63,0x63,0x63,0x77,0x3F,0x1C,0x00, // 136) 0xA7=167 з +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0xB0,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x7C,0x0E,0x07,0x63,0x7F,0x7F,0x60,0x00, // 137) 0xA8=168 и +0x00,0x30,0xF0,0xF3,0x37,0x06,0x06,0xB7,0xF3,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x7C,0x0E,0x07,0x63,0x7F,0x7F,0x60,0x00, // 138) 0xA9=169 й +0x00,0x30,0xF0,0xF0,0x30,0x00,0x80,0xF0,0xF0,0x70,0x30,0x00,0x00,0x60,0x7F,0x7F,0x63,0x07,0x0F,0x7D,0x78,0x70,0x60,0x00, // 139) 0xAA=170 к +0x00,0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x3F,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 140) 0xAB=171 л +0x00,0x30,0xF0,0xF0,0xC0,0x80,0x80,0xC0,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x61,0x07,0x07,0x61,0x7F,0x7F,0x60,0x00, // 141) 0xAC=172 м +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x63,0x03,0x03,0x63,0x7F,0x7F,0x60,0x00, // 142) 0xAD=173 н +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x70,0x3F,0x1F,0x00, // 143) 0xAE=174 о +0x00,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00, // 144) 0xAF=175 п + // +0x00,0x30,0xF0,0xF0,0x60,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0xC0,0xFF,0xFF,0xD8,0x30,0x30,0x30,0x38,0x1F,0x0F,0x00, // 145) 0xE0=224 р +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0xF0,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0x60,0x60,0x60,0x78,0x38,0x18,0x00, // 146) 0xE1=225 с +0x00,0x70,0x70,0x30,0x30,0xF0,0xF0,0x30,0x30,0x70,0x70,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x60,0x00,0x00,0x00,0x00, // 147) 0xE2=226 т +0x00,0x00,0x30,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x60,0x60,0x73,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00, // 148) 0xE3=227 у +0x00,0xC0,0xE0,0x70,0x30,0xF8,0xF8,0x30,0x70,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x70,0x60,0xFF,0xFF,0x60,0x70,0x3F,0x1F,0x00, // 149) 0xE4=228 ф +0x00,0x00,0x30,0x70,0xF0,0x80,0x80,0xF0,0x70,0x30,0x00,0x00,0x00,0x00,0x60,0x70,0x7D,0x0F,0x0F,0x7D,0x70,0x60,0x00,0x00, // 150) 0xE5=229 х +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x60,0x60,0x60,0x60,0x7F,0x7F,0xE0,0xE0, // 151) 0xE6=230 ц +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x03,0x07,0x06,0x06,0x06,0x66,0x7F,0x7F,0x60,0x00, // 152) 0xE7=231 ч +0x00,0x30,0xF0,0xF0,0x30,0x80,0x80,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x00, // 153) 0xE8=232 ш +0x00,0x30,0xF0,0xF0,0x30,0x80,0x80,0x30,0xF0,0xF0,0x30,0x00,0x00,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0x60,0x7F,0x7F,0xE0,0xE0, // 154) 0xE9=233 щ +0x30,0x30,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 155) 0xEA=234 ъ +0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x30,0xF0,0xF0,0x30,0x60,0x7F,0x7F,0x63,0x63,0x77,0x3E,0x1C,0x60,0x7F,0x7F,0x60, // 156) 0xEB=235 ы +0x00,0x30,0xF0,0xF0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x7F,0x7F,0x63,0x63,0x63,0x63,0x77,0x3E,0x1C,0x00, // 157) 0xEC=236 ь +0x00,0xC0,0xE0,0xF0,0x30,0x30,0x30,0x30,0x70,0xE0,0xC0,0x00,0x00,0x18,0x38,0x78,0x60,0x60,0x63,0x63,0x73,0x3F,0x1F,0x00, // 158) 0xED=237 э +0x30,0xF0,0xF0,0x30,0xC0,0xE0,0x70,0x30,0x30,0x70,0xE0,0xC0,0x60,0x7F,0x7F,0x63,0x1F,0x3F,0x70,0x60,0x60,0x70,0x3F,0x1F, // 159) 0xEE=238 ю +0x00,0xC0,0xE0,0x70,0x30,0x30,0x30,0x30,0xF0,0xF0,0x30,0x00,0x00,0x61,0x73,0x7F,0x6E,0x06,0x06,0x66,0x7F,0x7F,0x60,0x00, // 160) 0xEF=239 я + // +0x00,0x0C,0xFC,0xFF,0x8F,0x8C,0x8C,0xCF,0xCF,0x1C,0x1C,0x00,0x00,0x60,0x7F,0x7F,0x61,0x61,0x61,0x63,0x63,0x70,0x70,0x00, // 161) 0xF0=240 Ё +0x00,0xC0,0xE0,0x76,0x36,0x30,0x30,0x36,0x76,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x76,0x66,0x66,0x66,0x66,0x76,0x37,0x17,0x00, // 162) 0xF1=241 ё +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 163) 0xF2=242 Є +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 164) 0xF3=243 є +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 165) 0xF4=244 Ї +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 166) 0xF5=245 ї +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 167) 0xF6=246 Ў +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 168) 0xF7=247 ў +0x00,0x3C,0x7E,0x66,0x66,0x7E,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 169) 0xF8=248 ° +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 170) 0xF9=249 ∙ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 171) 0xFA=250 · +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 172) 0xFB=251 √ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 173) 0xFC=252 № +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 174) 0xFD=253 ¤ +0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF , // 175) 0xFE=254 ■ +0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 176) 0xFF=255   + // +0x01, 0xAF, 0x30 // В таблице имеется (1) пустой интервал, который находится после символа с кодом (175) и состоит из (48) отсутствующих символов. + // Допускается использовать до 3 пустых интервалов. Пример: 0x03, 0xAA, 0x10, 0xCC, 0x10, 0xEE, 0x10 +}; // 3 пустых интервала, по (16) отсутствующий символов в каждом, находятся после символов с кодами (170, 204 и 238). + +const uint8_t MediumNumbers[] PROGMEM = // Шрифт MediumNumbers +{ // +0x0c, 0x10, 0x2d, 0x0d, // ширина символов (12), высота символов (16), код первого символа (45), количество символов (13) +0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, // 001) 0x2D=045 - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, // 002) 0x2E=046 . +0x00, 0x00, 0x02, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x02, 0x00, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x81, 0x00, 0x00, // 003) 0x2F=047 / +0x00, 0xfc, 0x7a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7a, 0xfc, 0x00, 0x00, 0x7e, 0xbc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbc, 0x7e, 0x00, // 004) 0x30=048 0 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x00, // 005) 0x31=049 1 +0x00, 0x00, 0x02, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x7a, 0xfc, 0x00, 0x00, 0x7e, 0xbd, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x81, 0x00, 0x00, // 006) 0x32=050 2 +0x00, 0x00, 0x02, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x7a, 0xfc, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 007) 0x33=051 3 +0x00, 0xfc, 0x78, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x78, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x3d, 0x7e, 0x00, // 008) 0x34=052 4 +0x00, 0xfc, 0x7a, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x02, 0x00, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 009) 0x35=053 5 +0x00, 0xfc, 0x7a, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x02, 0x00, 0x00, 0x00, 0x7e, 0xbd, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 010) 0x36=054 6 +0x00, 0x00, 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7a, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x00, // 011) 0x37=055 7 +0x00, 0xfc, 0x7a, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x7a, 0xfc, 0x00, 0x00, 0x7e, 0xbd, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 012) 0x38=056 8 +0x00, 0xfc, 0x7a, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x7a, 0xfc, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xbd, 0x7e, 0x00, // 013) 0x39=057 9 + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // + +const uint8_t BigNumbers[] PROGMEM = // Шрифт BigNumbers +{ // +0x0e, 0x18, 0x2d, 0x0d, // ширина символов (14), высота символов (24), код первого символа (45), количество символов (13) +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 001) 0x2D=045 - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xe0, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, // 002) 0x2E=046 . +0x00, 0x00, 0x02, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, // 003) 0x2F=047 / +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0xef, 0xc7, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc7, 0xef, 0x00, 0x00, 0x7f, 0xbf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 004) 0x30=048 0 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf8, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc7, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3f, 0x7f, 0x00, // 005) 0x31=049 1 +0x00, 0x00, 0x02, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0xe0, 0xd0, 0xb8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3b, 0x17, 0x0f, 0x00, 0x00, 0x7f, 0xbf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, // 006) 0x32=050 2 +0x00, 0x00, 0x02, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xbb, 0xd7, 0xef, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 007) 0x33=051 3 +0x00, 0xfc, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf8, 0xfc, 0x00, 0x00, 0x0f, 0x17, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xbb, 0xd7, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3f, 0x7f, 0x00, // 008) 0x34=052 4 +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x17, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xb8, 0xd0, 0xe0, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 009) 0x35=053 5 +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0xef, 0xd7, 0xbb, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xb8, 0xd0, 0xe0, 0x00, 0x00, 0x7f, 0xbf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 010) 0x36=054 6 +0x00, 0x00, 0x02, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xc7, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3f, 0x7f, 0x00, // 011) 0x37=055 7 +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0xef, 0xd7, 0xbb, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xbb, 0xd7, 0xef, 0x00, 0x00, 0x7f, 0xbf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 012) 0x38=056 8 +0x00, 0xfc, 0xfa, 0xf6, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xf6, 0xfa, 0xfc, 0x00, 0x00, 0x0f, 0x17, 0x3b, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xbb, 0xd7, 0xef, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xbf, 0x7f, 0x00, // 013) 0x39=057 9 + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // + +const uint8_t MegaNumbers[] PROGMEM = // Шрифт MegaNumbers +{ // +0x18,0x28,0x2D,0x0D, // ширина символов (24), высота символов (40), код первого символа (45), количество символов (13) +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 001) 0x2D=045 - () +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF8,0xFC,0xFE,0xFE,0xFC,0xF8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 002) 0x2E=046 . +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x1F,0x3F,0x3F,0x1F,0x0F,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x7C,0xFE,0xFF,0xFF,0xFE,0x7C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 003) 0x2F=047 / (:) +0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF0,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xFC,0xFE,0x3F,0x07,0x01,0x03,0x03,0x07,0x0F,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0xF0,0x00,0x00,0x00,0x00,0xFC,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x0F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0xF8,0xF0,0xE0,0xE0,0xC0,0x80,0xE0,0xF8,0xFF,0x3F,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x07,0x0F,0x1F,0x1F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 004) 0x30=048 0 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x07,0x07,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x0F,0x1F,0x3F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00, // 005) 0x31=049 1 +0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0xF0,0xF0,0xE0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1C,0x3E,0x7F,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x03,0x01,0x83,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF8,0xFC,0xFF,0xFF,0x7F,0x3F,0x1F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0,0xF8,0xFE,0xDF,0xEF,0xEF,0xE7,0xE3,0xE1,0xE1,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x1E,0x1F,0x0F,0x0F,0x0F,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0F,0x0F,0x1F,0x1F,0x0F,0x07,0x03,0x00,0x00,0x00, // 006) 0x32=050 2 +0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF0,0xF0,0xE0,0xE0,0xC0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x0F,0x1F,0x0F,0x07,0x03,0x01,0x81,0xC0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x0F,0x0F,0x0F,0x1F,0x3F,0xFF,0xFF,0xFF,0xF9,0xF0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x18,0x3C,0x7E,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xC1,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x0F,0x0F,0x0F,0x07,0x07,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00, // 007) 0x33=051 3 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xF8,0xF8,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF8,0x3C,0x1F,0x07,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xFC,0xFF,0xE7,0xE3,0xE0,0xE0,0xE0,0xE0,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0xE0,0xE0,0xE0,0xE0,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0x83,0xC3,0xC3,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x0F,0x0F,0x0F,0x07,0x03,0x01,0x01,0x00,0x00,0x00, // 008) 0x34=052 4 +0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x78,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x07,0x01,0x81,0xC1,0xC1,0xE1,0xF1,0xE1,0xE1,0xC1,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x3F,0x1F,0x0E,0x07,0x07,0x07,0x07,0x0F,0x1F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0xF8,0x00,0x00,0x00,0x00,0x00,0x60,0xF0,0xFC,0xFC,0xFC,0xF8,0xF0,0xF0,0xE0,0xC0,0xC0,0x80,0x80,0xE0,0xFF,0xFF,0x7F,0x3F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x07,0x07,0x0F,0x0F,0x0F,0x0F,0x07,0x07,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00, // 009) 0x35=053 5 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF0,0xF0,0xE0,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0xFC,0xFE,0x7F,0x0F,0x01,0x01,0x03,0x83,0x87,0xCF,0xCF,0xDF,0x8F,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xB8,0x1C,0x1E,0x0E,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFE,0xF8,0x00,0x00,0x00,0x00,0x00,0x0F,0x3F,0xFF,0xFF,0xFF,0xFF,0xFC,0xF8,0xF0,0xE0,0xC0,0xC0,0x80,0xE0,0xFF,0xFF,0x3F,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x07,0x0F,0x0F,0x0F,0x0F,0x07,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 010) 0x36=054 6 +0x00,0x00,0x00,0x00,0xC0,0xF0,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x78,0x38,0x00,0x00,0x00,0x00,0x18,0x1E,0x1F,0x07,0x03,0x03,0x01,0x01,0x01,0x81,0xC1,0xF1,0xF9,0xFD,0x3F,0x0F,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFC,0xFE,0xFF,0xFF,0x3F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x07,0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 011) 0x37=055 7 +0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF0,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFC,0xFF,0xFF,0xE7,0xC1,0xC1,0x81,0x81,0x81,0x81,0x83,0xC3,0xFF,0xFF,0x7F,0x3F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xCF,0xFF,0xFF,0x7F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F,0x7F,0xFF,0xFF,0xFE,0xF8,0xE0,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xF8,0xF0,0xE0,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,0xFB,0x7F,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x07,0x0F,0x0F,0x0F,0x0F,0x1F,0x1F,0x0F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 012) 0x38=056 8 +0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF0,0xF8,0xF8,0xF8,0xF0,0xE0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF8,0xFE,0xFF,0xFF,0x87,0x01,0x01,0x01,0x03,0x07,0x0F,0x1F,0x7F,0xFF,0xFF,0xFF,0xFE,0xFC,0xE0,0x00,0x00,0x00,0x00,0x03,0x1F,0x7F,0xFF,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0x70,0x38,0x3C,0x1E,0xCF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0xF9,0xFD,0xFB,0xF1,0xF0,0xE0,0xC0,0xC0,0xE0,0xFC,0xFF,0x7F,0x1F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x07,0x07,0x0F,0x0F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 013) 0x39=057 9 + // +0 // В таблице имеется (0) пустых интервалов. См. шрифты с Русскими символами. +}; // diff --git a/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt.cpp b/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt.cpp new file mode 100644 index 0000000..4db69c2 --- /dev/null +++ b/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt.cpp @@ -0,0 +1,229 @@ +#include "iarduino_OLED_txt.h" // + // +// Инициализация дисплея: // Возвращаемое значение: отсутствует +void iarduino_OLED_txt::begin(void){ // Параметр: отсутствует +// Инициируем работу с шиной I2C: // + objI2C->begin(100); // Инициируем передачу данных по шине I2C на скорости 100 кГц. +// Подготавливаем к работе дисплей: // + _sendCommand(SSD1306_DISPLAY_OFF); // Выключаем дисплей. + _sendCommand(SSD1306_SET_DISPLAY_CLOCK); _sendCommand(0x80); // Устанавливаем частоту обновления дисплея в значение 0x80 (по умолчанию). + _sendCommand(SSD1306_SET_MULTIPLEX_RATIO); _sendCommand(0x3F); // Устанавливаем multiplex ratio (коэффициент мультиплексирования COM выводов) в значение 0x3F (по умолчанию). + _sendCommand(SSD1306_SET_DISPLAY_OFFSET); _sendCommand(0x00); // Устанавливаем смещение дисплея в 0 (без смещения). + _sendCommand(SSD1306_SET_START_LINE|0); // Устанавливаем смещение ОЗУ в значение 0 (без смещения). + _sendCommand(SSD1306_CHARGE_DCDC_PUMP); _sendCommand(0x14); // Настраиваем схему питания (0x14 - включить внутренний DC-DC преобразователь, 0x10 - отключить внутренний DC/DC). + _sendCommand(SSD1306_ADDR_MODE); _sendCommand(0x00); // Устанавливаем режим автоматической адресации (0x00-горизонтальная, 0x01-вертикальная, 0x10-страничная.) + _sendCommand(SSD1306_SET_REMAP_L_TO_R); // Устанавливаем режим строчной развертки (слева/направо). + _sendCommand(SSD1306_SET_REMAP_T_TO_D); // Устанавливаем режим кадровой развертки (сверху/вниз). + _sendCommand(SSD1306_SET_COM_PINS); _sendCommand(0x12); // Устанавливаем аппаратную конфигурация COM выводов в значение 0x12 (по умолчанию) + _sendCommand(SSD1306_SET_CONTRAST); _sendCommand(0xCF); // Устанавливаем контрастность в значение 0xCF (допустимы значения от 0x00 до 0xFF). + _sendCommand(SSD1306_SET_PRECHARGE_PERIOD); _sendCommand(0xF1); // Настраиваем схему DC/DC преобразователя (0xF1 - Vcc снимается с DC/DC преобразователя, 0x22 - Vcc подается извне). + _sendCommand(SSD1306_SET_VCOM_DESELECT); _sendCommand(0x40); // Устанавливаем питание светодиодов VcomH в значение выше чем по умолчанию (0x30), что увеличит яркость дисплея (допустимые значения: 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70). + _sendCommand(SSD1306_RAM_ON); // Разрешаем отображать содержимое RAM памяти. + _sendCommand(SSD1306_INVERT_OFF); // Отключаем инверсию. + _sendCommand(SSD1306_DISPLAY_ON); // Включаем дисплей. + clrScr(); // Чистим экран. +} // + // +// Очистка дисплея: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::clrScr(bool color){ // Параметр: флаг закрашивания экрана в белый цвет. + uint8_t i[128]; // Создаём массив для закраски одной страницы. + for(uint8_t j=0; j<128; j++){i[j]=color?0xFF:0x00;} // Устанавливаем все биты массива в 1 или 0, зависит от флага color. + for(uint8_t j=0; j< 8; j++){ // Проходим по всем страницам дисплея. + _sendCommand(SSD1306_ADDR_PAGE); // Установка адреса страницы. + _sendCommand(j); // Начало. + _sendCommand(j); // Конец. + _sendCommand(SSD1306_ADDR_COLUMN); // Установка адреса колонки. + _sendCommand(0); // Начало - № первой колонки экрана. + _sendCommand(127); // Конец - № последней колонки экрана. + _sendData(i, 128); // Отправляем массив i как данные для вывода на экран. + } // +} // + // +// Инверсия цвета дисплея: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::invScr(bool invert){ // Параметр: флаг инвертирования - да/нет. + if(invert) {_sendCommand(SSD1306_INVERT_ON );} // Если флаг invert установлен - включаем инверсию. + else {_sendCommand(SSD1306_INVERT_OFF);} // Если флаг invert сброшен - отключаем инверсию. +} // + // +// Выбор шрифта для вывода текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::setFont(uint8_t* font){ // Параметр: название шрифта. + insFont.font = font; // Сохраняем указатель на первый байт массива в области памяти программ. + insFont.width = pgm_read_byte(&font[0]); // Сохраняем ширину символов выбранного шрифта читая её из 0 байта массива по указателю font. + insFont.height = pgm_read_byte(&font[1]); // Сохраняем высоту символов выбранного шрифта читая её из 1 байта массива по указателю font. + insFont.firstSymbol = pgm_read_byte(&font[2]); // Сохраняем код первого симола выбран. шрифта читая его из 2 байта массива по указателю font. + insFont.sumSymbol = pgm_read_byte(&font[3]); // Сохраняем количество символов в выбр шрифте читая их из 3 байта массива по указателю font. + insFont.setFont = true; // Устанавливаем флаг выбора шрифта. + uint16_t i = (uint16_t) insFont.sumSymbol * insFont.width * insFont.height / 8 + 0x04; // Определяем позицию бита указывающего количество пустых интервалов в массиве шрифта. + uint16_t j = pgm_read_byte(&font[i]); // Определяем количество пустых интервалов в массиве шрифта. + insFont.startSpace[0]=0xFF; insFont.sumSpace[0]=0; // Указываем что первый пустой интервал в массиве шрифта находится после символа с кодом (0xFF) и состоит из 0 символов + insFont.startSpace[1]=0xFF; insFont.sumSpace[1]=0; // Указываем что второй пустой интервал в массиве шрифта находится после символа с кодом (0xFF) и состоит из 0 символов + insFont.startSpace[2]=0xFF; insFont.sumSpace[2]=0; // Указываем что третий пустой интервал в массиве шрифта находится после символа с кодом (0xFF) и состоит из 0 символов + if(j>0) { insFont.startSpace[0]=pgm_read_byte(&font[i+1]); // Если количество пустых интервалов больше 0, то сохраняем начало первого пустого интервала символов + insFont.sumSpace [0]=pgm_read_byte(&font[i+2]);} // и размер первого пустого интервала символов + if(j>1) { insFont.startSpace[1]=pgm_read_byte(&font[i+3]); // Если количество пустых интервалов больше 1, то сохраняем начало второго пустого интервала символов + insFont.sumSpace [1]=pgm_read_byte(&font[i+4]);} // и размер второго пустого интервала символов + if(j>2) { insFont.startSpace[2]=pgm_read_byte(&font[i+5]); // Если количество пустых интервалов больше 2, то сохраняем начало третьего пустого интервала символов + insFont.sumSpace [2]=pgm_read_byte(&font[i+6]);} // и размер третьего пустого интервала символов +} // + // +// Установка курсора в указанную позицию // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::setCursor(int col, int str){ // Параметры: № колонки, № строки (страницы). + if(col<128){numX=col;} if(str<8){numY=str;} // Сохраняем указанные позиции курсора, если они входят в диапазон допустимых +} // + // +// Вывод текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(char* txt, int col, int str){ // Параметры: текст, № колонки, № строки (страницы). + _print(_codingCP866(txt), col, str); // Вызываем функцию вывода текста _print(). +} // + // +// Вывод текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(String txt, int col, int str){ // Параметры: текст, № колонки, № строки (страницы). + char i[txt.length()+1]; txt.toCharArray(i,txt.length()+1); _print(_codingCP866(i), col, str); // Преобразуем String в char* и вызываем функцию вывода текста _print(). +} // + // +// Вывод текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(const char* txt, int col, int str){ // Параметры: текст, № колонки, № строки (страницы). + char i[strlen(txt)+1]; for(uint8_t j=0; j<=strlen(txt); j++){i[j]=txt[j];} _print(_codingCP866(i),col,str); // Преобразуем const char* в char* и вызываем функцию вывода текста _print(). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(int8_t num, int col, int str, uint8_t sys){ // Параметры: число, № колонки, № строки (страницы), система счисления. + print(int32_t(num), col, str, sys); // Преобразуем int8_t в int32_t и вызываем функцию вывода числа print(int32_t). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(uint8_t num, int col, int str, uint8_t sys){ // Параметры: число, № колонки, № строки (страницы), система счисления. + print(uint32_t(num), col, str, sys); // Преобразуем uint8_t в uint32_t и вызываем функцию вывода числа print(uint32_t). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(int16_t num, int col, int str, uint8_t sys){ // Параметры: число, № колонки, № строки (страницы), система счисления. + print(int32_t(num), col, str, sys); // Преобразуем int16_t в int32_t и вызываем функцию вывода числа print(int32_t). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(uint16_t num, int col, int str, uint8_t sys){ // Параметры: число, № колонки, № строки (страницы), система счисления. + print(uint32_t(num), col, str, sys); // Преобразуем uint16_t в uint32_t и вызываем функцию вывода числа print(uint32_t). +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(int32_t num, int col, int str, uint8_t sys){ // Параметры: число, № колонки, № строки (страницы), система счисления. + int8_t i=2; int32_t j=1; while(num/j){j*=sys; i++;} // Определяем количество разрядов числа (i = количество разрядов + 2, j = множитель кратный основанию системы счисления) + char k[i]; i--; k[i]=0; i--; if(num>0) {k[i]=0; i--;} // Создаём строку k из i символов и добавляем символ(ы) конца строки. + uint32_t n=num<0?num*-1:num; while(i) {k[i]=_ItoAa(n%sys); n/=sys; i--;} // Заполняем строку k. + if(num>=0){k[i]=_ItoAa(n%sys);}else{k[i]='-';} // Добавляем первый символ (либо первая цифра, либо знак минус). + print(k, col, str); // Выводим строку k. +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(uint32_t num, int col, int str, uint8_t sys){ // Параметры: число, № колонки, № строки (страницы), система счисления. + int8_t i=1; uint32_t j=1; while(num/j){j*=sys; i++;} if(num==0){i++;} // Определяем количество разрядов числа (i = количество разрядов + 1, j = множитель кратный основанию системы счисления) + char k[i]; i--; k[i]=0; while(i){k[i-1]=_ItoAa(num%sys); num/=sys; i--;} // Определяем строку k из i символов и заполняем её. + print(k, col, str); // Выводим строку k. +} // + // +// Вывод чисел: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::print(double num, int col, int str, uint8_t sum){ // Параметры: число, № колонки, № строки (страницы), количество знаков после запятой + uint32_t i=1; while(sum){i*=10; sum--;} // i=10^sum. + print(int32_t(num), col, str); // Выводим целую часть числа. + print("."); // Выводим символ разделителя. + print(uint32_t(num*i*(num<0?-1:1))%i); // Выводим дробную часть числа. +} // + // +// Вывод текста: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::_print(char* txt, int col, int str){ // Параметры: текст, № колонки, № строки (страницы). + if(insFont.setFont==false || insFont.height%8>0){return;} // Если шрифт не выбран или его высота не кратна 8 пикселям, то выходим из функции. + uint16_t len=strlen(txt)*insFont.width; if(len>128){len=128/insFont.width*insFont.width;} // Определяем количество колонок которое занимают выводимые символы. + uint16_t num; // Объявляем переменную для хранения номера байта в массиве шрифта. + switch(col){ // Колонка с которой требуется начать вывод текста ... + case OLED_L: numX=0; break; // Определяем начальную колонку для выравнивания по левому краю. + case OLED_C: numX=(128-len)/2; break; // Определяем начальную колонку для выравнивания по центру. + case OLED_R: numX= 128-len; break; // Определяем начальную колонку для выравнивания по правому краю. + case OLED_N: numX=numX; break; // Начальной колонкой останется та, на которой был закончен вывод предыдущего текста. + default : numX=col; break; // Начальная колонка определена пользователем. + } // + switch(str){ // Строка с которой требуется начать вывод текста ... + case OLED_T: numY=insFont.height/8-1; break; // Определяем начальную строку для выравнивания по верхнему краю. + case OLED_C: numY=(8-insFont.height/8)/2+insFont.height/8/2; break; // Определяем начальную строку для выравнивания по центру. + case OLED_B: numY=7; break; // Определяем начальную строку для выравнивания по нижнему краю. + case OLED_N: numY=numY; break; // Начальной строкой останется та, на которой выведен предыдущий текст или изображение. + default : numY=str; break; // Начальная строка определена пользователем. + } // + if(numX+len>128){len=(128-numX)/insFont.width*insFont.width;} // Пересчитываем количество колонок которое занимают выводимые символы, с учётом начальной позиции. + uint8_t data[len]; // Объявляем массив для вывода данных. + for(int8_t p=0; p=0 ){ // Если страница символа находится в пределах страницы экрана, то ... + if( (int8_t) numY+p+1-(insFont.height/8) <=7 ){ // Если страница символа находится в пределах страницы экрана, то ... + for(uint8_t n=0; n<(len/insFont.width); n++){ // Проходим по выводимым символам... + num = uint8_t(txt[n]); // Присваиваем переменной num код выводимого символа. + if(insFont.startSpace[0] 0 &&numIn <0xFF ){ // Если код текущего символа строки StrIn больше 0 и № текушего символа строки StrIn меньше 255, то ... + if(charThis==0xD0&&charNext>=0x90&&charNext<=0xBF){StrOut[numOut]=charNext-0x10; numIn++;}else // Если код текущего символа равен 208, а за ним следует символ с кодом 144...191, значит это буква «А»...«п» требующая преобразования к коду 128...175 + if(charThis==0xD0&&charNext==0x81 ){StrOut[numOut]= 0xF0; numIn++;}else // Если код текущего символа равен 208, а за ним следует символ с кодом 129 , значит это буква «Ё» требующая преобразования к коду 240 + if(charThis==0xD1&&charNext>=0x80&&charNext<=0x8F){StrOut[numOut]=charNext+0x60; numIn++;}else // Если код текущего символа равен 209, а за ним следует символ с кодом 128...143, значит это буква «р»...«я» требующая преобразования к коду 224...239 + if(charThis==0xD1&&charNext==0x91 ){StrOut[numOut]= 0xF1; numIn++;}else // Если код текущего символа равен 209, а за ним следует символ с кодом 145 , значит это буква «ё» требующая преобразования к коду 241 + {StrOut[numOut]=charThis;} numIn++; // Иначе не меняем символ. + numOut++; charThis=StrIn[numIn]; charNext=StrIn[numIn+1]; // Переходим к следующему символу. + } StrOut[numOut]='\0'; // Добавляем символ конца строки и возвращаем строку StrOut. + break; // + // Преобразуем текст из кодировки WINDOWS-1251: // + case TXT_WIN1251: // + while (charThis> 0 &&numIn <0xFF){ // Если код текущего символа строки StrIn больше 0 и № текушего символа строки StrIn меньше 255, то ... + if(charThis>=0xC0&&charThis<=0xEF){StrOut[numOut]=charThis-0x40;}else // Если код текущего символа равен 192...239, значит это буква «А»...«п» требующая преобразования к коду 128...175 + if(charThis>=0xF0&&charThis<=0xFF){StrOut[numOut]=charThis-0x10;}else // Если код текущего символа равен 240...255, значит это буква «р»...«я» требующая преобразования к коду 224...239 + if(charThis==0xA8 ){StrOut[numOut]= 0xF0;}else // Если код текущего символа равен 168 , значит это буква «Ё» требующая преобразования к коду 240 + if(charThis==0xB8 ){StrOut[numOut]= 0xF1;}else // Если код текущего символа равен 184 , значит это буква «ё» требующая преобразования к коду 241 + {StrOut[numOut]=charThis;} // Иначе не меняем символ. + numIn++; numOut++; charThis=StrIn[numIn]; // Переходим к следующему символу. + } StrOut[numOut]='\0'; // Добавляем символ конца строки и возвращаем строку StrOut. + break; // + } return StrOut; // Возвращаем строку StrOut. +} // + // +// Отправка байта команды: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::_sendCommand(uint8_t command){ // Параметр: код команды. + objI2C->writeByte(dispAddr, SSD1306_COMMAND, command); // Отправляем 3 байта: адрес dispAddr с битом rw=0 (запись), SSD1306_COMMAND, command. +} // + // +// Отправка указанного количества байтов данных: // Возвращаемое значение: отсутствует. +void iarduino_OLED_txt::_sendData(uint8_t* data, uint8_t sum){ // Параметры: указатель на начало массива данных, количество передаваемых байт + objI2C->writeBytes(dispAddr, SSD1306_DATA, data, sum); // отправляем адрес dispAddr с битом rw=0 (запись), SSD1306_DATA и sum байт из массива data. +} // \ No newline at end of file diff --git a/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt.h b/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt.h new file mode 100644 index 0000000..3937ddb --- /dev/null +++ b/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt.h @@ -0,0 +1,143 @@ +// Библиотека для вывода текста на OLED дисплеи: http://iarduino.ru/shop/Displei/ekran-0-96-128x64-oled-i2c-belyy.html +// Версия: 1.0.0 +// Последнюю версию библиотеки Вы можете скачать по ссылке: http://iarduino.ru +// Для вывода текста и графики воспользуйтесь библиотекой: http://iarduino.ru +// Подробное описание функции бибилиотеки доступно по ссылке: http://wiki.iarduino.ru +// Библиотека является собственностью интернет магазина iarduino.ru и может свободно использоваться и распространяться! +// При публикации устройств или скетчей с использованием данной библиотеки, как целиком, так и её частей, +// в том числе и в некоммерческих целях, просим Вас опубликовать ссылку: http://iarduino.ru +// Автор библиотеки: Панькин Павел sajaem@narod.ru +// Если у Вас возникли технические вопросы, напишите нам: shop@iarduino.ru + // +#ifndef iarduino_OLED_txt_h // +#define iarduino_OLED_txt_h // + // +#if defined(ARDUINO) && (ARDUINO >= 100) // +#include // +#else // +#include // +#endif // + // +#include // Подключаем файл iarduino_OLED_txt_I2C.h - для работы с шиной I2C (используя функции производного класса iarduino_I2C) + // +#define OLED_T 250 // Выравнивание по верхнему краю. +#define OLED_B 251 // Выравнивание по нижнему краю. +#define OLED_L 252 // Выравнивание по левому краю. +#define OLED_C 253 // Выравнивание по центру. +#define OLED_R 254 // Выравнивание по правому краю. +#define OLED_N 255 // Оставить текущее значение строки/столбца. +#define IMG_RAM 0 // Тип памяти в которой хранится массив изображения - ОЗУ +#define IMG_ROM 1 // Тип памяти в которой хранится массив изображения - ПЗУ +#define TXT_CP866 0 // Название кодировки в которой написан текст для функции print. +#define TXT_UTF8 1 // Название кодировки в которой написан текст для функции print. +#define TXT_WIN1251 2 // Название кодировки в которой написан текст для функции print. + // +#define SSD1306_ADDRESS 0x3C // Установка контрастности. За данной командой должен быть отправлен байт контрастности от 00 до FF (по умолчанию 7F=127). +// Базовые команды: // +#define SSD1306_SET_CONTRAST 0x81 // Установка контрастности. За данной командой должен быть отправлен байт контрастности от 00 до FF (по умолчанию 7F=127). +#define SSD1306_RAM_ON 0xA4 // Включить изображение. Разрешить отображать содержимое RAM памяти. +#define SSD1306_RAM_OFF 0xA5 // Выключить изображение. Запретить отображать содержимое RAM памяти. +#define SSD1306_INVERT_OFF 0xA6 // Активный бит данных = 1. Пиксель установленный в 1 будет светиться. +#define SSD1306_INVERT_ON 0xA7 // Активный бит данных = 1. Пиксель установленный в 1 будет выключен. +#define SSD1306_DISPLAY_OFF 0xAE // Выключить дисплей (спящий режим). +#define SSD1306_DISPLAY_ON 0xAF // Включить дисплей (нормальный режим). +#define SSD1306_NOP 0xE3 // Пустая команда (как NOP в Ассемблере). +// Команды прокрутки: // +#define SSD1306_SCROLL_HORIZONTAL_RIGHT 0x26 // Настройка непрерывной горизонтальной прокрутки вправо. За данной командой должны быть отправлены 6 байт настроек +#define SSD1306_SCROLL_HORIZONTAL_LEFT 0x27 // Настройка непрерывной горизонтальной прокрутки влево. За данной командой должны быть отправлены 6 байт настроек +#define SSD1306_SCROLL_DIAGONAL_RIGHT 0x29 // Настройка непрерывной диагональной прокрутки вправо. За данной командой должны быть отправлены 5 байт настроек +#define SSD1306_SCROLL_DIAGONAL_LEFT 0x2A // Настройка непрерывной диагональной прокрутки влево. За данной командой должны быть отправлены 5 байт настроек +#define SSD1306_SCROLL_OFF 0x2E // Включить прокрутку. +#define SSD1306_SCROLL_ON 0x2F // Выключить прокрутку. +#define SSD1306_SCROLL_VERTICAL 0xA3 // Настройка непрерывной вертикальной прокрутки. За данной командой должны быть отправлены 2 байта настроек +// Команды адресации: // +#define SSD1306_ADDR_COLUMN_LBS 0x00 // Установка младшей части адреса колонки на странице. У данной команды младщие 4 бита должны быть изменены на младшие биты адреса. Комадна предназначена только для режима страничной адресации. +#define SSD1306_ADDR_COLUMN_MBS 0x10 // Установка старшей части адреса колонки на странице. У данной команды младщие 4 бита должны быть изменены на старшие биты адреса. Комадна предназначена только для режима страничной адресации. +#define SSD1306_ADDR_MODE 0x20 // Выбор режима адресации. За данной командой должен быть отправлен байт младшие биты которого определяют режим: 00-горизонтальная (с переходом на новую страницу (строку)) / 01-вертикальная (с переходом на новую колонку) / 10-страничная (только по выбранной странице). +#define SSD1306_ADDR_COLUMN 0x21 // Установка адреса колонки. За данной командой должны быть отправлены 2 байта: начальный адрес, конечный адрес. Так можно определить размер экрана в колонках по ширине. +#define SSD1306_ADDR_PAGE 0x22 // Установка адреса страницы. За данной командой должны быть отправлены 2 байта: начальный адрес, конечный адрес. Так можно определить размер экрана в строках по высоте. +#define SSD1306_ADDR_ONE_PAGE 0xB0 // Установка номера страницы которая будет выбрана для режима страничной адресации. У данной команды младщие 3 бита должны быть изменены на номер страницы. Комадна предназначена только для режима страничной адресации. +// Команды аппаратной настройки: // +#define SSD1306_SET_START_LINE 0x40 // Установить начальный адрес ОЗУ (смещение памяти). У данной команды младщие 6 битов должны быть изменены на начальный адрес ОЗУ. +#define SSD1306_SET_REMAP_R_TO_L 0xA0 // Установить режим строчной развёртки справа-налево +#define SSD1306_SET_REMAP_L_TO_R 0xA1 // Установить режим строчной развёртки слева-направо +#define SSD1306_SET_MULTIPLEX_RATIO 0xA8 // Установить multiplex ratio (количество используемых выводов COM для вывода данных на дисплей). За данной командой должны быть отправлен 1 байт с указанием количества COM выводов (от 15 до 63). +#define SSD1306_SET_REMAP_D_TO_T 0xC0 // Установить режим кадровой развёртки снизу-верх +#define SSD1306_SET_REMAP_T_TO_D 0xC8 // Установить режим кадровой развёртки сверху-вниз +#define SSD1306_SET_DISPLAY_OFFSET 0xD3 // Установить смещение дисплея. За данной командой должны быть отправлен 1 байт с указанием вертикального сдвига чтения выходов COM (от 0 до 63). +#define SSD1306_SET_COM_PINS 0xDA // Установить тип аппаратной конфигурации COM выводов. За данной командой должны быть отправлен 1 байт, у которого 4-ый бит: 0-последовательная / 1-альтернативная, 5-ой бит: 0-отключить COM Left/Right remap / 1-включить COM Left/Right remap. +// Команды тайминга и схемы управления: // +#define SSD1306_SET_DISPLAY_CLOCK 0xD5 // Установить частоту обновления дисплея. За данной командой должны быть отправлен 1 байт, старшие 4 бита которого определяют частоту, а младшие делитель. +#define SSD1306_SET_PRECHARGE_PERIOD 0xD9 // Установить Фазы DC/DC преобразователя. За данной командой должны быть отправлен 1 байт, старшие 4 бита которого определяют период, а младшие период. +#define SSD1306_SET_VCOM_DESELECT 0xDB // Установить VcomH (влияет на яркость). За данной командой должны быть отправлен 1 байт, старшие 4 бита которого определяют напряжение (пример: 0000 - VcomH=0.65Vcc, 0010 - VcomH=0.77Vcc, 0011 - VcomH=0.83Vcc и т.д.). +#define SSD1306_CHARGE_DCDC_PUMP 0x8D // Управление DC/DC преобразователем. За данной командой должны быть отправлен 1 байт: 0x10 - отключить (VCC подается извне), 0x14 - запустить внутренний DC/DC. +// Статусный регистр: // +// -X------ // Доступен для чтения и содержит только 1 значащий бит X: 1-выкл / 0-вкл дисплей +// Контрольный байт: // Байт который следует после отправки байта адреса дисплея, до байта команды или данных. Другими словами это байт который мы отправляем вместо адреса регистра, при работе с другими модулями на шине I2C. +#define SSD1306_SHIFT_DC 0x06 // Положение бита DC в командном байте. Этот бит указывает что следующим байтом будет: 0-команда, 1-данные. +#define SSD1306_SHIFT_CO 0x07 // Положение бита Co в командном байте. Этот бит указывает что после следующего байта (команды или данных) будет следовать (если будет): 0-байт данных, 1-новый командный байт. + // +#define SSD1306_COMMAND (0< 0x00 Контрольный байт после которого следует байт команды +#define SSD1306_DATA (0< 0x40 Контрольный байт после которого следует байт данных + // +class iarduino_OLED_txt{ // + public: // + /** Конструктор класса **/ // + iarduino_OLED_txt (uint8_t address=0x3C){ // Конструктор класса (Параметр: адрес дисплея на шине I2C) + if(address==0x78){ address=0x3C;} // Корректируем адрес введённый с учётом бита RW. + if(address==0x7A){ address=0x3D;} // Корректируем адрес введённый с учётом бита RW. + dispAddr = address; // Сохраняем переданный адрес дисплея + objI2C = new iarduino_I2C; // Переопределяем указатель objI2C на объект производного класса iarduino_I2C + } // + /** Пользовательские функции **/ // + void begin (void ); // Объявляем функцию инициализации дисплея (Параметр: отсутствует) + void clrScr (bool=false ); // Объявляем функцию очистки дисплея (Параметр: флаг закрашивания экрана в белый цвет) + void fillScr (bool i=true ){ clrScr(i); } // Определяем функцию заливки дисплея (Параметр: флаг закрашивания экрана в белый цвет) + void invScr (bool=true ); // Объявляем функцию инвертирования цвета дисплея (Параметр: флаг инвертирования - да/нет) + void invText (bool i=true ){ insFont.inverted=i; } // Определяем функцию инвертирования цвета текста (Параметр: флаг инвертирования - да/нет) + void setFont (uint8_t* ); // Объявляем функцию выбора шрифта для вывода текста (Параметр: название шрифта) + uint8_t getFontWidth (void ){ return insFont.width; } // Определяем функцию возвращающую ширину символов шрифта (Параметр: отсутствует) + uint8_t getFontHeight (void ){ return insFont.height/8; } // Определяем функцию возвращающую высоту символов шрифта (Параметр: отсутствует) + void setCoding (uint8_t i=false){ codingName=i; } // Определяем функцию указывающую тип кодировки для print (Параметры: название кодировки текста для функции print) + void setCursor ( int=OLED_N, int=OLED_N ); // Объявляем функцию установки курсора (Параметры: № колонки, № строки) + void setCursorShift ( int x=0, int y=0){numX+=x; numY+=y; } // Определяем функцию сдвига курсора (Параметры: № колонки, № строки) + void print (char* , int=OLED_N, int=OLED_N ); // Объявляем функцию вывода текста (Параметры: текст, № колонки, № строки) + void print (const char* , int=OLED_N, int=OLED_N ); // Объявляем функцию вывода текста (Параметры: текст, № колонки, № строки) + void print (String , int=OLED_N, int=OLED_N ); // Объявляем функцию вывода текста (Параметры: текст, № колонки, № строки) + void print (int8_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (uint8_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (int16_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (uint16_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (int32_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (uint32_t , int=OLED_N, int=OLED_N, uint8_t=DEC ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, система счисления) + void print (double , int=OLED_N, int=OLED_N, uint8_t=2 ); // Объявляем функцию вывода чисел (Параметры: число, № колонки, № строки, количество знаков после запятой) + // + /** Переменные доступные для пользователя **/ // + uint8_t numY; // Объявляем переменную для хранения № строки на которой должен выводиться текст + uint8_t numX; // Объявляем переменную для хранения № колонки начиная с которой должен выводиться текст + // + private: // + /** Внутренние переменные **/ // + uint8_t dispAddr; // Объявляем переменную для хранения адреса дисплея на шине I2C. + uint8_t codingName = TXT_UTF8; // Определяем переменную для хранения текущей кодировки. + iarduino_I2C_BASE* objI2C; // Объявляем указатель на объект полиморфного класса iarduino_I2C_BASE, но в конструкторе данного класса этому указателю будет присвоена ссылка на производный класс iarduino_I2C. + struct{ // Определяем структуру параметров используемого шрифта: + uint8_t* font; // - указатель на первый байт массива шрифта. + uint8_t width = 0; // - ширина каждого символа шрифта (в пикселях). + uint8_t height = 0; // - высота каждого символа шрифта (в пикселях). + uint8_t firstSymbol = 0; // - код ASCII первого символа в массиве шрифта (шрифт может состоять, например, только цифр, значит первый символ шрифта, это "0", его код = 48). + uint8_t sumSymbol = 0; // - количество символов имеющихся в используемом в шрифте (если шрифт состоит только из цифр, то количество симолов шрифта равно 10). + bool inverted = false; // - флаг указывающий на необходимость вывода шрифта с инвертированием его цвета. Флаг устанавливается/сбрасывается функцией invText(). + bool setFont = false; // - флаг указывающий на то, что шрифт выбран. + uint8_t startSpace [3]; // - начальная позиция пустых интервалов в массиве символов. + uint8_t sumSpace [3]; // - количество отсутсвующих символов (ширина пустых интервалов). + } insFont; // Имя структуры. + /** Внутренние функции **/ // + void _print (char*, int=255, int=255); // Объявляем функцию вывода текста (Параметры: текст, № строки, № колонки) + char* _codingCP866 (char*); // Объявляем функцию преобразования кодировки в CP866 (Параметр: строка в кодировке UTF-8) + char _ItoAa (uint8_t); // Объявляем функцию преобразования одной цифры в символ (Параметр: цифра от 0 до 15) + void _sendCommand (uint8_t); // Объявляем функцию отправки байта команды (Параметр: код команды) + void _sendData (uint8_t*,uint8_t); // Объявляем функцию отправки байта данных (Параметры: указатель на начало массива данных, количество передаваемых байт) +}; // + // +#endif // \ No newline at end of file diff --git a/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt_I2C.h b/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt_I2C.h new file mode 100644 index 0000000..0d7d02c --- /dev/null +++ b/libraries/iarduino_OLED_txt/src/iarduino_OLED_txt_I2C.h @@ -0,0 +1,456 @@ +#ifndef iarduino_I2C_h // Разрешаем включить данный код в скетч, только если он не был включён ранее +#define iarduino_I2C_h // Запрещаем повторное включение данного кода в скетч + // +// Определяем тип реализации шины I2C: // + #define iarduino_I2C_SW // Объявляем константу iarduino_I2C_SW - Возможна программная реализация шины I2C. +#if (!defined(pin_SW_SDA) || !defined(pin_SW_SCL)) // Если выводы не определены пользователем, то ... + #undef iarduino_I2C_SW // Отменяем объявление константы iarduino_I2C_SW - Программная реализация шины I2C не возможна (так как выводы не указаны). + #if defined(TwoWire_h) // Проверяем не подключена ли библиотека Wire. + #define pin_SW_SDA 255 // № вывода SDA не определён + #define pin_SW_SCL 255 // № вывода SCL не определён + #define iarduino_I2C_TW // Объявляем константу iarduino_I2C_TW - Будет использована аппаратная реализация шины I2C под управлением библиотеки Wire. + #elif (defined(SDA) && defined(SCL)) // Определяем выводы для шины I2C + #define pin_SW_SDA SDA // № вывода SDA = SDA + #define pin_SW_SCL SCL // № вывода SCL = SCL + #define iarduino_I2C_HW // Объявляем константу iarduino_I2C_HW - Будет использована аппаратная реализация шины I2C. + #elif (defined(PIN_WIRE_SDA) && defined(PIN_WIRE_SCL)) // Определяем выводы для шины I2C + #define pin_SW_SDA PIN_WIRE_SDA // № вывода SDA = PIN_WIRE_SDA + #define pin_SW_SCL PIN_WIRE_SCL // № вывода SCL = PIN_WIRE_SCL + #define iarduino_I2C_HW // Объявляем константу iarduino_I2C_HW - Будет использована аппаратная реализация шины I2C. + #elif (defined(SDA1) && defined(SCL1)) // Определяем выводы для шины I2C-1 + #define pin_SW_SDA SDA1 // № вывода SDA = SDA1 + #define pin_SW_SCL SCL1 // № вывода SCL = SCL1 + #define iarduino_I2C_HW_1 // Объявляем константу iarduino_I2C_HW_1 - Будет использована аппаратная реализация шины I2C-1. + #else // Если выводы определить не удалось, то ... + #define pin_SW_SDA 255 // № вывода SDA не определён - Аппаратная реализация шины I2C не возможна. + #define pin_SW_SCL 255 // № вывода SCL не определён - Аппаратная реализация шины I2C не возможна. + #endif // +#endif // + // +class iarduino_I2C_BASE{ // Определяем полиморфный класс + public: // Доступные методы и функции: +// ОСНОВНЫЕ ФУНКЦИИ: (поддерживаются библиотекой Wire) // + virtual void begin (uint32_t); // Объявляем функцию указания скорости шины I2C. Аргументы: скорость в кГц. + virtual uint8_t readByte (uint8_t, uint8_t ); // Объявляем функцию чтения байта данных из регистра модуля. Аргументы: адрес_модуля, адрес_регистра. (адрес регистра указывает модулю, данные какого регистра требуется отправить мастеру) + virtual bool writeByte (uint8_t, uint8_t, uint8_t); // Объявляем функцию записи байта данных в регистр модуля. Аргументы: адрес_модуля, адрес_регистра, байт_данных. (адрес регистра указывает модулю, в какой регистр требуется сохранить данные) + virtual uint8_t readByte (uint8_t ); // Объявляем функцию чтения байта данных из модуля. Аргументы: адрес_модуля (функция отличается тем, что она не отправляет модулю адрес регистра) + virtual bool writeByte (uint8_t, uint8_t); // Объявляем функцию записи байта данных в модуль. Аргументы: адрес_модуля, байт_данных. (функция отличается тем, что она не отправляет модулю адрес регистра) + virtual bool readBytes (uint8_t, uint8_t, uint8_t*, uint8_t); // Объявляем функцию чтения байтов данных из регистров модуля. Аргументы: адрес_модуля, адрес_первого_регистра, указатель_на_массив, количество_байт. (адрес первого регистра указывает модулю, с какого регистра требуется начать передачу данных мастеру) + virtual bool writeBytes (uint8_t, uint8_t, uint8_t*, uint8_t); // Объявляем функцию записи байтов данных в регистры модуля. Аргументы: адрес_модуля, адрес_первого_регистра, указатель_на_массив, количество_байт. (адрес первого регистра указывает модулю, начиная с какого регистра требуется сохранять данные) + virtual bool readBytes (uint8_t, uint8_t*, uint8_t); // Объявляем функцию чтения байтов данных из модуля. Аргументы: адрес_модуля, указатель_на_массив, количество_байт. (функция отличается тем, что она не отправляет модулю адрес первого регистра, а начинает цикл чтения сразу после отправки адреса модуля.) + virtual bool writeBytes (uint8_t, uint8_t*, uint8_t); // Объявляем функцию записи байтов данных в модуль. Аргументы: адрес_модуля, указатель_на_массив, количество_байт. (функция отличается тем, что после отправки адреса модуля она сразу начинает цикл отправки данных, без передачи адреса первого регистра.) +// ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ: (поддерживаются библиотекой Wire) // + virtual uint8_t getType (void); // Объявляем функцию получения типа реализации шины I2C. Аргументы: отсутствуют. + virtual bool checkAddress(uint8_t); // Объявляем функцию поиска модуля на шине I2C. Аргументы: адрес_модуля. +// ФУНКЦИИ НИЖНЕГО УРОВНЯ: (не поддерживаются библиотекой Wire) // + virtual bool start (void); // Объявляем функцию установки состояния START. Аргументы: отсутствуют. + virtual bool reStart (void); // Объявляем функцию установки состояния RESTART. Аргументы: отсутствуют. + virtual void stop (void); // Объявляем функцию установки состояния STOP. Аргументы: отсутствуют. + virtual bool sendID (uint8_t, bool); // Объявляем функцию передачи адреса модуля. Аргументы: ID-адрес модуля, бит RW (0-запись, 1-чтение). + virtual bool setByte (uint8_t); // Объявляем функцию передачи байта данных. Аргументы: байт для передачи. + virtual uint8_t getByte (bool); // Объявляем функцию получения байта данных. Аргументы: бит подтверждения ACK/NACK + private: // + virtual bool setSCL (bool); // Объявляем функцию установки уровня на линии SCL. Аргументы: логический уровень. + virtual void setSDA (bool); // Объявляем функцию установки уровня на линии SDA. Аргументы: логический уровень. + virtual bool getSDA (void); // Объявляем функцию чтения уровня с линии SDA. Аргументы: отсутствуют. +}; // + // +class iarduino_I2C: public iarduino_I2C_BASE{ // Определяем производный класс + public: // Доступные методы и функции: + // + /** ОСНОВНЫЕ ФУНКЦИИ: **/ // + // +// Функция подготовки шины I2C: // Определяем функцию подготовки шины I2C. + void begin(uint32_t speed){ // Аргумент: скорость шины в кГц. +// _ _ _ _______ _ _ _ // +// SCL: _?_?_/ OUTPUT // +// _ _ _ _ _____ _ _ _ // +// SDA: _?_?_ _/ OUTPUT // +// // + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + Wire.setClock(speed*1000L); // Устанавливаем скорость передачи данных по шине I2C. + Wire.begin(); // Инициируем работу на шине I2C в качестве мастера. + #elif defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + pinMode(pin_SDA, INPUT ); digitalWrite(pin_SDA, HIGH); // Определяем вывод pin_SDA как вход и подтягиваем его к Vcc. + pinMode(pin_SCL, INPUT ); digitalWrite(pin_SCL, HIGH); // Определяем вывод pin_SCL как вход и подтягиваем его к Vcc. + TWBR=((F_CPU/(speed*1000L))-16)/2; // Определяем значение регистра скорости связи TWBR: speed = F_CPU / (16 + 2 * TWBR * 4^TWPS). Значит TWBR = (F_CPU/speed - 16) / (2 * 4^TWPS), но так как биты предделителя TWPS мы далее сбросим в 0, то формула упростится до: TWBR = (F_CPU/speed - 16) / 2. Так как speed указана в кГц, а F_CPU в Гц, то умножаем speed на 1000. + if(TWBR<10){TWBR=10;} // Если значение регистра скорости TWBR стало меньше 10 (параметр speed > 400 кГ) то оставляем значение этого регистра равным 10 иначе шина будет работать нестабильно. + TWSR&=(~(_BV(TWPS1)|_BV(TWPS0))); // Определяем значение регистра статуса TWSR: оставляем все его биты не тронутыми, кроме двух битов предделитея TWPS сбрасывая их в 0. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + port_SDA = digitalPinToPort (pin_SDA); // Определяем номер порта для вывода pin_SDA. + port_SCL = digitalPinToPort (pin_SCL); // Определяем номер порта для вывода pin_SCL. + mask_SDA = digitalPinToBitMask (pin_SDA); // Определяем маску для вывода pin_SDA. в переменной mask_SDA будет установлен только тот бит который соответствует позиции бита управления выводом pin_SDA. + mask_SCL = digitalPinToBitMask (pin_SCL); // Определяем маску для вывода pin_SCL. в переменной mask_SCL будет установлен только тот бит который соответствует позиции бита управления выводом pin_SCL. + mod_SDA = portModeRegister (port_SDA); // Определяем указатель на адрес регистра конфигурации направления работы выводов порта port_SDA. + mod_SCL = portModeRegister (port_SCL); // Определяем указатель на адрес регистра конфигурации направления работы выводов порта port_SCL. + inp_SDA = portInputRegister (port_SDA); // Определяем указатель на адрес регистра входных значений для управления портом port_SDA. + inp_SCL = portInputRegister (port_SCL); // Определяем указатель на адрес регистра входных значений для управления портом port_SCL. + out_SDA = portOutputRegister (port_SDA); // Определяем указатель на адрес регистра выходных значений для управления портом port_SDA. + out_SCL = portOutputRegister (port_SCL); // Определяем указатель на адрес регистра выходных значений для управления портом port_SCL. + setSCL(1); // Переводим вывод SCL в режим входа с подтяжкой к Vcc + setSDA(1); // Переводим вывод SDA в режим входа с подтяжкой к Vcc + #endif // + } // + // +// Функция чтения одного байта из регистра модуля: // + uint8_t readByte(uint8_t adr, uint8_t reg){ // Определяем функцию чтения одного байта данных из регистра модуля (аргументы: адрес_модуля, адрес_регистра) + uint8_t i=0; readBytes(adr, reg, &i, 1); return i; // Объявляем переменную i и указываем её ссылку для получения 1 байта из регистра reg модуля с адресом adr + } // + // +// Функция чтения одного байта из модуля: // + uint8_t readByte(uint8_t adr){ // Определяем функцию чтения одного байта данных из регистра модуля (аргументы: адрес_модуля) + uint8_t i=0; readBytes(adr, &i, 1); return i; // Объявляем переменную i и указываем её ссылку для получения 1 байта из модуля с адресом adr + } // + // +// Функция записи одного байта в регистр модуля: // + bool writeByte(uint8_t adr, uint8_t reg, uint8_t data){ // Определяем функцию записи одного байта данных в регистр модуля (аргументы: адрес_модуля, адрес_регистра, байт_данных) + return writeBytes(adr, reg, &data, 1); // Запысываем 1 байт по ссылке на переменную data в регистр reg модуля с адресом adr + } // + // +// Функция записи одного байта в модуль: // + bool writeByte(uint8_t adr, uint8_t data){ // Определяем функцию записи одного байта данных в регистр модуля (аргументы: адрес_модуля, байт_данных) + return writeBytes(adr, &data, 1); // Запысываем 1 байт по ссылке на переменную data в модуль с адресом adr + } // + // +// Функция пакетного чтения нескольких байт данных из регистров модуля: // + bool readBytes(uint8_t adr, uint8_t reg, uint8_t *data, uint8_t sum){ // Определяем функцию пакетного чтения нескольких байт данных из регистров модуля (аргументы: адрес_модуля, адрес_первого_регистра, указатель_на_массив, количество_байт) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это ответ по умолчанию. + Wire.beginTransmission(adr); // Инициируем передачу данных по шине I2C к устройству с адресом adr и битом RW=0 => запись. При этом сама передача не начнётся. + Wire.write(reg); // Определяем значение первого байта (reg - адреса регистра) который будет отправлен после байта адреса. Функция write() поместит указанный байт в буфер для передачи. + Wire.endTransmission(false); // Выполняем инициированную ранее передачу данных (без установки состояния STOP). Функция endTransmission() возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка. + if(!Wire.requestFrom( adr, sum )) {return i;} // Читаем (запрашиваем) sum байт данных от устройства с адресом adr и битом RW=1 => чтение. Функция requestFrom() возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START данной функции будет расценено как RESTART. + while(Wire.available() && i0){ *data=getByte(sum>1); // Получаем по одному байту из очередного регистра за каждый проход цикла while. Прочитанный байт записываются по указателю data. Аргумент функции getByte имеет значение true на всех проходах цикла кроме последнего + data++; sum--; // Увеличиваем адрес указателя data, и уменьшаем сумму прочитанных байт sum. + #if defined(iarduino_I2C_HW) // Проверить корректность чтения каждого байта можно только на аппаратном уровне + if (sum) { if(TWSR&0xF8!=0x50) { i=0;}} // Если после чтения очередного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x50 значит произошла ошибка при чтении + else { if(TWSR&0xF8!=0x58) { i=0;}} // Если после чтения последного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x58 значит произошла ошибка при чтении + #endif // + }}}}}} stop (); return i==5; // Отправляем команду STOP и возвращаем результат успешности чтения + #endif // + } // + // +// Функция пакетного чтения нескольких байт данных из модуля: // + bool readBytes(uint8_t adr, uint8_t *data, uint8_t sum){ // Определяем функцию пакетного чтения нескольких байт данных из модуля (аргументы: адрес_модуля, указатель_на_массив, количество_байт) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это ответ по умолчанию. + if(!Wire.requestFrom( adr, sum )) {return i;} // Читаем (запрашиваем) sum байт данных от устройства с адресом adr и битом RW=1 => чтение. Функция requestFrom() возвращает количество реально принятых байтов. + while(Wire.available() && i0){ *data=getByte(sum>1); // Получаем по одному байту из очередного регистра за каждый проход цикла while. Прочитанный байт записываются по указателю data. Аргумент функции getByte имеет значение true на всех проходах цикла кроме последнего + data++; sum--; // Увеличиваем адрес указателя data, и уменьшаем сумму прочитанных байт sum. + #if defined(iarduino_I2C_HW) // Проверить корректность чтения каждого байта можно только на аппаратном уровне + if (sum) { if(TWSR&0xF8!=0x50) { i=0;}} // Если после чтения очередного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x50 значит произошла ошибка при чтении + else { if(TWSR&0xF8!=0x58) { i=0;}} // Если после чтения последного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x58 значит произошла ошибка при чтении + #endif // + }}} stop (); return i==2; // Отправляем команду STOP и возвращаем результат успешности чтения + #endif // + } // + // +// Функция пакетной записи нескольких байт данных в регистр модуля: // + bool writeBytes(uint8_t adr, uint8_t reg, uint8_t *data, uint8_t sum){ // Определяем функцию пакетной записи нескольких байт данных в регистры модуля (аргументы: адрес_модуля, адрес_первого_регистра, указатель_на_массив, количество_байт) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи + Wire.beginTransmission(adr); // Инициируем передачу данных по шине I2C к устройству с адресом adr и битом RW=0 => запись. При этом сама передача не начнётся. + Wire.write(reg); // Определяем значение первого байта (reg - адреса регистра) который будет отправлен после байта адреса. Функция write() поместит указанный байт в буфер для передачи. + Wire.write(data, sum); // Определяем значения следующих байт (data - массив данных) который будет отправлен после байта регистра. Функция write() поместит sum элементов массива data в буфер для передачи. + i = Wire.endTransmission(); return i==0; // Выполняем инициированную ранее передачу данных. Функция endTransmission() возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка. В качестве параметра функция endTransmission() может принимать флаг установки стсояния STOP - по умолчанию true. + #else // + // Если шина управляется функциями нижнего уровня данного класса: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи + if ( start () ) { i=1; // Если на шине I2C установилось состояние START, то ... + if ( sendID (adr,0) ) { i=2; // Если модуль ответил ACK на получение адреса устройства adr с битом RW=0 (запись), то ... + if ( setByte (reg) ) { i=3; // Если модуль ответил ACK на получение адреса регистра reg, то ... + while(sum>0){if(!setByte(*data )) { i=0;} // Передаём один байт из массива по указателю data в очередной регистр за каждый проход цикла while. Увеличиваем адрес указателя data, и уменьшаем сумму переданных байт sum. + data++; sum--; // Увеличиваем адрес указателя data, и уменьшаем сумму переданных байт sum. + }}}} stop (); return i==3; // Отправляем команду STOP и возвращаем результат записи. + #endif // + } // + // +// Функция пакетной записи нескольких байт данных в модуль: // + bool writeBytes(uint8_t adr, uint8_t *data, uint8_t sum){ // Определяем функцию пакетной записи нескольких байт данных в модуль (аргументы: адрес_модуля, указатель_на_массив, количество_байт) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи + Wire.beginTransmission(adr); // Инициируем передачу данных по шине I2C к устройству с адресом adr и битом RW=0 => запись. При этом сама передача не начнётся. + Wire.write(data, sum); // Указываем массив данных который будет отправлен после байта адреса. Функция write() поместит sum элементов массива data в буфер для передачи. + i = Wire.endTransmission(); return i==0; // Выполняем инициированную ранее передачу данных. Функция endTransmission() возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка. В качестве параметра функция endTransmission() может принимать флаг установки стсояния STOP - по умолчанию true. + #else // + // Если шина управляется функциями нижнего уровня данного класса: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи + if ( start () ) { i=1; // Если на шине I2C установилось состояние START, то ... + if ( sendID (adr,0) ) { i=2; // Если модуль ответил ACK на получение адреса устройства adr с битом RW=0 (запись), то ... + while(sum>0){if(!setByte(*data )) { i=0;} // Передаём один байт из массива по указателю data в очередной регистр за каждый проход цикла while. Увеличиваем адрес указателя data, и уменьшаем сумму переданных байт sum. + data++; sum--; // Увеличиваем адрес указателя data, и уменьшаем сумму переданных байт sum. + }}} stop (); return i==2; // Отправляем команду STOP и возвращаем результат записи. + #endif // + } // + // + /** ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ: **/ // + // +// Функция получения типа реализации шины I2C: // Определяем функцию получения типа шины Ш2С. + uint8_t getType(void){ // Аргументы: отсутсвуют. + #if defined(iarduino_I2C_TW) // + return 4; // Используется программная реализация шины I2C под управлением библиотеки Wire. + #elif defined(iarduino_I2C_HW) // + return 3; // Используется программная реализация шины I2C. + #elif defined(iarduino_I2C_HW_1) // + return 2; // Используется программная реализация шины I2C-1. + #elif defined(iarduino_I2C_SW) // + return 1; // Используется аппаратная реализация шины I2C. + #else // + return 0; // Тип реализации шины I2C не определён. + #endif // + } // + // +// Функция проверки наличия ведомого по его адресу: // + bool checkAddress(uint8_t adr){ // Определяем функцию записи одного байта данных в регистр модуля (аргументы: адрес_регистра, байт_данных) + #if defined(iarduino_I2C_TW) // + // Если используется шина I2C под управлением библиотеки Wire: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат проверки. + Wire.beginTransmission(adr); // Инициируем передачу данных по шине I2C к устройству с адресом adr и битом RW=0 => запись. При этом сама передача не начнётся. + i=Wire.endTransmission(); return i==0; // Выполняем инициированную ранее передачу но без данных (отправится только START, байт адреса, STOP). Функция endTransmission() возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка. В качестве параметра функция endTransmission() может принимать флаг установки стсояния STOP - по умолчанию true. + #else // + // Если шина управляется функциями нижнего уровня данного класса: // + uint8_t i=0; // Предустанавливаем переменную i в значение 0 - это результат записи. + if ( start () ) { i=1; // Если на шине I2C установилось состояние START, то ... + if ( sendID (adr,0) ) { i=2; // Если модуль ответил ACK на получение адреса устройства adr с битом RW=0 (запись), то ... + }} stop (); return i==2; // Отправляем команду STOP и возвращаем результат записи. + #endif // + } // + // + /** ФУНКЦИИ НИЖНЕГО УРОВНЯ: **/ // + // +// Функция нижнего уровня - установка состояния START: // Определяем функцию установки состояния START. + bool start(void){ // Аргументы: отсутствуют. +// _ _ _ _____:___ _ _ _ // +// SCL: : \___ _ _ _ _ _/ // +// _ _ _ _____: _ _ _ _ _ _ // Спад логического уровня на линии SDA с «1» в «0», при наличии уровня логической «1» на линии SCL +// SDA: :\______ _ _/_ _ _ _ _ _ // +// // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания установки состояния start. + TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTA); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания), TWEN (бит разрешения работы шины), TWSTA (бит условия START). + while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов. + if((TWSR & 0xF8)==0x08){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x08, значит состояние START установилось на шине I2C. + return false; // Если предыдущая строка не вернула true, значит состояние START не установилось на шине I2C, возвращаем false. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + bool i= setSCL(1); // Устанавливаем «1» на линии SCL. Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSDA(0); // Устанавливаем «0» на линии SDA + setSCL(0); // Устанавливаем «0» на линии SCL + return i; // Если счетчик i не дошел до 0 при ожидании «1» на линии SCL, то вернётся true. + #else // + // Если тип шины I2C не поддерживается или не определён: // + return false; // Возвращаем false. + #endif // + } // + // +// Функция нижнего уровня - установка состояния RESTART: // Определяем функцию установки состояния RESTART. + bool reStart(void){ // Аргументы: отсутствуют. +// _ _ _ ___:___ _ _ _ // +// SCL: \_ _ _ _ / : \___ _ _ _ _ _/ // +// _ _ _ _ _ ________: _ _ _ _ _ _ // Спад логического уровня на линии SDA с «1» в «0», при наличии уровня логической «1» на линии SCL +// SDA: _ _ _ _ _/ :\______ _ _/_ _ _ _ _ _ // Сигнал рестрат аналогичен сигналу старт и отличается лишь тем, что ему не предшествует сигнал STOP +// // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания установки состояния RESTART. + TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTA); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания), TWEN (бит разрешения работы шины), TWSTA (бит условия START). + while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов. + if((TWSR & 0xF8)==0x10){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x10, значит состояние RESTART установилось на шине I2C. + return false; // Если предыдущая строка не вернула true, значит состояние RESTART не установилось на шине I2C, возвращаем false. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + return start(); // Программная реализация состояния RESTART идентична программной реализации состояния START. + #else // + // Если тип шины I2C не поддерживается или не определён: // + return false; // Возвращаем false. + #endif // + } // + // +// Функция нижнего уровня - установка состояния STOP: // Определяем функцию установки состояния STOP. + void stop(void){ // Аргументы: отсутствуют. +// _ _ _ ___:____ _ _ _ // +// SCL: \_ _ _ _/ : // +// _ _ _ _ _ :____ _ _ _ // Подъём логического уровня на линии SDA с «0» в «1», при наличии уровня логической «1» на линии SCL +// SDA: _ _ _ _ _\______/: // +// // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания установки состояния STOP + TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWSTO); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания), TWEN (бит разрешения работы шины), TWSTO (бит условия STOP). + while((!(TWCR & _BV(TWSTO))) && i){i--;} // Ждём сброса бита условия стоп TWSTO в регистре управления TWCR, но не дольше чем i циклов + // if((TWSR & 0xF8)==0xA0){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0xA0, значит состояние STOP установилось на шине I2C. + delayMicroseconds(20); // Данная функция не возвращает результат, но в любом случае делаем задержку меджу завершением текущего пакета и возможным началом следующего + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + setSDA(0); // Устанавливаем «0» на линии SDA + setSCL(1); // Устанавливаем «1» на линии SCL. Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSDA(1); // Устанавливаем «1» на линии SDA + #endif // + } // + // +// Функция нижнего уровня - передача первого байта АДРЕС+RW: // Определяем функцию передачи первого байта после cигнала START. Это байт адреса модуля с битом RW + bool sendID(uint8_t adr, bool rw){ // Аргументы: ID-адрес модуля, бит RW (0-запись, 1-чтение) +// 1 2 3 4 5 6 7 8 9 // +// SCL: _ _ _ _____/\_/\_/\_/\_/\_/\_/\_/\__/\_____ _ _ _ // +// ________________________ // Передача 7-битного адреса и 1 бита RW. На 9 тактирубщем импульсе модуль отвечает ACK («0» - «я сдесь»), или NACK («1» - «нет») +// SDA: _ _ _ ___/________ADDRESS_______RW>----____ _ _ _ // +// вход // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания получения подтверждения от ведомого ввиде бита ACK. + TWDR = (adr<<1)+rw; // Определяем значение регистра данных TWDR: записываем в него адрес adr сдвигая его на 1 бит влево, при этом младший бит (освободившийся) займёт бит RW (0-запись / 1-чтение) + TWCR = _BV(TWINT) | _BV(TWEN); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания) и TWEN (бит разрешения работы шины). + while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов + if((TWSR & 0xF8)==0x40 && rw){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x40, значит ведомый опознал свой адрес с битом RW=1 и отправил бит подтверждения ACK (в противном случае значение регистра TWSR будет равно 0x48). + if((TWSR & 0xF8)==0x18 && !rw){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x18, значит ведомый опознал свой адрес с битом RW=0 и отправил бит подтверждения ACK (в противном случае значение регистра TWSR будет равно 0x20). + return false; // Если предыдущая строка не вернула true, значит на шине нет ведомых у сказанным адресом, возвращаем false. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + bool i=true; // Определяем флаг возвращаемый данной функцией. + uint8_t j=7; // Определяем счётчик количества переданных бит адреса. + while(j){ j--; // Передаём 7 бит адреса adr в цикле + setSDA(adr & bit(j)); // Устанавливаем очередной бит адреса на линии SDA + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + } setSDA(rw); // Устанавливаем бит RW на линии SDA + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + setSDA(1); // Переводим вывод SDA в режим входа с подтяжкой к Vcc + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + if( getSDA( ) ) {i=false;} // Если на линии SDA установлена «1» значит ведомый ответил NACK + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + return i; // Если линия SCL была занята или модуль ответил NACK, то вернётся false. + #else // + // Если тип шины I2C не поддерживается или не определён: // + return false; // Возвращаем false + #endif // + } // + // +// Функция нижнего уровня - передача одного байта данных: // Определяем функцию передачи одного байта (в любом месте между байтом адреса с битом RW=0 и сигналом STOP). + bool setByte(uint8_t data){ // Аргумент: байт для передачи. +// 1 2 3 4 5 6 7 8 9 // +// SCL: _ _ _ _____/\_/\_/\_/\_/\_/\_/\_/\__/\_____ _ _ _ // +// ________________________ // Передача 1 байта, каждый бит читается модулем по фронту тактирубщих импульсов. На 9 тактирубщем импульсе модуль отвечает ACK («0» - «принял»), или NACK («1» - «нет») +// SDA: _ _ _ ___/__________DATA__________>----____ _ _ _ // +// вход // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания получения подтверждения от ведомого ввиде бита ACK. + TWDR = data; // Определяем значение регистра данных TWDR: записываем в него байт для передачи по шине I2C. + TWCR = _BV(TWINT) | _BV(TWEN); // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания) и TWEN (бит разрешения работы шины). + while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов + if((TWSR & 0xF8)==0x28){return true;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x28, значит ведомый отправил бит подтверждения приёма данных ACK (в противном случае значение регистра TWSR будет равно 0x30). + return false; // Если предыдущая строка не вернула true, значит ведомый не принял отправленный ему байт, возвращаем false. + #elif defined(iarduino_I2C_SW) // + // Если используется программная шина I2C: // + bool i=true; // Определяем флаг возвращаемый данной функцией. + uint8_t j=8; // Определяем счётчик количества переданных байт. + while(j){ j--; // Передаём 8 бит байта data в цикле + setSDA(data & bit(j)); // Устанавливаем очередной бит байта на линии SDA + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + } setSDA(1); // Переводим вывод SDA в режим входа с подтяжкой к Vcc + if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false. + if( getSDA( ) ) {i=false;} // Если на линии SDA установлена «1» значит ведомый ответил NACK + setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса) + return i; // Если счетчик i не дошел до 0 и не был сброшен в 0 при получении NACK, то вернётся true. + #else // + // Если тип шины I2C не поддерживается или не определён: // + return false; // Возвращаем false + #endif // + } // + // +// Функция нижнего уровня - получение одного байта данных: // Определяем функцию получения одного байта (в любом месте между байтом адреса с битом RW=1 и сигналом STOP). + uint8_t getByte(bool ack){ // Аргумент: бит подтверждения ACK/NACK +// 1 2 3 4 5 6 7 8 9 // +// SCL: _ _ _ _____/\_/\_/\_/\_/\_/\_/\_/\__/\_____ _ _ _ // +// __ // Получение 1 байта, каждый бит читается мастером по фронту тактирубщих импульсов. На 9 тактирубщем импульсе мастер отвечает ACK («0» - «давай еще»), или NACK («1» - «хватит») +// SDA: _ _ _ ___/----------DATA-----------<__\____ _ _ _ // +// вход выход // + #if defined(iarduino_I2C_HW) // + // Если используется аппаратная шина I2C: // + uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания. + TWCR = _BV(TWINT) | _BV(TWEN) | ack<