Дисплей на PCF8578 и PCF8579

Да что же такое? Можно как-то поспокойнее? Первый раз отправляю

Сутки на форуме. Учись )


#include <Wire.h>

int acolumn = 0;
int bcolumn = 1;
int ccolumn = 2;
int dcolumn = 3;
int ecolumn = 4;
int fcolumn = 5;
int gcolumn = 6;
int hcolumn = 7;
int icolumn = 8;



String inputText = "The lonely Shepherd (Der einsame Hirte) - Hardstyle Bootleg (Mixed By Lowwalker)";
int inputText_len = inputText.length() + 1;


constexpr size_t numColumns = 5;  //number of bytes -columns for 1 character 


//Pretty self-explenatory -here I store all my characters.
void getColumns(char c, uint8_t columns[numColumns]);

const uint8_t upperCase[][numColumns] PROGMEM = {
  {0X7E, 0X11, 0X11, 0X11, 0X7E}, // Column codes for 'A'
  {0X7F, 0X49, 0X49, 0X49, 0X36}, // Column codes for 'B'
  {0X3E, 0X41, 0X41, 0X41, 0X22}, // Column codes for 'C'
  {0X7F, 0X41, 0X41, 0X22, 0X1C}, // Column codes for 'D'
  {0X7F, 0X49, 0X49, 0X49, 0X41}, // Column codes for 'E'
  {0X7F, 0X09, 0X09, 0X09, 0X01}, // Column codes for 'F'
  {0X3E, 0X41, 0X49, 0X49, 0X7A}, // Column codes for 'G'
  {0X7F, 0X08, 0X08, 0X08, 0X7F}, // Column codes for 'H'
  {0X00, 0X41, 0X7F, 0X41, 0X00}, // Column codes for 'I'
  {0X20, 0X40, 0X41, 0X3F, 0X01}, // Column codes for 'J'
  {0X7F, 0X08, 0X14, 0X22, 0X41}, // Column codes for 'K'
  {0X7F, 0X40, 0X40, 0X40, 0X40}, // Column codes for 'L'
  {0X7F, 0X02, 0X0C, 0X02, 0X7F}, // Column codes for 'M'
  {0X7F, 0X04, 0X08, 0X10, 0X7F}, // Column codes for 'N'
  {0X3E, 0X41, 0X41, 0X41, 0X3E}, // Column codes for 'O'
  {0X7F, 0X09, 0X09, 0X09, 0X06}, // Column codes for 'P'
  {0X3E, 0X41, 0X41, 0X61, 0X3E}, // Column codes for 'Q'
  {0X7F, 0X09, 0X19, 0X29, 0X46}, // Column codes for 'R'
  {0X46, 0X49, 0X49, 0X49, 0X31}, // Column codes for 'S'
  {0X01, 0X01, 0X7F, 0X01, 0X01}, // Column codes for 'T'
  {0X3F, 0X40, 0X40, 0X40, 0X3F}, // Column codes for 'U'
  {0X07, 0X18, 0X60, 0X18, 0X07}, // Column codes for 'V'
  {0X3F, 0X40, 0X38, 0X40, 0X3F}, // Column codes for 'W'
  {0X63, 0X14, 0X08, 0X14, 0X63}, // Column codes for 'X'
  {0X07, 0X08, 0X70, 0X08, 0X07}, // Column codes for 'Y'
  {0X61, 0X51, 0X49, 0X45, 0X43} // Column codes for 'Z'
};

