// Библиотека для работы с модулям по I²C #include // Адрес младшего кристалла #define RW1065I_ADDR_I2C_LOW 0x3C // Адрес старшего кристалла #define RW1065I_ADDR_I2C_HIGH 0x3D // Адрес кристалла управления #define NF8475A_ADDR_I2C 0x3B // Определение управляющих байт // control byte C0=0, DC=1, последний упр.байт, дальше только данные #define CTRL_0_DATA 0x40 // control byte C0=1, DC=1, после байт данных, потом снова упр. байт #define CTRL_1_DATA 0xC0 // control byte C0=0, DC=0, последний упр.байт, дальше только команды #define CTRL_0_CMD 0x00 // control byte C0=1, DC=0, после байт команды, потом снова упр. байт #define CTRL_1_CMD 0x80 // Массив картинки логотипа амперки // Каждые 8 вертикальных точек собраны в байт const byte amperkaLogo[8][128] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x1F, 0x3F, 0x7F, 0x79, 0x70, 0x70, 0x79, 0x7F, 0x3F, 0x1F, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0xFF, 0x1F, 0x07, 0xF1, 0xF8, 0xFC, 0x1E, 0x0E, 0x0F, 0x07, 0x07, 0x0F, 0x0E, 0x1E, 0xFC, 0xF8, 0xF1, 0x07, 0x1F, 0xFF, 0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3F, 0x7F, 0xFC, 0xF0, 0xE7, 0xCF, 0x9F, 0xBC, 0x38, 0x78, 0x70, 0x70, 0x78, 0x38, 0xBC, 0x9F, 0xCF, 0xE7, 0xF0, 0xFC, 0x7F, 0x3F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0xE0, 0xE0, 0x00, 0x00, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0x00, 0x00, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, 0x60, 0x60, 0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0xE0, 0xE0, 0xC0, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x3F, 0x7F, 0xF1, 0xE0, 0xC0, 0xC0, 0xC0, 0xE0, 0x71, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x0F, 0x1E, 0x1E, 0x0F, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x1E, 0x7F, 0x7F, 0xE6, 0xC6, 0xC6, 0xC6, 0xC6, 0xE6, 0xE7, 0x67, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x71, 0x3F, 0x1F, 0x00, 0x00, 0xFF, 0xFF, 0x0C, 0x0C, 0x1F, 0x3F, 0xF3, 0xE0, 0xC0, 0x00, 0x00, 0x3F, 0x7F, 0xF1, 0xE0, 0xC0, 0xC0, 0xC0, 0xE0, 0x71, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void drawImage() { // Текущая страница byte pp = 0; // цикл по 8-ми страницам for (pp = 0; pp < 8; pp++) { // поз. по горизонтали выводимого байта byte c = 0; // Вывод строки массива, первая половина в мл. кристалл Wire.beginTransmission(RW1065I_ADDR_I2C_LOW); Wire.write("\x80\x3F\x80\xC0\x80\x40\x80"); for (byte j = 0; j < 4; j++){ Wire.endTransmission(false); Wire.beginTransmission(RW1065I_ADDR_I2C_LOW); Wire.write(0x80); Wire.write(0xB8|pp); Wire.write(0x40); for (byte i = 0; i < 16; i++) { byte send_data; send_data = amperkaLogo[pp][c]; Wire.write(send_data); c++; } } Wire.endTransmission(false); // Вывод строки массива, вторая половина в ст. кристалл Wire.beginTransmission(RW1065I_ADDR_I2C_HIGH); Wire.write("\x80\x3F\x80\xC0\x80\x40\x80"); for (byte j = 0; j < 4; j++) { Wire.endTransmission(false); Wire.beginTransmission(RW1065I_ADDR_I2C_HIGH); Wire.write(0x80); Wire.write(0xB8|pp); Wire.write(0x40); for (byte i = 0; i < 16; i++) { byte send_data; send_data = amperkaLogo[pp][c]; Wire.write(send_data); c++; } } Wire.endTransmission(true); } } // Одиночная команда в обычном режиме void normComand1 (byte cmd) { // Команда, мл. крист. Wire.beginTransmission(RW1065I_ADDR_I2C_LOW); Wire.write(0x00); Wire.write(cmd); Wire.endTransmission(false); // Команда, ст. крист. Wire.beginTransmission(RW1065I_ADDR_I2C_HIGH); Wire.write(0x00); Wire.write(cmd); Wire.endTransmission(true); } // Инициализация дисплея void initLCD() { // вкл. дисплея, Addr=0, нач.стр.=0, Page=0, мл.кристалл Wire.beginTransmission(RW1065I_ADDR_I2C_LOW); Wire.write(0x80); Wire.write(0x3F); Wire.write(0x80); Wire.write(0x40); Wire.write(0x80); Wire.write(0xC0); Wire.write(0x00); Wire.write(0xB8); Wire.endTransmission(false); // вкл. дисплея, Addr=0. ст.кристалл Wire.beginTransmission(RW1065I_ADDR_I2C_HIGH); Wire.write(0x80); Wire.write(0x3F); Wire.write(0x00); Wire.write(0x40); Wire.endTransmission(true); } // Очистка дисплея void clearLCD(byte f, byte m) { Wire.beginTransmission(RW1065I_ADDR_I2C_LOW); Wire.write("\x80\x3F\x80\xC0\x80\x40\x80"); for (byte p = 0; p < 8; p++) { Wire.endTransmission(false); Wire.beginTransmission(RW1065I_ADDR_I2C_LOW); Wire.write(0x80); Wire.write(0xB8|p); Wire.write(0x40); for (byte i = 0; i < 16; i++) { Wire.write(f); f ^= m; } for (byte j=0; j < 3; j++) { Wire.endTransmission(false); Wire.beginTransmission(RW1065I_ADDR_I2C_LOW); Wire.write(0x40); for (byte i = 0; i < 16; i++) { Wire.write(f); f ^= m; } } } Wire.endTransmission(true); Wire.beginTransmission(RW1065I_ADDR_I2C_HIGH); Wire.write("\x80\x3F\x80\xC0\x80\x40\x80"); for (byte p = 0; p < 8; p++) { Wire.endTransmission(false); Wire.beginTransmission(RW1065I_ADDR_I2C_HIGH); Wire.write(0x80); Wire.write(0xB8|p); Wire.write(0x40); for (byte i = 0; i < 16; i++) { Wire.write(f); f ^= m; } for (byte j=0; j < 3; j++) { Wire.endTransmission(false); Wire.beginTransmission(RW1065I_ADDR_I2C_HIGH); Wire.write(0x40); for (byte i=0; i<16; i++) { Wire.write(f); f ^= m; } } } Wire.endTransmission(true); } void setup() { // Настройка I²C Wire.begin(); Wire.setClock(400000); delay(200); // Установка регистра управления в исходное состояние - FF // Нормальный режим, P_ON Wire.beginTransmission(NF8475A_ADDR_I2C); Wire.write(0xFF); Wire.endTransmission(true); delay (500); // power normal, команда расширенного режима Wire.beginTransmission(RW1065I_ADDR_I2C_LOW); Wire.write(0x80); Wire.write(0x0D); Wire.write(0x80); Wire.write(0x02); Wire.write(0x00); Wire.write(0x0C); Wire.endTransmission(false); Wire.beginTransmission(RW1065I_ADDR_I2C_HIGH); Wire.write(0x80); Wire.write(0x0D); Wire.write(0x80); Wire.write(0x02); Wire.write(0x00); Wire.write(0x0C); Wire.endTransmission(true); clearLCD(0, 0); initLCD(); // Включение полной яркости подсветки // Полная яркость подсветки BL_ON2 - "низкий" Wire.beginTransmission(NF8475A_ADDR_I2C); Wire.write(0xFB); Wire.endTransmission(true); delay(100); // Вывод изображения на дисплей drawImage(); } void loop() { }