Как избежать "дребезга" и появления ненужных пикселей

fura
Offline
Зарегистрирован: 31.07.2014

Здравствуйте. С ардуино "общаюсь" совсем недавно,новичек. В просторах интернета нашел статью -"Бегущая строка"на примере светодиодной матрицы и ардуино мега http://habrahabr.ru/post/129569/.

Немного переделав код получил необходимое,однако появился "дребезг" в отображении.Что нужно подправить в коде,чтобы его убрать?Долно читаться слово "Hello" .Спасибо.

const int row[8]={23,25,27,29,31,33,35,37};
const int col[8]={39,41,43,45,47,49,51,53};
int v=1; 
int dms=800; 

boolean A[8][23] = 
{0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,
 0,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,
 0,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,
 0,1,0,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0, 
 0,1,0,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
 };  

void setup()
{
  for (int x=0; x<8; x++)
    {
      pinMode(row[x],OUTPUT);
      pinMode(col[x],OUTPUT);
    }
  for (int x=0; x<8; x++)
    {
      digitalWrite(row[x],HIGH); 
    }
}

void loop()
{
    paint(A, v);
    scroll(A);
}

void paint(boolean screen[8][23], int v) 
{  
int x, y;
for (int c=0; c <v; c ++) 
  {
    for (x=0; x<8; x++)
      for (y=0; y<23; y++)
        {
          if (screen[x][y]==1)            
           {
              digitalWrite(row[x], LOW); 
              digitalWrite(col[y], HIGH); 
              delayMicroseconds(dms); 
 	      digitalWrite(row[x], HIGH); 
              digitalWrite(col[y], LOW); 
           }
            else 
             {
                 digitalWrite(row[x], HIGH); 
                 digitalWrite(col[y], LOW); 
                 delayMicroseconds(dms); 
                 digitalWrite(row[x], HIGH); 
                 digitalWrite(col[y], LOW);
            } 
        } 
    }
}

void scroll(boolean screen[8][23]) 
{
boolean buf[8][1]; 
  for (int x=0; x<8; x++)
  {
    buf[x][0]=screen[x][0]; 
  }
  for (int x=0; x<8; x++)
    for (int y=0; y<23; y++)
      {
        screen[x][y]=screen[x][y+1]; 
      }
  for (int x=0; x<8; x++)
  {
    screen[x][23-1]=buf[x][0]; 
  }
}

 

fura
Offline
Зарегистрирован: 31.07.2014
dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Один раз уже говорил о таком, но раз уместно, повторюсь. :)

Попробуй заменить digitalWrite на запись в порт. http://tronixstuff.com/2011/10/22/tutorial-arduino-port-manipulation/

Добавлю только, что если нужно писать не все 8 ног сразу, то нужно пользоваться битовыми операциями, чтобы не изменить атрибуты определенных пинов. http://www.arduino.cc/en/Reference/PortManipulation

То есть например, при конфигурации

DDRD = B11111110;  // sets Arduino pins 1 to 7 as outputs, pin 0 as input
DDRD = DDRD | B11111100;  // this is safer as it sets pins 2 to 7 as outputs
	                  // without changing the value of pins 0 & 1, which are RX & TX 

При записи (PORTx) и чтении (PINx) то же самое.

fura
Offline
Зарегистрирован: 31.07.2014

Через порты пробывал,зажигаются строки полностью или ряды матрицы.При этом  возникает нагрев микроконтроллера ардуины.

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Посмотрел мельком, по ссылке на хабр один только код. Чего вы там насоединяли, номиналы и прочее - схему бы знать...  

И новый код, конечно.

fura
Offline
Зарегистрирован: 31.07.2014

Только у меня 7х6.Измененный код в первом сообщении в спойлере

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Схема это хорошо, а в коде что поменялось? Всё те же digitalWrite. Ну и комментировать код полезно, не только для окружающих, но и для себя.

Что касается функций paint и scroll: во-первых, двумерные массивы по уму передаются каким-то другим способом, во-вторых, переменные и массивы row, col, v, dms, A - типа как глобальные, передавать их как аргументы не надо - функции итак их видят.