const uint8_t lowerCase[][numColumns] PROGMEM = {
  {0X20, 0X54, 0X54, 0X54, 0X78}, // Column codes for 'a'
  {0X7F, 0X48, 0X48, 0X48, 0X30}, // Column codes for 'b'
  {0X38, 0X44, 0X44, 0X44, 0X44}, // Column codes for 'c'
  {0X30, 0X48, 0X48, 0X48, 0X7F}, // Column codes for 'd'
  {0X38, 0X54, 0X54, 0X54, 0X58}, // Column codes for 'e'
  {0X00, 0X08, 0X7E, 0X09, 0X02}, // Column codes for 'f'
  {0X48, 0X54, 0X54, 0X54, 0X3C}, // Column codes for 'g'
  {0X7F, 0X08, 0X08, 0X08, 0X70}, // Column codes for 'h'
  {0X00, 0X00, 0X7A, 0X00, 0X00}, // Column codes for 'i'
  {0X20, 0X40, 0X40, 0X39, 0X00}, // Column codes for 'j'
  {0X00, 0X7F, 0X10, 0X28, 0X44}, // Column codes for 'k'
  {0X00, 0X41, 0X7F, 0X40, 0X00}, // Column codes for 'l'
  {0X7C, 0X04, 0X18, 0X04, 0X7C}, // Column codes for 'm'
  {0X7C, 0X08, 0X04, 0X04, 0X78}, // Column codes for 'n'
  {0X30, 0X48, 0X48, 0X30, 0X00}, // Column codes for 'o'
  {0X7C, 0X14, 0X14, 0X14, 0X08}, // Column codes for 'p'
  {0X7F, 0X04, 0X04, 0X04, 0X03}, // Column codes for 'q'
  {0X7C, 0X08, 0X04, 0X04, 0X08}, // Column codes for 'r'
  {0X48, 0X54, 0X54, 0X54, 0X24}, // Column codes for 's'
  {0X04, 0X04, 0X3F, 0X44, 0X24}, // Column codes for 't'
  {0X3C, 0X40, 0X40, 0X40, 0X3C}, // Column codes for 'u'
  {0X1C, 0X20, 0X40, 0X20, 0X1C}, // Column codes for 'v'
  {0X3C, 0X40, 0X30, 0X40, 0X3C}, // Column codes for 'w'
  {0X44, 0X28, 0X10, 0X28, 0X44}, // Column codes for 'x'
  {0X04, 0X48, 0X30, 0X18, 0X04}, // Column codes for 'y'
  {0X44, 0X64, 0X54, 0X4C, 0X44} // Column codes for 'z'
};

const uint8_t numerals[][numColumns] PROGMEM = {
  {0X3E, 0X45, 0X49, 0X51, 0X3E}, // Column codes for '0'
  {0X00, 0X42, 0X7F, 0X40, 0X00}, // Column codes for '1'
  {0X42, 0X61, 0X51, 0X49, 0X46}, // Column codes for '2'
  {0X22, 0X41, 0X49, 0X49, 0X36}, // Column codes for '3'
  {0X18, 0X14, 0X12, 0X7F, 0X10}, // Column codes for '4'
  {0X27, 0X45, 0X45, 0X45, 0X39}, // Column codes for '5'
  {0X3E, 0X49, 0X49, 0X49, 0X30}, // Column codes for '6'
  {0X01, 0X71, 0X09, 0X05, 0X03}, // Column codes for '7'
  {0X36, 0X49, 0X49, 0X49, 0X36}, // Column codes for '8'
  {0X06, 0X49, 0X49, 0X49, 0X3E} // Column codes for '9'
};

const uint8_t symbolsa[][numColumns] PROGMEM = {
  {0X00, 0X00, 0X5F, 0X00, 0X00}, // Column codes for '!'
  {0X00, 0X03, 0X00, 0X03, 0X00}, // Column codes for '"'
  {0X14, 0X7F, 0X14, 0X7F, 0X14}, // Column codes for '#'
  {0X24, 0X2A, 0X7F, 0X2A, 0X12}, // Column codes for '$'
  {0X23, 0X13, 0X08, 0X64, 0X62}, // Column codes for '%'
  {0X36, 0X49, 0X55, 0X22, 0X50}, // Column codes for '&'
  {0X04, 0X02, 0X02, 0X01, 0X00}, // Column codes for '''
  {0X00, 0X1C, 0X22, 0X41, 0X00}, // Column codes for '('
  {0X00, 0X41, 0X22, 0X1C, 0X00}, // Column codes for ')'
  {0X14, 0X08, 0X3E, 0X08, 0X14}, // Column codes for '*'
  {0X08, 0X08, 0X3E, 0X08, 0X08}, // Column codes for '+'
  {0X00, 0X00, 0X50, 0X30, 0X00}, // Column codes for ','
  {0X08, 0X08, 0X08, 0X08, 0X08}, // Column codes for '-'
  {0X00, 0X60, 0X60, 0X00, 0X00}, // Column codes for '.'
  {0X20, 0X10, 0X08, 0X04, 0X02} // Column codes for '/'
};

