BiHiTRiLL, Ты о чем? Ты не уверен, что case 'А' генерирует тот же utf-8 код, что и в строке?
Ну так ты должен жестко задать условие - если код однобайтный, то посмотреть, что там за байт, потом прибавить 1. Если двухбайтный - посмотреть, что за код и прибавить ДВА.
абсолютно. Проверил. Там закавыка была в том, что i прибавляется по каждому байту. И по ней же считается место куда писать в значения в to_display и в момент обработки второго байта двухбайтового значения результатов не получается, соответственно в массиве нули. Если же просто прибавлять два, то в этом случае уже в момент записи данных индекс позиции получается отстоящим на два от предыдущего. Сейчас все сделал, просто добавил еще одну переменную-счётчик позиции.
[spoiler='Код']
и в момент обработки второго байта двухбайтового значения результатов не получается, соответственно в массиве нули. Если же просто прибавлять два, то в этом случае уже в момент записи данных индекс позиции получается отстоящим на два от предыдущего.
int p = 60;
unsigned char phrase[] = "FАFАFАFА"; // В этой переменной буквы"А" - русские
unsigned char to_display[(sizeof(phrase) - 1) * 8]; // определяем размерность массива на основании длины фразы
int i = 0; // Переменная-индекс для указания позиции внутри массива to_display
int a = 0; // Переменная для хранения числа-индекса для русских букв
//----------------------------------------------------- вывод массива на экран
void scroll() //
{
for (int i = 0; i < sizeof(to_display) - 8; i++)
{
for (int j = 0; j < 8; j++)
lc.setRow(0, j, to_display[i + j]);
delay(p);
}
}
//---------------------------------------------------- начальные установки программы
void setup()
{
byte data[100][8] = // массив хранящий графическое изображение букв.
{
//--------------------------------------------------- заглавные латинские
{124, 254, 211, 17, 17, 255, 254, 0}, //A - 0
{255, 255, 82, 145, 159, 254, 96, 0}, //B
{124, 254, 195, 129, 195, 198, 100, 0}, //C
{255, 255, 130, 129, 193, 127, 30, 0}, //D
{195, 255, 126, 145, 145, 195, 66, 0}, //E
{193, 255, 127, 18, 17, 17, 3, 0}, //F - 5
{124, 254, 195, 129, 201, 123, 10, 0}, //G
{127, 255, 136, 8, 9, 255, 254, 0}, //H
{130, 129, 157, 255, 227, 129, 65, 0}, //I
{80, 240, 177, 129, 135, 255, 113, 0}, //J
{193, 255, 62, 24, 124, 198, 130, 0}, //K - 10
{195, 255, 126, 64, 64, 64, 128, 0}, //L
{126, 255, 195, 30, 2, 255, 255, 0}, //M
{127, 255, 134, 8, 49, 255, 254, 0}, //N
{120, 254, 195, 129, 195, 254, 120, 0}, //O
{255, 255, 34, 33, 49, 31, 30, 0}, //P - 15
{124, 254, 195, 145, 99, 254, 140, 0}, //Q
{255, 255, 18, 33, 121, 207, 134, 0}, //R
{64, 230, 143, 137, 137, 251, 114, 0}, //S
{3, 1, 199, 255, 127, 1, 3, 0}, //T
{121, 255, 131, 128, 128, 255, 127, 0}, //U - 20
{63, 127, 192, 128, 195, 127, 57, 0}, //V
{127, 255, 192, 120, 195, 255, 126, 0}, //W
{195, 231, 189, 24, 189, 231, 195, 0}, //X
{3, 135, 204, 104, 57, 31, 6, 0}, //Y
{230, 51, 155, 205, 198, 67, 97, 0}, //Z - 25
//--------------------------------------------------- заглавные русские
{124, 254, 211, 17, 17, 255, 254, 0}, //А - 26
{255, 255, 82, 145, 159, 254, 96, 0}, //Б
{124, 254, 195, 129, 195, 198, 100, 0}, //В
{255, 255, 130, 129, 193, 127, 30, 0}, //Г
{195, 255, 126, 145, 145, 195, 66, 0}, //Д - 30
{193, 255, 127, 18, 17, 17, 3, 0}, //Е
{124, 254, 195, 129, 201, 123, 10, 0}, //Ж
{127, 255, 136, 8, 9, 255, 254, 0}, //З
{130, 129, 157, 255, 227, 129, 65, 0}, //И
{80, 240, 177, 129, 135, 255, 113, 0}, //Й - 35
{193, 255, 62, 24, 124, 198, 130, 0}, //К
{195, 255, 126, 64, 64, 64, 128, 0}, //Л
{126, 255, 195, 30, 2, 255, 255, 0}, //М
{127, 255, 134, 8, 49, 255, 254, 0}, //Н
{120, 254, 195, 129, 195, 254, 120, 0}, //О - 40
{255, 255, 34, 33, 49, 31, 30, 0}, //П
{124, 254, 195, 145, 99, 254, 140, 0}, //Р
{255, 255, 18, 33, 121, 207, 134, 0}, //С
{64, 230, 143, 137, 137, 251, 114, 0}, //Т
{3, 1, 199, 255, 127, 1, 3, 0}, //У - 45
{121, 255, 131, 128, 128, 255, 127, 0}, //Ф
{63, 127, 192, 128, 195, 127, 57, 0}, //Х
{127, 255, 192, 120, 195, 255, 126, 0}, //Ц
{195, 231, 189, 24, 189, 231, 195, 0}, //Ч
{3, 135, 204, 104, 57, 31, 6, 0}, //Ш - 50
{230, 51, 155, 205, 198, 67, 97, 0}, //Щ
};
//---------------------------------------------------- создание массива to_display
while (phrase[i] != '\0') {
if (phrase[i] >= 0x21 && phrase[i] <= 0x7e) {//--- определяем не латинская ли буква
switch (phrase[i]) { //------------------------ обрабатываем латинские буквы
case 'A': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[ 0][j];}break;
case 'B': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[ 1][j];}break;
case 'C': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[ 2][j];}break;
case 'D': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[ 3][j];}break;
case 'E': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[ 4][j];}break;
case 'F': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[ 5][j];}break;
case 'G': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[ 6][j];}break;
}
i++;
p++;
}
//--------------------------------------------------- обрабатываем русские буквы
else {
a = (phrase[i] << 8) | (phrase[i + 1] & 0xff); // из двух байт кодирующих русскую букву в UTF-8 делаем одно число для анализа
i=i+2;
switch (a) {
case 'А': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[26][j];}break;
case 'Б': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[27][j];}break;
case 'В': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[28][j];}break;
case 'Г': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[29][j];}break;
case 'Д': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[30][j];}break;
case 'Е': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[31][j];}break;
case 'Ф': for (int j = 0; j < 8; j++){to_display[p * 8 + j] = data[32][j];}break;
}
}
p++;
}
//i++; // можно использовать один инкремент. если он одинаковый.
}
}
//--------------------------------------------------- основной цикл
void loop()
{
scroll(); // Вызываем вывод массива на экран
}
[/spoiler]
Грабли вылезли на ровном месте. Не могу задать длину массива to_display на основании длины phrase. Если делать через sizeof то на русскую букву считает два байта. А нужно просто посчитать количество символов в строке, а я не знаю пока как.
Сообщение изменено: BiHiTRiLL (20 марта 2015 - 23:44 )