Куда "+" на схеме цепляется, на 5v ардуины чтоли? Точно греется контроллер, а не стаб?

 

fura
Offline
Зарегистрирован: 31.07.2014

Вот к примеру  такой код

void setup()
{
  DDRA = B01111111; // set PORTA (digital 7~0)
  //  to output
  DDRB = B00111111; // PORTB (6~0)
}

byte a = B00000001;
byte b = B01000000;

void krider() // движение солбца влево
{
  for (int k=0; k<1; k++)// количество повторов функции 
  {
    for (int z=0; z<7; z++) // на сколько столбцов сдвигать
    {
      PORTA = a << z; // сдвиг
      delay(400); // пауза между переключением следующего столбца
    }
  }
}

void on() // функция включения столбца(может быть любой столбец)
{
  {
    PORTA = b; // включение 7 столбца
  }
}

void loop()
{
  krider();
  delay(500);
  on();
  delay(500);
}

Как я понимаю можно включать только полностью строку и столбцы.Как например букву какую нибудь вывести?

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Код ...

void setup()
{
  DDRA = B01111111; // set PORTA (digital 7~0)
                    //  to output
  DDRB = B00111111; // PORTB (6~0)
}

... немного напрягает. PORTB - это с 8 до 13, а с 0 до 7 это PORTD, про PORTA вообще не слышал. Какая именно ардуина?

И PORTB конфигурируется, но не используется у вас. :) Таким образом не ясно, какие ноги управляют 315-ми, а какие 361-ми.

Если хочется зажечь светодиод (0;3) например, тогда надо на 315-е надо дать 00000001, а на 361-е дать 11110111 (раз открываются нулём)

fura
Offline
Зарегистрирован: 31.07.2014

ардуина мега2560 - PORTА  0-7(22-29 гнезда), PORTB 0-7 (53,42,51,50,10,11,12,13) соответственно. Без инициализации PORTB нет 0 на 361-ых. Для анодов 22-28 выводы,для катодов 53-50,10 и 11.Как зажечь светодиод это понятно.Не понятно как зажечь несколько светодиодов.К примеру "+"

fura
Offline
Зарегистрирован: 31.07.2014

Так как если дать на 315-ые 0001000, а на 361-ые 00110111 рисунка "+" не получится,а будет светиться только 1 светодиод

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Зажечь несколько - поставить несколько единиц (нулей) в соответствующих разрядов регистров портов.

fura пишет:

Так как если дать на 315-ые 0001000, а на 361-ые 00110111 рисунка "+" не получится,а будет светиться только 1 светодиод

Аномалия какая-то. Чего мы еще не учли, интересно...

fura
Offline
Зарегистрирован: 31.07.2014

будут все светодиоды светиться прямоугольниками

 

fura
Offline
Зарегистрирован: 31.07.2014

на PIC16 в статье со схемы как-то реализуется вращение знака "+"

http://www.radiohlam.ru/program/images/diode_matrix_prg2.gif

fura
Offline
Зарегистрирован: 31.07.2014

Считаю необходимо всетаки использывать массивы вроде

boolean [7][6] =
{0,0,0,1,0,0,0,
 0,0,0,1,0,0,0,
 0,1,1,1,1,1,0,
 0,0,0,1,0,0,0,
 0,0,0,1,0,0,0,
 0,0,0,0,0,0,0}

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Ну логично, символы/изображения по другому задавать не ахти развлечение. Надо просто придумывать, как на основе этого массива кидать команды на все ноги сразу.

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014






byte pixelString(){ // "преобразование" строки массива в байт
   byte res=0; //результат
   int i;
   for(i=0;i<8;i++){ //установка битов в соответствии с данными из массива, скажем так
        if(array[i]) res=res|(1<<i); //если в ячейке глобального массива единица ...
    }                                // побитовое ИЛИ позволяет сохранить без изменения уже установленные единицы
  return res;

}

Пример. Просто демонстрация концепции, конкретно под это переделывать надо.

fura
Offline
Зарегистрирован: 31.07.2014