const uint8_t symbolsb[][numColumns] PROGMEM = {
  {0X00, 0X7F, 0X41, 0X41, 0X00}, // Column codes for '['
  {0X02, 0X04, 0X08, 0X10, 0X20}, // Column codes for '\'
  {0X00, 0X41, 0X41, 0X7F, 0X00}, // Column codes for ']'
  {0X04, 0X02, 0X01, 0X02, 0X04}, // Column codes for '^'
  {0X40, 0X40, 0X40, 0X40, 0X40}, // Column codes for '_'
  {0X00, 0X01, 0X02, 0X04, 0X00} // Column codes for '`'

};

const uint8_t symbolsc[][numColumns] PROGMEM = {
  {0X08, 0X36, 0X41, 0X41, 0X00}, // Column codes for '{'
  {0X00, 0X00, 0X7F, 0X00, 0X00}, // Column codes for '|'
  {0X00, 0X41, 0X41, 0X36, 0X08}, // Column codes for '}'
  {0X01, 0X02, 0X01, 0X20, 0X00}, // Column codes for '~'
};

const uint8_t equalSymbol [numColumns] PROGMEM = {0x14, 0x14, 0x14, 0x14, 0x14};

const uint8_t afnaSymbol [numColumns] PROGMEM = {0x32, 0x49, 0x71, 0x41, 0x3E};

const uint8_t space[numColumns] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00};

const uint8_t unknown[numColumns] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00};





void setup() {
 
}

void loop() {
 char inputText_array[inputText_len];
  inputText.toCharArray(inputText_array, inputText_len);
  //Serial only for troubleshooting -I can remove it when it works.

  uint8_t ahr[numColumns];
  getColumns(inputText[acolumn], ahr);  //This would store all 5 bytes (columns)of letter A in "xxx"


uint8_t bhr[numColumns];
getColumns(inputText[bcolumn], bhr);  //This would store all 5 bytes (columns)of letter A in "xxx"


  uint8_t chr[numColumns];
  getColumns(inputText[ccolumn], chr);  //This would store all 5 bytes (columns)of letter A in "xxx"


  uint8_t dhr[numColumns];
  getColumns(inputText[dcolumn], dhr);  //This would store all 5 bytes (columns)of letter A in "xxx"

  uint8_t ehr[numColumns];
  getColumns(inputText[ecolumn], ehr);  //This would store all 5 bytes (columns)of letter A in "xxx"


  uint8_t fhr[numColumns];
  getColumns(inputText[fcolumn], fhr);  //This would store all 5 bytes (columns)of letter A in "xxx"


  uint8_t ghr[numColumns];
  getColumns(inputText[gcolumn], ghr);  //This would store all 5 bytes (columns)of letter A in "xxx"


  uint8_t hhr[numColumns];
  getColumns(inputText[hcolumn], hhr);  //This would store all 5 bytes (columns)of letter A in "xxx"


  uint8_t ihr[numColumns];
  getColumns(inputText[icolumn], ihr);  //This would store all 5 bytes (columns)of letter A in "xxx"


     //COMMANDS TO SET UP THE DISPLAY
  Wire.begin(); // join i2c bus
    Wire.beginTransmission(0x3C); // transmit to device
  //Wire.write(0x55);             // set_mode  -normal video, mixed mode, MUX 1:8
  Wire.write(0x55);
  Wire.endTransmission();     // stop transmitting

      Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x3e); // RAM access
  Wire.endTransmission();     // stop transmitting

      Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x7c); //set start bank 0
  Wire.endTransmission();     // stop transmitting

      Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x62); //device select
  Wire.endTransmission();     // stop transmitting


//WRITING TO DISPLAY STARTS HERE

      Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x0F); //load x address

Wire.write(bhr[3]);             // DATA column 10
Wire.write(bhr[2]);             // DATA column 9
Wire.write(bhr[1]);             // DATA column 8
Wire.write(bhr[0]);             // DATA column 7
Wire.write(0x00);             // DATA column 6
Wire.write(ahr[4]);             // DATA column 5
Wire.write(ahr[3]);             // DATA column 4
Wire.write(ahr[2]);             // DATA column 3
Wire.write(ahr[1]);             // DATA column 2
Wire.write(ahr[0]);             // DATA column 1

  Wire.endTransmission();     // stop transmitting


      Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x05); //load x address
      
Wire.write(dhr[1]);             // DATA column 20
Wire.write(dhr[0]);             // DATA column 19
Wire.write(0x00);             // DATA column 18
Wire.write(chr[4]);             // DATA column 17
Wire.write(chr[3]);             // DATA column 16
Wire.write(chr[2]);             // DATA column 15
Wire.write(chr[1]);             // DATA column 14
Wire.write(chr[0]);             // DATA column 13
Wire.write(0x00);             // DATA column 12
Wire.write(bhr[4]);             // DATA column 11

  Wire.endTransmission();     // stop transmitting


      Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x00); //load x address

Wire.write(0x00);             // DATA MISSING COLUMN -BLANK
Wire.write(0x00);             // DATA column 24
Wire.write(dhr[4]);             // DATA column 23
Wire.write(dhr[3]);             // DATA column 22
Wire.write(dhr[2]);             // DATA column 21
  
  Wire.endTransmission();     // stop transmitting


        Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x61); //device select   
  Wire.endTransmission();     // stop transmitting


Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x1f); //load x address

Wire.write(fhr[3]);             // DATA column 34
Wire.write(fhr[2]);             // DATA column 33
Wire.write(fhr[1]);             // DATA column 32
Wire.write(fhr[0]);             // DATA column 31
Wire.write(0x00);             // DATA column 30
Wire.write(ehr[4]);             // DATA column 39
Wire.write(ehr[3]);             // DATA column 28
Wire.write(ehr[2]);             // DATA column 27
Wire.write(ehr[1]);             // DATA column 26
Wire.write(ehr[0]);             // DATA column 25
  
  Wire.endTransmission();     // stop transmitting


      Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x61); //device select   
  Wire.endTransmission();     // stop transmitting


Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x14); //load x address

Wire.write(hhr[2]);             // DATA column 45
Wire.write(hhr[1]);             // DATA column 44
Wire.write(hhr[0]);             // DATA column 43
Wire.write(0x00);             // DATA column 42
Wire.write(ghr[4]);             // DATA column 41
Wire.write(ghr[3]);             // DATA column 40
Wire.write(ghr[2]);             // DATA column 39
Wire.write(ghr[1]);             // DATA column 38
Wire.write(ghr[0]);             // DATA column 37
Wire.write(0x00);             // DATA column 36
Wire.write(fhr[4]);             // DATA column 35

  Wire.endTransmission();     // stop transmitting


      Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x61); //device select 
    Wire.endTransmission();     // stop transmitting



Wire.beginTransmission(0x3C); // transmit to device
      Wire.write(0x0A); //load x address
      
Wire.write(0x00);             // DATA column 55
Wire.write(0x00);             // DATA column 54
Wire.write(ihr[4]);             // DATA column 53
Wire.write(ihr[3]);             // DATA column 52
Wire.write(ihr[2]);             // DATA column 51
Wire.write(ihr[1]);             // DATA column 50
Wire.write(ihr[0]);             // DATA column 49
Wire.write(0x00);             // DATA column 48
Wire.write(hhr[4]);             // DATA column 47
Wire.write(hhr[3]);             // DATA column 46
  
  Wire.endTransmission();     // stop transmitting
if(inputText_len > 9 && icolumn < inputText_len){
acolumn = (acolumn + 1);
bcolumn = (bcolumn + 1);
ccolumn = (ccolumn + 1);
dcolumn = (dcolumn + 1);
ecolumn = (ecolumn + 1);
fcolumn = (fcolumn + 1);
gcolumn = (gcolumn + 1);
hcolumn = (hcolumn + 1);
icolumn = (icolumn + 1);
delay(500);
}else{
acolumn = 0;
bcolumn = 1;
ccolumn = 2;
dcolumn = 3;
ecolumn = 4;
fcolumn = 5;
gcolumn = 6;
hcolumn = 7;
icolumn = 8;
    }


}
 //I don`t get this part fully.