Нашел на вродебы что-то необходимое


unsigned char screen_buffer [8];
screen_buffer [0] = 0x8;  // 00001000
screen_buffer [1] = 0x8;  // 00001000
screen_buffer [2] = 0x3E;  // 00111110
screen_buffer [3] = 0x8;  // 00001000
screen_buffer [4] = 0x8;  // 00001000
screen_buffer [5] = 0x8;  // 00001000
screen_buffer [6] = 0x0;  // 00000000
screen_buffer [7] = 0x0;  // 00000000
for (char i=0; i<8; i++)
{
   PORTA = (1 << i); // включили столбец i
   PORTB = screen_buffer [i]; // зажгли нужные пиксели столбца
   delay ();
}
fura
Offline
Зарегистрирован: 31.07.2014

Вот код 

const int row[8] = {53,52,51,50,10,11,12,13};
const int col[8] = {22,23,24,25,26,27,28,29};
int v=5; 
int dms=200; 

boolean Plus [8][8] = 
{0,0,0,1,0,0,0,0,
 0,0,0,1,0,0,0,0,  
 0,1,1,1,1,1A,0,0,  
 0,0,0,1,0,0,0,0,  
 0,0,0,1,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,0};  

void setup()
{
  for (int i=0; i<8; i++)
    {
      pinMode(row[i],OUTPUT);
      pinMode(col[i],OUTPUT);
    }
  for (int i=0; i<8; i++)
    {
      digitalWrite(row[i],HIGH); 
    }
}

void loop()
{
    paint(Plus , v);
    
}

void paint(boolean screen[8][8], int v) 
{  
int i, j;
for (int c=0; c <v; c ++) 
  {
    for (i=0; i<8; i++)
      for (j=0; j<8; j++)
        {
          if (screen[i][j]==1)            
           {
              digitalWrite(row[i], LOW); 
              digitalWrite(col[j], HIGH); 
              delayMicroseconds(dms); 
 	      digitalWrite(row[i], HIGH); 
              digitalWrite(col[j], LOW); 
           }
            else 
             {
                 digitalWrite(row[i], HIGH); 
                 digitalWrite(col[j], LOW); 
                 delayMicroseconds(dms); 
                 digitalWrite(row[i], HIGH); 
                 digitalWrite(col[j], LOW);
            } 
        } 
    }
}

Все с тем же применением digitalWrite()

const int row[8] = {53,52,51,50,10,11,12,13};
const int col[8] = {22,23,24,25,26,27,28,29};

Можно заменить

DDRB  =  B11111111;
DDRA = B11111111;

в остальной части не понимаю как на порты перевести

 

fura
Offline
Зарегистрирован: 31.07.2014

Что-то замена не прошла удачно. Изначальный код(в предидущем сообщении) работает. Чтобы не загромождать код массивами. Наверное надо библиотеку из массивов делать,при чередовании отображаемых символов

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Короче, разбейте задачу "перевода на порты" на задачи поменьше, а то я перестал понимать, что здесь происходит.

А с заменой row[8] = {53,52,51,50,10,11,12,13} на DDRB = B11111111... Использование DDRB заменяет восьмикратный вызов функции pinMode(X,OUTPUT). Причём тут массив с номерами ног? Спойлер: ни при чём.

fura
Offline
Зарегистрирован: 31.07.2014

Извиняюсь за "мысли вслух". Пытаюсь отобразить символ "+" во вращении с помощью кода из 18 поста(в спойлере) - путем добавления других массивов в коде.

fura
Offline
Зарегистрирован: 31.07.2014

Получился такой код

const int row[8] = {53,52,51,50,10,11,12,13};
const int col[8] = {22,23,24,25,26,27,28,29};
int v=10; //время отображения пикселя
int dms=200; 

boolean A [8][8] = 
{0,0,0,1,0,0,0,0,
 0,0,0,1,0,0,0,0,  
 0,1,1,1,1,1,0,0,  
 0,0,0,1,0,0,0,0,  
 0,0,0,1,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,0}; 

 boolean B [8][8] = 
{0,0,0,0,1,0,0,0,
 0,1,0,1,0,0,0,0,  
 0,0,1,1,1,0,0,0,  
 0,0,0,1,0,1,0,0,  
 0,0,1,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,0,0}; 