void getColumns(char c, uint8_t columns[numColumns]) {
  switch (c) {
    case 'A'...'Z':
      memcpy_P(&columns[0], &upperCase[c - 'A'][0], numColumns); //I think that this "A" changes depending if it`s case A or B or C ... something like if it`s "A" do that, if it`s "B" do that...
      break;

    case 'a'...'z':
      memcpy_P(&columns[0], &lowerCase[c - 'a'][0], numColumns);
      break;

    case '0'...'9':
      memcpy_P(&columns[0], &numerals[c - '0'][0], numColumns);
      break;

    case ' ':
      memcpy_P(&columns[0], &space[0], numColumns);
      break;

    case '!'...'/':
      memcpy_P(&columns[0], &symbolsa[c - '!'][0], numColumns);
      break;

    case '['...'`':
      memcpy_P(&columns[0], &symbolsb[c - '['][0], numColumns);
      break;

    case '{'...'~':
      memcpy_P(&columns[0], &symbolsc[c - '{'][0], numColumns);
      break;


    case '=':
      memcpy_P(&columns[0], &equalSymbol[0], numColumns);
      break;

    case '@':
      memcpy_P(&columns[0], &afnaSymbol[0], numColumns);
      break;


      
    default:
      memcpy_P(&columns[0], &unknown[0], numColumns);
      break;
  }

}
```

Все разъяснено в окне отправки сообщения

Учусь. Учителя хорошие :slight_smile:

Молодец!

Спасибо. Решил проблему

Удали это пост (простыня мешает)

Новичкам вроде редактирование и удаление постов недоступно

Вроде удалил. Будьте добрее друг к другу, вы ведь на этом форуме именно друг для друга. И для таких, как я…..

Молодец. Смышленный малый, так то!

Посмотрел твой код (скорее всего не твой, так?).
Слишком много всего для «проверить». Начинать нужно с малого - попытаться зажечь один пиксель (символ).

Конечно код не мой. Я абсолютно не претендую на авторство, взял его с форума (см.выше).

И что Вы намерены делать с этой 400-строчной портянкой?

Если хотите научиться работать, начните с того, что

  1. выведите на экран букву А кодом в 10 строк.
  2. потом выведите слово “Кака” опять же кодом в 10 строк.
  3. наконец, выведите значение какой-нибудь переменной (числовой) – и снова кодом в 10 строк.

И только когда Вы научитесь писать коды в 10 строк, можете попробовать писать что-то большее.

А сразу хвататься за 400 строк – так это не работает.

Если я увижу здесь ВАШ код для вывода буквы “А”, я готов впрячься и помогать. А нет … ну, на нет и суда нет.

Евгений Петрович, я бы все таки добавил 0 (нулевой) пункт - попытаться зажечь один пиксель. Если и оно не сработает, все остальные пункты бессмысленны.

@SP634
Посмотрел ваш так называемый код - выкиньте его в помойку.
Не знаю, где вы его нашли, но писал его явно новичок, не имеющий представления не только о том, как делается пиксельных вывод на экран, но и просто о массивах и циклах.
Для краткости, данный код можно охарактеризовать фразой “закат Солнца вручную”.
С учётом квалификации автора кода, никакой гарантии, что он выводит пиксели на экран правильно, в этом коде нет. Поэтому я бы поискал что то другое, чтобы борясь с дисплеем, вы хотя бы были уверены в коде.

Евгений, вы будете смеяться, но вся эта портянка в 400 строк написана, чтобы вывести на экран первые 9 букв текста :

String inputText = "The lonely Shepherd (Der einsame Hirte) - Hardstyle Bootleg (Mixed By Lowwalker)";

Хорошо что автор кода остановился на первых буквах и не стал выводить всю фразу:)

Не буду.

Я просто попросил ТС ограничиться десятью строками СВОЕГО кода. При этом я согласен впрячься и помочь ему. У меня, правда, нет такого дисплея, но он, вроде, есть в “вовке”, так что попытаться помочь я бы, наверное, смог.

А что за дисплей? Где продаётся?

Другого готового кода в сети я не нашел. Этот еле-еле скачал (см.выше)

Возможно. Но думаю у меня уже не осталось времени для этого. Нужно было учиться лет 10-15 тому назад. А сейчас этот поезд уже не догнать, как не пытайся