boolean C [8][8] = 
{0,0,0,0,1,0,0,0,
 0,1,1,0,1,0,0,0,  
 0,0,0,1,0,0,0,0,  
 0,0,1,0,1,1,0,0,  
 0,0,1,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,0,0};

 boolean D [8][8] = 
{0,1,0,0,0,1,0,0,
 0,0,1,0,1,0,0,0,  
 0,0,0,1,0,0,0,0,  
 0,0,1,0,1,0,0,0,  
 0,1,0,0,0,1,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};

boolean E [8][8] = 
{0,0,1,0,0,0,0,0,
 0,0,1,0,1,1,0,0,  
 0,0,0,1,0,0,0,0,  
 0,1,1,0,1,0,0,0,  
 0,0,0,0,1,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};

 boolean F [8][8] = 
{0,0,1,0,0,0,0,0,
 0,0,0,1,0,1,0,0,  
 0,0,1,1,1,0,0,0,  
 0,1,0,1,0,0,0,0,  
 0,0,0,0,1,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}; 
 
void setup()
{
  
    {
      DDRB = B11111111;
      DDRA = B11111111;
    }
  
    {
      PORTB = B11111111; 
    }
}

void loop()
{
    paint(A, v);
    delay(100);
    paint(B, v);
    delay(100);
    paint(C, v);
    delay(100);
    paint(D, v);
    delay(100);
    paint(E, v);
    delay(100);
    paint(F, v);
    delay(100);
    
}

void paint(boolean screen[8][8], int v) 
{  
int i, j;
for (int c=0; c <v; c ++) 
  {
    for (i=0; i<8; i++)
      for (j=0; j<8; j++)
        {
          if (screen[i][j]==1)            
           {
              digitalWrite(row[i], LOW); 
              digitalWrite(col[j], HIGH); 
              delayMicroseconds(dms); 
 	      digitalWrite(row[i], HIGH); 
              digitalWrite(col[j], LOW); 
           }
            else 
             {
                 digitalWrite(row[i], HIGH); 
                 digitalWrite(col[j], LOW); 
                 delayMicroseconds(dms); 
                 digitalWrite(row[i], HIGH); 
                 digitalWrite(col[j], LOW);
            } 
        } 
    }
}

void paint не удалось изменить

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

http://www.instructables.com/id/Persistence-of-Vision-Wand/

родственная тема.....

#include <avr/pgmspace.h>
String povtext = " Z E N I T " ;
byte RefreshRate = 2 ;
int Dlina_Text = povtext.length() ;
byte Data_B = 0 ;
byte Data_C = 0 ;
byte Data_D = 0 ;
byte t ;
byte l ;
byte n ;
//=================================================================================================================================================================
boolean Letter_TEST []= {
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,     };
//=================================================================================================================================================================
boolean Letter_A [] PROGMEM = {
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 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, 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, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,     };
//=================================================================================================================================================================  
boolean Letter_B [] PROGMEM = {
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  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, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 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, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_C [] PROGMEM = {
  0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 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, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1,
  1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,     };
//=================================================================================================================================================================
boolean Letter_D [] PROGMEM = {
  1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 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, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_E [] PROGMEM = {
  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, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_F [] PROGMEM = {
  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, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_G [] PROGMEM = {
  0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  0, 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, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_H [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_I [] PROGMEM = {
  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, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_J [] PROGMEM = {
  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, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
  0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_K [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_L [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_M [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 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, 1, 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, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_N [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 0, 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, 1, 1, 1,
  1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_O [] PROGMEM = {
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 0, 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, 1, 1,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_P [] PROGMEM = {
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  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, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 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, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_Q [] PROGMEM = {
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 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, 1, 1, 0,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_R [] PROGMEM = {
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  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, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 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, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_S [] PROGMEM = {
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0,
  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0,
  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 0, 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, 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, 0,     };
//=================================================================================================================================================================
boolean Letter_T [] PROGMEM = {
  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, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_U [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 0, 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, 1, 1,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_V [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,
  0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
  0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_W [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
  0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0,
  0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0,
  0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_X [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,
  0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
  0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
  0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,     };
//=================================================================================================================================================================
boolean Letter_Y [] PROGMEM = {
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
  0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,
  0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
  0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,     };
//=================================================================================================================================================================
boolean Letter_Z [] PROGMEM = {
  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, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0,
  0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
  0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0,
  0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
  0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,     };
//=================================================================================================================================================================
void sendToWand( boolean LetterArray[] ){
    for ( t = 0 ; t < 12 ; t++ ){
        for ( l = 0 ; l < 6 ; l++ ){
            Data_B = Data_B << 1;
            Data_B |= pgm_read_byte_near( LetterArray + ( l * 12 + t ) ) ;
        }
        for ( l = 6 ; l < 14 ; l++ ){
        Data_C = Data_C << 1 ;
        Data_C |= pgm_read_byte_near( LetterArray + ( l * 12 + t ) ) ;
        }
        for ( l = 14 ; l < 20 ; l++ ){
        Data_D = Data_D << 1 ;
        Data_D |= pgm_read_byte_near( LetterArray + ( l * 12 + t ) ) ;
        }
        PORTB = Data_B ;
        PORTD = Data_C ;
        PORTC = Data_D ;
// через сдвиговый резистор
        delay( RefreshRate ) ;
        Data_B = 0 ;
        Data_C = 0 ;
        Data_D = 0 ;
// через сдвиговый резистор
    }
}
//=================================================================================================================================================================
void sendToWandMW( boolean LetterArray[] ){
    for ( t=0 ; t < 15 ; t++ ){
        for ( l=0 ; l < 6 ; l++ ){
            Data_B = Data_B << 1 ;
            Data_B |= pgm_read_byte_near( LetterArray + ( l * 15 + t ) ) ;
        }
        for ( l=6 ; l < 14 ; l++ ){
            Data_C = Data_C << 1 ;
            Data_C |= pgm_read_byte_near( LetterArray + ( l * 15 + t ) ) ;
        }
        for ( l=14 ; l < 20 ; l++ ){
            Data_D = Data_D << 1 ;
            Data_D |= pgm_read_byte_near( LetterArray + ( l * 15 + t ) ) ;
        }
        PORTB = Data_B ;
        PORTD = Data_C ;
        PORTC = Data_D ;
// через сдвиговый резистор
        delay( RefreshRate ) ;
        Data_B = 0 ;
        Data_C = 0 ;
        Data_D = 0 ;
// через сдвиговый резистор
    }
}
//=================================================================================================================================================================
void setup() {
    DDRB = 0xFF ;
    DDRC = 0xFF ;
    DDRD = 0xFF ;
    for ( byte j = 0 ; j < 20 ; j++ ){
        for ( byte i = 0 ; i < 6 ; i++ ){
            Data_B = Data_B << 1 ;
            Data_B |= Letter_TEST [ ( i * 20 + j ) ] ;
        }
        for ( byte i = 6 ; i < 14 ; i++ ){
            Data_C = Data_C << 1 ;
            Data_C |= Letter_TEST [ ( i * 20 + j ) ] ;
        }
        for ( byte i = 14 ; i < 20 ; i++ ){
            Data_D = Data_D << 1 ;
            Data_D |= Letter_TEST [ ( i * 20 + j ) ] ;
        }
        PORTB = Data_B ;
        PORTD = Data_C ;
        PORTC = Data_D ;
        delay(150);
    }
    Data_B = 0 ;
    Data_C = 0 ;
    Data_D = 0 ;
    PORTB = Data_B ;
    PORTD = Data_C ;
    PORTC = Data_D ;
}
//=================================================================================================================================================================
void loop() {
    PORTB = 0 ;
    PORTD = 0 ;
    PORTC = 0 ;
    delay( RefreshRate * 3 ) ;
    for ( n = 0 ; n < Dlina_Text ; n++ ) {
        if      ( povtext.charAt( n ) == 'A' ) {
            sendToWand( Letter_A ) ;
        }
        else if ( povtext.charAt( n ) == 'B' ) {
            sendToWand( Letter_B ) ;
        }
        else if ( povtext.charAt( n ) == 'C' ) {
            sendToWand( Letter_C ) ;
        }
        else if ( povtext.charAt( n ) == 'D' ) {
            sendToWand( Letter_D );
        }
        else if ( povtext.charAt( n ) == 'E' ) {
            sendToWand( Letter_E ) ;
        }
        else if ( povtext.charAt( n ) == 'F' ) {
            sendToWand( Letter_F ) ;
        }
        else if ( povtext.charAt( n ) == 'G' ) {
            sendToWand( Letter_G ) ;
        }
        else if ( povtext.charAt( n ) == 'H' ) {
            sendToWand( Letter_H ) ;
        }
        else if ( povtext.charAt( n ) == 'I' ) {
            sendToWand( Letter_I ) ;
        }
        else if ( povtext.charAt( n ) == 'J' ) {
            sendToWand( Letter_J ) ;
        }
        else if ( povtext.charAt( n ) == 'K' ) {
            sendToWand( Letter_K ) ;
        }
        else if ( povtext.charAt( n ) == 'L' ) {
            sendToWand( Letter_L ) ;
        }
        else if ( povtext.charAt( n ) == 'M' ) {
            sendToWandMW( Letter_M ) ;
        }
        else if ( povtext.charAt( n ) == 'N' ) {
            sendToWand( Letter_N ) ;
        }
        else if ( povtext.charAt( n ) == 'O' ) {
            sendToWand( Letter_O ) ;
        }
        else if ( povtext.charAt( n ) == 'P' ) {

        }
        else if ( povtext.charAt( n ) == 'Q' ) {
            sendToWand( Letter_Q ) ;
        }
        else if ( povtext.charAt( n ) == 'R' ) {

        }
        else if ( povtext.charAt( n ) == 'S' ) {

        }
        else if ( povtext.charAt( n ) == 'T' ) {
            sendToWand( Letter_T ) ;
        }
        else if ( povtext.charAt( n ) == 'U' ) {
            sendToWand( Letter_U ) ;
        }
        else if ( povtext.charAt( n ) == 'V' ) {
            sendToWand( Letter_V ) ;
        }
        else if ( povtext.charAt( n ) == 'W' ) {
            sendToWandMW( Letter_W ) ;
        }
        else if ( povtext.charAt( n ) == 'X' ) {
            sendToWand( Letter_X ) ;
        }
        else if ( povtext.charAt( n ) == 'Y' ) {
            sendToWand( Letter_Y ) ;
        }
        else if ( povtext.charAt( n ) == 'Z' ) {
            sendToWand( Letter_Z ) ;
        }
        else if ( povtext.charAt( n ) == ' ') {
            PORTB = 0 ;
            PORTD = 0 ;
            PORTC = 0 ;
            delay( RefreshRate * 3 ) ;
        }
        PORTB = 0 ;
        PORTD = 0 ;
        PORTC = 0 ;
        delay( RefreshRate ) ;
    }
    PORTB = 0 ;
    PORTD = 0 ;
    PORTC = 0 ;
    delay( RefreshRate * 3 ) ;
}
//=================================================================================================================================================================

 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

fura пишет:

Получился такой код

Вместо такого можно сделать просто трехмерный массив, кстати говоря.

Вообще, лучше додумать, как показывать один конкретный кадр. Скетч должен выводить кадр из некого буфера (специального массива) бесконечно долго - тут задача динамической индикации: показать одну строку (столбец) кадра, через какое-то малое время показать следующую и т.д. А формировать сигналы на транзисторы образом, крайне похожим на код из #16 (предчувствуя затык - для PNP "сдвиг нуля" можно сделать побитовой инверсией "~" того, что будет от двигания единицы).

Потом по ходу работы загонять в буфер кадра другую картинку. И пока вы не наворотили дофига вложенных циклов с delay, изучите пример BlinkWithoutDelay.

fura
Offline
Зарегистрирован: 31.07.2014

Честно говоря весь код  понимаю смутно. Точнее содержимое функций мне не понятно. Вот к примеру в #22 понятно только, что в setup обявлены порты.  В loop порядок вывода значений на табло. Функция paint - вывод на массивов на табло,а то что в этой функции происходит не ясно. 

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

На схему свою в #5 гляньте, код понятнее станет. В #22 в двух циклах просматриваются все 64 ячейки "кадра" (8 столбцов, 8 строк). Если светодиод надо зажечь (в ячейке массива - единица), выставляется единица на базу NPN транзистора и ноль на базу PNP транзистора. Тогда транзисторы открываются, ток течёт, светодиод загорается. Потом контроллер ждёт сколько-то микросекунд и вырубает этот светодиод обратными операциями. А вот коде для случая, если светодиод гореть не должен, в коде светодиод тушится дважды зачем-то. Либо по невнимательности писавшего, либо чтобы времени одинакого тратилось.

Это если двумерный массив, переданный в функцию таким способом, хавается прогой.

fura
Offline
Зарегистрирован: 31.07.2014

Прикупил для полной картины светодиодную матрицу 8х8.Для начала решил запустить просто бегущий ряд - полоса бегает то вправо, то влево(в общем бегущие огни) вот код 


unsigned char upDown=1;     // начинаем с движения вверх    
unsigned char cylon=0;      // определяет очередность LED
void setup()
{
  DDRA = B11111111;
  DDRB = B11111111;
}
void loop()
{
  PORTA = B10000000;
  PORTB = B00000000;
if(upDown==1){                // если идем вверх, то
    cylon++;
    if(cylon>=7) upDown=0;      // когда достигнут наибольший номер LED, то в след. цикле идем вниз
  }
  else {
    cylon--;
    if(cylon==0) upDown=1;      // когда достигнут наименьший номер LED, то в след. цикле идем вверх
  }
  PORTA = 1 << cylon;         //сдвиг
  delay(200);                   // пауза 200 мс
}

Возник вопрос как сделать чтобы полоса бегала только с права налево,а не туда сюда?

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Удалить операторы if(upDown==1) и else и ещё один из оставшихся после этого блоков операторов.

Останется либо только



cylon++;
if(cylon>=7) upDown=0; 

либо 



cylon--;
if(cylon==0) upDown=1;

Кто код-то писал? Всего 22 строчки - уж можно как-то в уме его выполнить и прикинуть, что получится.

fura
Offline
Зарегистрирован: 31.07.2014

При выше упомянутом изминении строка действительно бежит в одну из сторон,однако лишь однократно. Наверное нужно добавлять цикл?Нашел вот такой код 

//программа 1 «Бегущие огни»
int led = 1; // глобальная переменная, хранящая номер «зажигаемого» вывода
void setup() {
 DDRA = 255; // все выводы порта A настраиваем как выходы
 DDRB = 255;
  
 }
void loop() {
 PORTB = B00000000; 
 PORTA = led; // «зажигаются» соответствующие выводы порта A
 delay(200); // задержка в 0,3 сек.
 led = led<<1; // сдвиг влево – если горел 1-й светодиод, то следующим зажжётся второй
 if (led > 128) // 128 = B10000000
 led = 1; // после 8-го светодиода возвращаемся к первому
}

Строка бегает циклически в одном направлении,однако направление её движения слева направо, а хотелось бы справа налево(необходимо это для дальнейшего редактирования скетча и вместо полосы загонять символы).Редактировал код ,но ничего не вышлоДумаю направление(к чему двигаться в разработке бекущей строки из текста) взял правильно?

ПС. код из поста 27 вpят с сайта http://cxem.net

dezz0riented
dezz0riented аватар
Offline
Зарегистрирован: 27.07.2014

Так сделать наоборот и всё :)

led=128 вместо единицы изначально, сдвигать  вправо >>. Потом if ( led < 1) led = 128. Даже как-то неудобно объяснять такие вещи.

fura пишет:
Думаю направление(к чему двигаться в разработке бекущей строки из текста) взял правильно?
Логично. Начинать надо с маленького.

fura
Offline
Зарегистрирован: 31.07.2014

Отредактировал код из

const int row[8]={23,25,27,29,31,33,35,37};
const int col[8]={39,41,43,45,47,49,51,53};
int v=1; 
int dms=800; 

boolean A[8][23] = 
{0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,
 0,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,
 0,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,
 0,1,0,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0, 
 0,1,0,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
 };  

void setup()
{
  for (int x=0; x<8; x++)
    {
      pinMode(row[x],OUTPUT);
      pinMode(col[x],OUTPUT);
    }
  for (int x=0; x<8; x++)
    {
      digitalWrite(row[x],HIGH); 
    }
}

void loop()
{
    paint(A, v);
    scroll(A);
}

void paint(boolean screen[8][23], int v) 
{  
int x, y;
for (int c=0; c <v; c ++) 
  {
    for (x=0; x<8; x++)
      for (y=0; y<23; y++)
        {
          if (screen[x][y]==1)            
           {
              digitalWrite(row[x], LOW); 
              digitalWrite(col[y], HIGH); 
              delayMicroseconds(dms); 
 	      digitalWrite(row[x], HIGH); 
              digitalWrite(col[y], LOW); 
           }
            else 
             {
                 digitalWrite(row[x], HIGH); 
                 digitalWrite(col[y], LOW); 
                 delayMicroseconds(dms); 
                 digitalWrite(row[x], HIGH); 
                 digitalWrite(col[y], LOW);
            } 
        } 
    }
}

void scroll(boolean screen[8][23]) 
{
boolean buf[8][1]; 
  for (int x=0; x<8; x++)
  {
    buf[x][0]=screen[x][0]; 
  }
  for (int x=0; x<8; x++)
    for (int y=0; y<23; y++)
      {
        screen[x][y]=screen[x][y+1]; 
      }
  for (int x=0; x<8; x++)
  {
    screen[x][23-1]=buf[x][0]; 
  }
}

 #1 поста на  

const int row[8]={53,52,51,50,10,11,12,13};
const int col[8]={22,23,24,25,26,27,28,29};
int v=5; 
int dms=400; 

boolean A[8][44] = 
{0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 0,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0, 
 0,1,0,0,0,0,1,0,0,1,1,1,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0, 
 0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 
 0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,
 0,1,0,0,0,0,1,0,0,1,1,1,0,0,0,1,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
 0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
 0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0 };  

void setup()
{
  for (int i=0; i<8; i++)
    {
      pinMode(row[i],OUTPUT);
      pinMode(col[i],OUTPUT);
    }
  for (int i=0; i<8; i++)
    {
      digitalWrite(row[i],HIGH); 
    }
}

void loop()
{
    paint(A, v);
    scroll(A);
}

void paint(boolean screen[8][44], int v) 
{  
int i, j;
for (int c=0; c <v; c ++) 
  {
    for (i=0; i<8; i++)
      for (j=0; j<8; j++)
        {
          if (screen[i][j]==1)            
           {
              digitalWrite(row[i], LOW); 
              digitalWrite(col[j], HIGH); 
              delayMicroseconds(dms); 
 	      digitalWrite(row[i], HIGH); 
              digitalWrite(col[j], LOW); 
           }
            else 
             {
                 digitalWrite(row[i], HIGH); 
                 digitalWrite(col[j], LOW); 
                 delayMicroseconds(dms); 
                 digitalWrite(row[i], HIGH); 
                 digitalWrite(col[j], LOW);
            } 
        } 
    }
}

void scroll(boolean screen[8][44]) 
{
boolean buf[44][1]; 
  for (int i=0; i<44; i++)
  {
    buf[i][0]=screen[i][0]; 
  }
  for (int i=0; i<8; i++)
    for (int j=0; j<44; j++)
      {
        screen[i][j]=screen[i][j+1]; 
      }
  for (int i=0; i<8; i++)
  {
    screen[i][44-1]=buf[i][0]; 
  }
}