Вывод символов на vga монитор.

Кимович
Offline
Зарегистрирован: 08.05.2022
   Была задумка заменить "севшие" и неисправные кинескопы в УЦИ на светодиодные индикаторы.
Чтобы меньше паять(напаялся уже),взял готовые 8-ми разрядные цифровые с SPI интерфейсом(MAX7219).
 
Такой дисплей получился:
 
 
    Когда процесс пошёл ,увидел ,что индикация для станка микроскопическая,
а другие варианты-морока со  сборкой и дорого для экспериментов.
 
   И на производстве не заинтересовались-обходились же до сих пор.
Забросил. А осадок остался-не завершённое дело.
Пришла идея,вот бы поженить SPI и VGA-и там и там последовательный поток информации.
       
   В интернетовском лесу нашёл вот это https://www.gammon.com.au/forum/?id=11608
В программе не разобрался-какая-то иностранщина(а дедушка новичок),
но с переводчиком синхронизацию и настройки таймеров осилил.
А дальше-есть цель, средства(ардуино+старый монитор) и предлинный больничный.
 
подключение ардуино к монитору:
 
 
Голый принцип использования SPI:
 
[code]

//arduino-1.8.7-windows
// плата Arduino Nano v 3.0 ATmega328P 16 мгц
// Голый принцип использования SPI

  volatile int l=0;            //счётчик строк горизонтальной развёртки

void setup() {
      pinMode (3, OUTPUT);             //OC2B-->Pin3 строчная синхронизация
      pinMode (10, OUTPUT);            //OC1B-->Pin10 кадровая синхронизация (вывод pin10(PB2)настроен на выход-не участвует в аппаратном  SPI) 
      pinMode(11, OUTPUT);             //видео

  //-------------------Настройка SPI------------------------------------------                                   
      SPCR=0b01010100;                //включен ,старшим битом вперёд,ведущий, режим1(по последнему фронту SCK
                                      //  фиксация посл. бита на MOSI- поэтому последний бит должен=0)
      SPSR &=~(1<<0);                 // тактовая 16мгц/4
      
    //----------------- выключение таймера 0 ---------------------------------------
      TIMSK0 = 0;         
      OCR0A = 0;   
      OCR0B = 0;

//-------------------- Таймер 1 для кадровой синхронизации ------------------
     TCCR1A = 0b00110011;         // включен выход OC1B(Pin10),режим  ШИМ (OCR1A)
     TCCR1B = 0b00011101;         // 16мгц/1024-предделитель
     OCR1A = 259;                 //регистр сравнения A-выполняет роль TOP -период кадровой примерно=16.6мс
     OCR1B = 0;                   //регистр сравнения B-по совпадению вкл. OC1B(в 1),после TCNT1=0 выкл. OC1B(в 0)
                                  // OCR1B = 0, но на сравнение уходит 1 такт-получается 64 мкс ширина кадрового синхроимпульса
     TIMSK1 = bit (TOIE1);        // разрешает прерывание по переполнению счётного регистра ( TOP=OCR1A=259)
     TIFR1 = bit (TOV1);          // при записи 1 флаг сбрасывается(там и так 0)
 
//----------------------- Таймер 2 для строчной синхронизации ------------------------
     TCCR2A = 0b00110011;          // включен выход OC2B(Pin3),режим  ШИМ (OCR2A)
     TCCR2B = 0b00001010;          // предделитель 16мгц/8
     OCR2A = 63;                   //регистр сравнения A-период строчной прим.=32мкс
     OCR2B = 7;                    //регистр сравнения B-синхроимпульс прим.=4мкс
     TIMSK2 = bit (TOIE2);          // разр. прер. по переполнению счётного регистра(TOP=OCR2A=63)
     TIFR2 = bit (TOV2);            //  там и так 0
 
}  //***********конец void setup()************

void loop() {}                // пустая крутится 

ISR (TIMER1_OVF_vect)//----------------обработчик  прерывания от таймера1-------------------------
 {  
    l=0;                         //счётчик строк гориз. развёртки
   delayMicroseconds(3000);      //иммитация полезной программы
   TIFR2 |=(1<<TOV2);            // сбросим флаг пропущенных прерываний от Т2          
}  //конец обработчика таймера1

 ISR (TIMER2_OVF_vect)  //---------------обработчик прерывания от таймера2 ---------------------
  {
       delayMicroseconds(7);            // для выравнивания по горизонтали
       l=l+1;                          // счёт начинается после окончания обработчика ISR (TIMER1_OVF_vect))
   if (l<100||l>200) return ;          // ограничение отображения сверху,снизу 
                 
//-------------------отображение -------------------------------
        SPSR &=~(1<<0);                 // тактовая 16мгц/4
   SPDR=0b11111110;                    // засвечивается вертикальная полоса, размер по горизонтали от тактовой SPI       
       delayMicroseconds(4);           //  задержка позволяет дождаться полного вывода предыдущего и
                                       // развести символы по горизонтали           
   SPDR=0b10101010;                    //  следующий вывод
      delayMicroseconds(4);  
      SPSR|=(1<<0);                    // меняем тактовую частоту SPI(x2) после задержки(полоса уже)
                  
   SPDR=0b10101010;                  //  следующий вывод-и так заполняем всю строку                                    
 }//конец обработчика  от таймера2
 
[/code]
 
    Если коротко-в начале кадра готовится информация(в кадровом обработчике),
ничего не выводится(другие прерывания же запрещены). 
По окончанию кадрового обработчика начинают включатся строчные и 
информация в соответствии с знакоместом и матрицей выстреливается на экран.
 
уже в конце упёрся в тупик- вертикальные края символов немного смазанные.
Подозреваю ,что из loop вход в обработчик занимает разное время.
А у старшего товарища Nickа Gammonа на картинке всё чётко.
И подсмотрел,как у него запускается строка - а из спящего режима.Всё закрыл тему.
 
   Картинка получилась чёткая,дедушка доволен.
Теперь для дисплея пилить,строгать и паять по минимуму.
 
строка символов:
 
 
[code]

//arduino-1.8.7-windows
// плата Arduino Nano v 3.0 ATmega328P 16 мгц
// Отображение символьной информации на VGA монитор.

#include <avr/sleep.h>          //работа со спящими режимами

                                         
 volatile byte g=0;            // счётчик строк горизонтальной развёртки в пикселе
  volatile byte t=0;           // счётчик пикселей в символе по вертикали(см. Zngenerator[16][15]) 
  volatile int l=0;            //счётчик строк горизонтальной развёртки
  byte m=100;                   // m корректируем смещение изображения по вертикали
  byte k=50;                   // фиксация времени на обработчик T1(можно корректировать смещение изображения по вертикали)
           
  //--------------------------------массив знакогенератора 0...9 и т.д. --------------------------------                  
   //                  полная матрица 8х15,знаки 7х10, с 11 по 15 пустые байты для промежутка между символами по вертикали,когда несколько строк.                          
   //                  В двоичном виде нагляднее  написать шрифт,нулевой бит всегда=0(т.к. последний выводимый остаётся на выходе)
   
const byte Zngenerator[16][15]={{0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // это 0
                          {0b00001000,0b00011000,0b00101000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 1
                          {0b11111110,0b10000010,0b10000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000,0b10000000,0b11111110,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 2
                          {0b11111100,0b00000010,0b00000010,0b00000010,0b01111100,0b00000010,0b00000010,0b00000010,0b00000010,0b11111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 3
                          {0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b11111110,0b00000010,0b00000010,0b00000010,0b00000010,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 4
                          {0b11111100,0b10000000,0b10000000,0b10000000,0b11111100,0b00000010,0b00000010,0b00000010,0b00000010,0b11111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 5
                          {0b01111100,0b10000000,0b10000000,0b10000000,0b11111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 6

                          {0b11111110,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b00100000,0b00100000,0b00100000,0b00100000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 7
                          {0b01111100,0b10000010,0b10000010,0b10000010,0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 8
                          {0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111110,0b00000010,0b00000010,0b00000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 9
                          {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, //чёрный
                          {0b00000000,0b00000000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, //две точки
                          {0b00000000,0b00000000,0b00000000,0b00000000,0b11111110,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},//это (-)->12
                          {0b00000000,0b00010000,0b00010000,0b00010000,0b11111110,0b00010000,0b00010000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, //это(+)->13

                      
                          {0b00000000,0b10000010,0b01000100,0b00101000,0b00010000,0b00101000,0b01000100,0b10000010,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},//  x->14
                          {0b00000000,0b10000010,0b01000100,0b00101000,0b00010000,0b00010000,0b00010000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},//  y->15
                     
                       
  } ; // конец массива

  byte data1[9]={14,12,1,2,3,4,5,6,7};         // отображаемые данные

void setup() {
//noInterrupts();
      pinMode (3, OUTPUT);             //OC2B-->Pin3 строчная синхронизация
      pinMode (10, OUTPUT);            //OC1B-->Pin10 кадровая синхронизация (вывод pin10(PB2)настроен на выход-не участвует в аппаратном  SPI) 
      pinMode(11, OUTPUT);             //видео

  //-------------------Настройка SPI------------------------------------------ 
                                      
      SPCR=0b01010100;                //включен ,старшим битом вперёд,ведущий, режим1(по последнему фронту SCK
                                      //  фиксация посл. бита на MOSI- поэтому последний бит должен=0)
      SPSR &=~(1<<0);                 // тактовая 16мгц/4
      
    //----------------- выключение таймера 0 ---------------------------------------
 
      TIMSK0 = 0;         
      OCR0A = 0;   
      OCR0B = 0;

//-------------------- Таймер 1 для кадровой синхронизации ------------------

     TCCR1A = 0b00110011;         // включен выход OC1B(Pin10),режим  ШИМ (OCR1A)
     TCCR1B = 0b00011101;         // 16мгц/1024-предделитель
     OCR1A = 259;                 //регистр сравнения A-выполняет роль TOP -период кадровой примерно=16.6мс
     OCR1B = 0;                   //регистр сравнения B-по совпадению вкл. OC1B(=1),после TCNT1=0 выкл. OC1B(=0)
                                  // OCR1B = 0, но на сравнение уходит 1 такт-получается 64 мкс ширина кадрового синхроимпульса
     TIMSK1 = bit (TOIE1);        // разрешает прерывание по переполнению счётного регистра ( TOP=OCR1A=259)
     TIFR1 = bit (TOV1);          // при записи 1 флаг сбрасывается(там и так 0)
 
//----------------------- Таймер 2 для строчной синхронизации ------------------------

     TCCR2A = 0b00110011;          // включен выход OC2B(Pin3),режим  ШИМ (OCR2A)
     TCCR2B = 0b00001010;          // предделитель 16мгц/8
     OCR2A = 63;                   //регистр сравнения A-период строчной прим.=32мкс
     OCR2B = 7;                    //регистр сравнения B-синхроимпульс прим.=4мкс
     TIMSK2 = bit (TOIE2);          // разр. прер. по переполнению счётного регистра(TOP=OCR2A=63)
     TIFR2 = bit (TOV2);            //  там и так 0

 set_sleep_mode (SLEEP_MODE_IDLE);      // такой режим сна будет использоваться
 // interrupts();
}  //***********конец void setup()************

void loop() {  
    sleep_mode ();             //Спим. Программа останавливается(Таймеры работают)       
    stroka ();                 // по прерыванию Т2 выход из спящего сразу на эту подпрограмму(  
}  // конец void loop()


ISR (TIMER1_OVF_vect)//----------------обработчик  прерывания от таймера1-------------------------
 {  
    l=0;               //счётчик строк гориз. развёртки
    t=0;               //счётчик пикселей(прямоугольников) в символе по вертикали
    g=0;               // счётчик строк горизонтальной развёртки в пикселе
 

//************блок подготовки  информации для отображения(в начале каждого кадра)  
//           расчёт и заполнение массива data1 (или внешними данными) 

    delayMicroseconds(3000);    //--------иммитация блока подготовки выводимой инф.-
                                 // чем длительнее прогр. тем уже зона отображ. после неё
                               // вертикальная синхронизация может нарушатся из-за разного времени выполнения
 do{}                          //обработчика  таймера1-сделаем его фиксированным  привязав к таймеру1(к кол-ву тактов)
 while (TCNT1L<k);            // такт Т1 примерно 64мкс,64хk(50)=3200мкс-это заведомо больше delayMicroseconds(3000) 
 
   TIFR2 |=(1<<TOV2);            // сбросим флаг пропущенных прерываний от Т2 - может
                                 //нарушится строчная синхронизация,если нет режима sleep_mode   
          
}  //******конец обработчика таймера1*******


EMPTY_INTERRUPT(TIMER2_OVF_vect);       // обработчик без действий-только вывести из сна
/* ISR (TIMER2_OVF_vect)  //---------------обработчик прерывания от таймера2 ---------------------
  //{stroka (); }                      // если stroka () здесь,а не в void loop() (не используется sleep_mode)->
                                       // то не чёткие вертикальные границы символов
 */ 
//-----------------------------подпрограмма обработки строки-------------------------------
void stroka ()
 {
  delayMicroseconds(5);                // для выравнивания по горизонтали
      l=l+1;                          // счёт начинается после окончания обработчика ISR (TIMER1_OVF_vect))
 if (l<=m)return ;                     // смещение отображения по вертикали(зона отображения от m до 180+m строк)
 if(l>180+m) return ;                 // ограничение отображения снизу (матрица 8х15,12 строк в пикселе-12*15=180)  
 
                    
//-------------------отображение -------------------------------
  
     for(byte x=0;x<9;x++){
     SPDR=Zngenerator[data1[x]][t];       
     delayMicroseconds(2);              // время,чтобы вытащить байт из массива плюс задержки позволяют
          asm("nop");                   //  дождаться полного вывода предыдущего и 
          asm("nop");                   // развести символы по горизонтали
          asm("nop");
          asm("nop");
}
     control (11);                     //передаём в функцию размер пикселя(кирпичика)это будет 12 строк гориз. развёртки
                                       //если несколько символьных строк разного размера-функция одна,параметр меняется                                  
 }//конец void stroka ()-возвращаемся в void loop(), а там спим
 
//---------------конец вывода изобр. строки ,проверки условий на следующую строку---------------------
void control (byte y)
{
   g=g+1;              // счётчик строк горизонтальной развёртки в пикселе
if(g>y){              //размер пикселя по вертикали  в  строках гориз. развёртки
   g=0;               // пиксель нарисовали
   t=t+1;             // на следующий пиксель
}
 if(t>14){           // всю строку символов вывели(все пиксели отработали)?
    t=0;                   
}
}
[/code]

 

 
три строки символов:
 
 
[code]
//arduino-1.8.7-windows
// плата Arduino Nano v 3.0 ATmega328P 16 мгц

#include <avr/sleep.h>          //работа со спящими режимами

   byte k=0;                                              
  byte o=0;          //для 0.5 секунд
  int f=0;           // минуты
 int c=0;           // счётчик кадров в минуту для коррекции времени
  byte q=0;          // используется для мигания (:)
  byte g=0;          // счётчик строк горизонтальной развёртки в пикселе
  byte t=0;          // счётчик пикселей в  символе по вертикали(см. Zngenerator[16][15]) 
 int l=0;           //счётчик строк горизонтальной развёртки

 byte m=50;         // m корректируем смещение изображения по вертикали
volatile int w;          // счётчик символьных строк         
  //--------------------------------массив знакогенератора 0...9 и т.д. --------------------------------                  
   //                  полная матрица 8х15,знаки 7х10, с 11 по 15 пустые байты для промежутка между символами по вертикали                          
   //                  в двоичном виде нагляднее  написать шрифт,нулевой бит всегда=0(т.к. последний выводимый остаётся висеть)
   
const byte Zngenerator[16][15]={{0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // это 0
                          {0b00001000,0b00011000,0b00101000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 1
                          {0b11111110,0b10000010,0b10000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000,0b10000000,0b11111110,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 2
                          {0b11111100,0b00000010,0b00000010,0b00000010,0b01111100,0b00000010,0b00000010,0b00000010,0b00000010,0b11111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 3
                          {0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b11111110,0b00000010,0b00000010,0b00000010,0b00000010,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 4
                          {0b11111100,0b10000000,0b10000000,0b10000000,0b11111100,0b00000010,0b00000010,0b00000010,0b00000010,0b11111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 5
                          {0b01111100,0b10000000,0b10000000,0b10000000,0b11111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 6

                          {0b11111110,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b00100000,0b00100000,0b00100000,0b00100000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 7
                          {0b01111100,0b10000010,0b10000010,0b10000010,0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 8
                          {0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111110,0b00000010,0b00000010,0b00000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 9
                          {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, //чёрный
                          {0b00000000,0b00000000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, //две точки
                          {0b00000000,0b00000000,0b00000000,0b00000000,0b11111110,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},//это (-)->12
                          {0b00000000,0b00010000,0b00010000,0b00010000,0b11111110,0b00010000,0b00010000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, //это(+)->13

                      
                          {0b00000000,0b10000010,0b01000100,0b00101000,0b00010000,0b00101000,0b01000100,0b10000010,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},//  x->14
                          {0b00000000,0b10000010,0b01000100,0b00101000,0b00010000,0b00010000,0b00010000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},//  y->15
                     
                       
  } ; // конец массива

 byte data1[8]={14,12,0,1,2,3,4,5};         // отображаемые данные
 byte data2[15]={15,13,6,7,8,9,1,2,3,4,5,6,7,8,9};

 
void setup() {
 
 set_sleep_mode (SLEEP_MODE_IDLE);      // такой режим сна будет использоватся
      pinMode (3, OUTPUT);             //OC2B-->Pin3 строчная синхронизация
      pinMode (10, OUTPUT);            //OC1B-->Pin10 кадровая синхронизация  
      pinMode(11, OUTPUT);             //видео
     digitalWrite(6,LOW);          // в pin6 записываем 0-будем исключать один из цветов


  //-------------------Настройка SPI------------------------------------------ 
                                                     
      SPCR=0b01010100;               //включен ,старшим битом вперёд,ведущий, режим1
    //SPSR &=~(1<<0);               //множитель x2 изменяем дальше в программе 
    //----------------- выключение таймера 0 ---------------------------------------
      TIMSK0 = 0;         
      OCR0A = 0;   
      OCR0B = 0;

//-------------------- Таймер 1 для кадровой синхронизации ------------------

     TCCR1A = 0b00110011;       // включен выход OC1B(Pin10),режим  ШИМ (OCR1A)
     TCCR1B = 0b00011101;      // 16мгц/1024-предделитель
     OCR1A = 259;              //регистр сравнения A-выполняет роль TOP -период кадровой примерно=16.6мс
     OCR1B = 0;                //регистр сравнения B-по совпадению вкл. OC1B(в 1),после TCNT1=0 выкл. OC1B(в 0)
                               // OCR1B = 0, но на сравнение уходит 1 такт-получается 64 мкс ширина кадрового синхроимпульса
     TIMSK1 = bit (TOIE1);       // разрешает прерывание по переполнению счётного регистра ( TOP=OCR1A=259)
     TIFR1 = bit (TOV1);          //  при записи 1 флаг сбрасывается(там и так 0)

//----------------------- Таймер 2 для строчной синхронизации ------------------------

     TCCR2A = 0b00110011;         // включен выход OC2B(Pin3),режим  ШИМ (OCR2A)
     TCCR2B = 0b00001010;         // предделитель 16мгц/8
     OCR2A = 63;                 //регистр сравнения A-период строчной прим.=32мкс
     OCR2B = 7;                  //регистр сравнения B-синхроимпульс прим.=4мкс

    TIMSK2 = bit (TOIE2);       // разр. прер. по переполнению счётного регистра(TOP=OCR2A=63)
    TIFR2 = bit (TOV2);         //  там и так 0
}  //***********конец void setup()************

void loop() {
    sleep_mode ();           //Спим. Программа останавливается(Таймеры работают.)
    stroka ();               // по прерыванию таймера 2 выход из спящего сразу на эту подпрограмму 
}  // конец void loop()        

ISR (TIMER1_OVF_vect)//----------------обработчик  прерывания от таймера1-------------------------
 {
    l = 0;             //счётчик строк гориз. развёртки
    t=0;               //счётчик пикселей(прямоугольников) в символе по вертикали
    g=0;  
    w=0;              // счётчик  символьных строк

//************блок подготовки  информации для отображения(в начале каждого кадра)  
//           расчёт и заполнение массивов data1,data2 (или внешними данными) 

     delayMicroseconds(3000); //--------иммитация блока подготовки выводимой инф.-ЧЕМ ДЛИТЕЛЬНЕЕ ПРОГР. ТЕМ УЖЕ ЗОНА ОТОБРАЖ. после неё
     
     o=o+1;
if(o==30){                   //  переменная (o) для мигания с секундным периодом(0.5сек+0.5сек)                                 
     q=q^0b00000001;         // q для чередования кода 10 и 11(смотри строки 10 и 11 массива знакогенератора)
     o=0;    
}
   c=c+1;
if(c==3587){              // для коррекции ошибки(кадровая не ровно 60гц)
   c=0;
   f=f+1;                 // минуты
if(f==10)f=0;
} 
do{                       // вертикальная синхронизация будет нарушатся из-за разного времени выполнения 
k=TCNT1L;                 //обработчика  таймера1-сделаем его фиксированным  привязав к таймеру1
}while (k<50);           // такт Т1 примерно 64мкс. 64х50=3200мкс-это заведомо больше delayMicroseconds(3000)

   TIFR2 |=(1<<TOV2);            // сбросим флаг пропущенных прерываний от Т2 
                                 //нарушится строчная синхронизация,если нет режима sleep_mode 
  
}  //******конец обработчика таймера1*******

  ISR (TIMER2_OVF_vect)  //---------------обработчик прерывания от таймера2 ---------------------
           { }   //  пустой обработчик чтобы только выйти из сна}
  

//-----------------------------подпрограмма обработки строки-------------------------------
void stroka ()
 {
  delayMicroseconds(4);             // для выравнивания по горизонтали
      l=l+1;                         // счёт начинается после окончания обработчика ISR (TIMER1_OVF_vect))
 if (l<m)return ;                    // смещение отображения по вертикали(зона от m до 360+m строк)
 if(l>360+m)return ;                 // ограничение отображения снизу 
                            
//-------------------отображение--------------------------------

switch (w) {
case 0:                                   // первая симв. строка с тактом 16мгц/4
     SPSR &=~(1<<0);                     // меняем тактовую частоту SPI- убираем(x2)
     for(byte x=0;x<8;x++){
     SPDR=Zngenerator[data1[x]][t];       
     delayMicroseconds(2);               // время,чтобы вытащить байт из массива плюс задержки позволяют
          asm("nop");                    //  дождаться полного вывода предыдущего и развести символы по горизонтали
          asm("nop");
          asm("nop");
          asm("nop");
}
     control (11);                       // размер пикселя(кирпичика) 12 строк гориз. развёртки
break;

case 1:                                  // вторая симв. строка с тактом 16мгц/8
   SPSR|=(1<<0);                          // меняем тактовую частоту SPI(x2)

     for(byte x=0;x<15;x++){
     SPDR=Zngenerator[data2[x]][t];
     delayMicroseconds(1);                // выводится быстрее-уменьшить задержку
}
     control (5);                         //выводится быстрее-символы уже-надо и по высоте уменьшить
break;

case 2:                                   // третья симв. строка с тактом 16мгц/8
                                          // вывод не из массива
delayMicroseconds(2); 
     SPSR|=(1<<0);                        // меняем тактовую частоту SPI(x2)
            
SPDR=Zngenerator[1][t];                  //  запись в регистр данных SPI и аппаратный вывод байта
                                          // число 1
delayMicroseconds(3);                    // задержка нужна чтобы дождаться полного вывода предыдущего
                                         // иначе потеряется
                                // здесь не надо вытаскивать из массива-задержки уже другие
 SPDR=0b11111110;              // засвечивается прямоугольник          
  
 delayMicroseconds(2);
      asm("nop");
     DDRD |=(1<<6);               //pin6 перекл. на выход(а там 0 установили заранее) 
          
SPDR=Zngenerator[3][t];             // вывод числа 3 с изменённым цветом
delayMicroseconds(2);
     asm("nop");
     DDRD &=~(1<<6);              //pin6 перекл. на вход - восстанавливаем цвета 
     
SPDR=Zngenerator[10+q][t];        // чередуется 10(пусто) и 11(:)-мигает двуеточие
delayMicroseconds(2);
    asm("nop");
SPDR=Zngenerator[5][t];
delayMicroseconds(2);
    asm("nop");
SPDR=Zngenerator[f][t];           //вывод минут-счётчик в кадровом обработчике
 
     control (5);                 //выводится быстрее-символы уже-надо и по высоте уменьшить
break;

default:                            // если больше 3 строк символов-в начало 
    w=0;  
}

 }//конец void stroka ()-возвращаемся в void loop(), а там спим
 
//---------------конец вывода изобр. строки ,проверки условий на следующую строку---------------------
void control (byte y)
{
   g=g+1;            // счётчик строк горизонтальной развёртки в пикселе
if(g>y){             //размер пикселя по вертикали (переменный) в  строках гориз. развёртки
   g=0;               // пиксель нарисовали
   t=t+1;             // на следующий пиксель
}
 if(t>14){           // всю строку символов вывели(все пиксели отработали)?
    t=0;
    w++;               // на следующую строку символов                   
}
}
  
[/code]

 

часы(от кадровой синхронизации):
 
 
 
[code]
 // arduino-1.8.7-windows
 // плата Arduino Nano v 3.0

 // часы  
  
  #include <SPI.h>

#include <avr/sleep.h>          //работа со спящими режимами


//  pin11-->Видеосигнал через выход SPI
//  pin3-->горизонт. синхроимпульс
//  pin10-->кадровый синхроимпульс                                                 

byte k=0;
byte o=0;       //счётный имп. секунд
int c=0;       // счётный имп. минут
byte f=0;      //минуты
byte h=0;     //дес. минут
byte n=0;     // часы
byte z=0;     //дес. часов

volatile byte q=0;
volatile byte g=0;          // счётчик строк горизонтальной развёртки в пикселе
volatile byte t=0;         // счётчик пикселей в  символе по вертикали
volatile int l=0;         //счётчик строк горизонтальной развёртки
const int m=200;         //сдвиг изображения по вертикали
                   
  //--------------------------------массив знакогенератора 0...9,: --------------------------------                  
   //                  полная матрица 8х15,знаки 7х10, с 11 по 15 резервные байты- можно убрать скорректировав парамеры массива и if(l>=m+210), if(t>14)                          
   //                  в двоичном виде удобнее(нагляднее)вручную написать шрифт,нулевой бит всегда=0(т.к. последний выводимый остаётся висеть)
   
const byte Zngenerator[12][15]={{0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // это 0
                          {0b00001000,0b00011000,0b00101000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00001000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 1
                          {0b11111110,0b10000010,0b10000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000,0b10000000,0b11111110,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 2
                          {0b11111100,0b00000010,0b00000010,0b00000010,0b01111100,0b00000010,0b00000010,0b00000010,0b00000010,0b11111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 3
                          {0b10000010,0b10000010,0b10000010,0b10000010,0b10000010,0b11111110,0b00000010,0b00000010,0b00000010,0b00000010,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 4
                          {0b11111100,0b10000000,0b10000000,0b10000000,0b11111100,0b00000010,0b00000010,0b00000010,0b00000010,0b11111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 5
                          {0b01111100,0b10000000,0b10000000,0b10000000,0b11111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 6

                          {0b11111110,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b00100000,0b00100000,0b00100000,0b00100000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 7
                          {0b01111100,0b10000010,0b10000010,0b10000010,0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 8
                          {0b01111100,0b10000010,0b10000010,0b10000010,0b10000010,0b01111110,0b00000010,0b00000010,0b00000010,0b01111100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, // 9
                          {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, //чёрный
                          {0b00000000,0b00000000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00010000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000}, //две точки

                       
  } ; // конец массива
  
void setup() {

 
 set_sleep_mode (SLEEP_MODE_IDLE);   // такой режим сна будет использоватся
 
 //pinMode(8,OUTPUT);  
 //digitalWrite(8, HIGH);    //pin8  на выход,если есть SPI 
 
 pinMode(11, OUTPUT);
 pinMode(14,INPUT_PULLUP); // pin14-pin17(pinA0-pinA3) для кнопок коррекции
 pinMode(15,INPUT_PULLUP); 
 pinMode(16,INPUT_PULLUP); 
 pinMode(17,INPUT_PULLUP);
  //-------------------Настройка SPI------------------------------------------ 
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);                //старшим битом вперёд
  SPI.setClockDivider(SPI_CLOCK_DIV8);      // делитель на 8
  SPI.setDataMode(SPI_MODE1);

    //----------------- выключение таймера0---------------------------------------
  TIMSK0 = 0; 
  OCR0A = 0;   
  OCR0B = 0;

//-------------------- Таймер 1 для кадровой синхронизации ------------------
 pinMode (10, OUTPUT);        //OC1B-->Pin10
  TCCR1A = 0b00110011;        // рабочий выход OC1B(Pin10),режим  ШИМ (OCR1A)
  TCCR1B = 0b00011101;       //clk/1024-такт=64мкс
  OCR1A = 259;               //регистр сравнения A-это будет макс. значением счётного регистра TCNT1(вместо 65535)-период кадровой прим.=16.6мс
  OCR1B = 0;                 //регистр сравнения B-по совпадению OC1B(Pin10)= 1,после  TCNT1=0 OC1B=0 так форм. синхроимпульс прим.=64мкс
                             // OCR1B = 0, а на сравнение 1 такт-получается 64 мкс ширина кадрового синхроимпульса
  //TIFR1 = bit (TOV1);
  TIMSK1 = bit (TOIE1);      // разрешает прерывание по переполнению счётного регистра(259)
 

//----------------------- Таймер 2 для строчной синхронизации ------------------------
  pinMode (3, OUTPUT);        //OC2B-->Pin3
  TCCR2A = 0b00110011;
  TCCR2B = 0b00001010;        // clk/8=0.5мкс
  OCR2A = 63;                 //регистр сравнения A-период строчной прим.=32мкс
  OCR2B = 7;                  //регистр сравнения B-синхроимпульс прим.=4мкс
  //TIFR2 = bit (TOV2);
  TIMSK2 = bit (TOIE2);      // разр. прер. по переполнению счётного регистра(63)
  
}  //***********конец void setup()************



void loop() {
   sleep_mode ();        //Спим (Прерывания продолжают работать.) Программа останавливается
   stroka ();            // по прерыванию таймера 2 вых. из спящего сразу на эту подпрограмму 
}  // конец void loop()




ISR (TIMER1_OVF_vect)//----------------обработчик  прерывания от таймера1-------------------------
 {

 l = 0;           //счётчик строк
 t=0;             //счётчик пикселей в символе по вертикали
 g=0;


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<расчёт переменных для отображения часов >>>>>>>>>>>>>>>>>>>>>>>>>>>>>

// дес. часов-z, часы-n,дес. минут-h,минуты-f
// используя 60гц расчитывать мин., часы 

o=o+1;
if(o==30){                //  переменная (o) для мигания с секундным периодом(0.5сек+0.5сек)                                 
q=~q&0b00000001;          //q для чередования кода 10 и 11(смотри строки 10 и 11 массива знакогенератора)
//q=q^0b00000001;
o=0;
// -------установка часов от кнопок-----------------------

if (digitalRead(14) == LOW) {    //установка минут-pin A0
f=f+1;
if(f==10){
f=0;
}
}

if (digitalRead(15) == LOW) {        //установка дес. минут-pin A1
h=h+1;
if(h==6){
h=0;
}
}
 
if (digitalRead(16) == LOW) {     //установка часов-pin A2
n=n+1;
if(n==4&&z==2){        //если дес.часов=2 часы=4 то часы=0
n=0;
}
else{
if(n==10){    
 n=0;
}
}
}

if (digitalRead(17) == LOW) {        //установка дес. часов-pin A3
z=z+1;
if(n>=4&&z==2){        //если дес.часов=2 часы>4 то часы=3
n=3;
}

if(z==3){
z=0;
}
}
}
// --------------------непосредственно обсчёт часов--------------------------------
c=c+1;
if(c==3587){              // минутный счёт >>>>>>>>>>>>> для коррекции ошибки меняем значение (c)
                        //   сейчас  оно уже скорректировано и  не равно 3600(частота кадров х 60 сек)
 c=0; 
 f=f+1;
if(f==10){
 f=0;
 h=h+1;
}
if(h==6){
 h=0;
 n=n+1;
}
if(n==4&&z==2){        //если дес.часов=2 часы=4 то часы=0
n=0;
z=0;  
}
else{
if(n==10){    
 n=0;
 z=z+1;               //дальше дес. часов+1 ,если ==2
}           
} 
}  //------- конец обсчёта переменных часов--------------

do{                             // вертикальная синхронизация будет нарушатся из-за разного времени выполнения 
k=TCNT1L;                      //обработчика  таймера1-сделаем его фиксированным  привязав к таймеру1(к кол-ву тактов)
}while (k<5);                  // менять k до синхронизации или заведомо больше выпол. программы(такт Т1 прим.=64мкс)
                              // здесь в обработчике только обсчёт часов
   TIFR2 |=(1<<TOV2);         // сбросим флаг прерывания от Т2 иначе начнёт сразу обрабатываться(флаг уже установлен )
                              //нарушится строчная синхронизация,если нет режима sleep_mode  
}  //******конец обработчика таймера1*******

  ISR (TIMER2_OVF_vect)  //****************обработчик прерывания от таймера2 **************
{ }  //  пустой обработчик чтобы только выйти из сна




//-----------------------------подпрограмма обработки строки-------------------------------
void stroka ()
 {
  delayMicroseconds(3);         // для выравнивания по горизонтали

  l=l+1;                      // счётчик строк гориз. разв.
  if (l<=m)return ;          // запрет отображения сверху
 if(l>=m+240)return ;         //от l=m до l=m+240 отображается полезная информация   
                            // 16-размер пикселя в строках,8х15-полная матрица,7х10-её полезная часть
                            // 16*15=240-под всю матрицу
                            
//-------------------вывод на индикацию времени--------------------------------
  
SPDR=Zngenerator[z][t];    // запись в регистр SPI байта из массива знакогенератора и 
                           //его последовательный  вывод на монитор
                           //здесь  номер строки знакогенератора равен числу(z) дес. часов 
 delayMicroseconds(5);     //ждём конца вывода + ещё для отдаления от предыдущего

             
SPDR=Zngenerator[n][t];
 delayMicroseconds(5);
   
SPDR=Zngenerator[10+q][t];             //чередование кодов 10(пусто) и 11(:)
 delayMicroseconds(5);
 
SPDR=Zngenerator[h][t];
 delayMicroseconds(5);
 
  
SPDR=Zngenerator[f][t];

 
//---------------конец вывода изобр. строки ,проверки условий на следующую строку---------------------

g=g+1;              // счётчик строк горизонтальной развёртки в пикселе
if(g>15){          //размер пикселя по вертикали-16(с 0 по 15) строк гориз. развёртки
  g=0;          
  t=t+1;           // на след.  строку символов
}
 if(t>14){         // всю строку символов вывели?
    t=0;       
}
  
}     //---------- конец подпрограммы stroka-возвращаемся в void loop(), а там спим
[/code]
      Менял частоты развёрток синхронизации(таймер 2 8-ми битный-точно не подобрать ).
 Поменять T1 и T2 местами не получится-из сна выводит только T2.
 Эту настройку мониторы захватывали стабильно:
   OCR1A = 207;  75гц
   OCR1B = 0;  
   OCR2A = 51;  37500гц
   OCR2B = 7; 
 Символы увеличатся-чтобы строка уместилась в развёртку уменьшить количество выводимых. 
    Время выполнения stroka() должно быть меньше времени строчной развёртки,
чтобы не пропустить следующий синхроимпульс
 
    Остался невыясненным нюанс. Если убрать сдвиг по вертикали-m=0(после 
кадрового обработчика нет пустых строк),первая строка на отображении со смещением.
Если запретить прерывание от T2(TIMSK2=0), символы не отображаются,но
 верхняя смещённая строка остаётся(одна)-что поднимает из сна на одну строчку?
(без sleep_mode такого нет)
lilik
Offline
Зарегистрирован: 19.10.2017

:)

Интересная тема, сейчас много таких мониторов скапливается без дела. Был бы полезен скетч-пример с функциями ( или библиотека) для вывода данных по аналогии экранчика  SSD1306 128*64 пикселя. Примерно такой:

Функции: вставка картинки (из "прогмем"), рисование точки, отрезка, окружности... 

Кимович
Offline
Зарегистрирован: 08.05.2022

lilik пишет:

:)

Интересная тема, сейчас много таких мониторов скапливается без дела. Был бы полезен скетч-пример с функциями ( или библиотека) для вывода данных по аналогии экранчика  SSD1306 128*64 пикселя. Примерно 

 

Встречались такие темы,но меня интересовал простой вывод символов на большой экран,
и как можно проще и  быстрее собрать типа адаптера между УЦИ и монитором.
С ATmega328 особо не разбежишься.Максимум как у https://www.gammon.com.au/forum/?id=11608
и моё мнение, пытаться что то выжать-заниматься мазохизмом.
На это занятие подвигли мысли о полезности устройства-ошибся в мыслях.
 
Переключилась голова на другую тему-пристегнуть ардуино нано к тиристорным
преобразователям:однофазным,трёхфазным.
lilik
Offline
Зарегистрирован: 19.10.2017

Кимович пишет:

С ATmega328 особо не разбежишься.

Это да, нашлась "библиотека по мотивам"... 120*60 пикселей, похоже предел без использования дополнительной платы Ардуино. Странно, что китайцы ещё не сделали "видеокарту под Ардуино".

https://github.com/smaffer/vgax

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

На всякий случай напомню: http://arduino.ru/forum/proekty/s-stm32f103-na-televizor-polnyi-tv-signal

BluePill 512х240 пикселей.

lilik
Offline
Зарегистрирован: 19.10.2017

Да, вопрос функционального назначения важен. Экранчики таких размеров - многоглазы, например, демонстрационный вольтметр на уроках...

...отрезал болгаркой от материнки и собрал по схеме...

...библиотека полна сюрпризов...

////// ШКАЛА СТРЕЛОЧНАЯ - ВОЛЬТМЕТР
#include <VGAX.h>
//#include <VGAXUtils.h>
#define FNT_NANOFONT_HEIGHT 6
#define FNT_NANOFONT_SYMBOLS_COUNT 95
VGAX vga;
int str = 59; //длина стрелки в пикселях
float a = 0.00; // переменная для угла поворота стрелки
float aa = 0.00; // переменная для угла поворота стрелки (предыдущее значение)
const unsigned char fnt_nanofont_data[FNT_NANOFONT_SYMBOLS_COUNT][1 + FNT_NANOFONT_HEIGHT] PROGMEM = {
  { 1, 128, 128, 128, 0, 128, 0, }, //glyph '!' code=0
  { 3, 160, 160, 0, 0, 0, 0, }, //glyph '"' code=1
  { 5, 80, 248, 80, 248, 80, 0, },  //glyph '#' code=2
  { 5, 120, 160, 112, 40, 240, 0, },  //glyph '$' code=3
  { 5, 136, 16, 32, 64, 136, 0, },  //glyph '%' code=4
  { 5, 96, 144, 104, 144, 104, 0, },  //glyph '&' code=5
  { 2, 128, 64, 0, 0, 0, 0, },  //glyph ''' code=6
  { 2, 64, 128, 128, 128, 64, 0, }, //glyph '(' code=7
  { 2, 128, 64, 64, 64, 128, 0, },  //glyph ')' code=8
  { 3, 0, 160, 64, 160, 0, 0, },  //glyph '*' code=9
  { 3, 0, 64, 224, 64, 0, 0, }, //glyph '+' code=10
  { 2, 0, 0, 0, 0, 128, 64, },  //glyph ',' code=11
  { 3, 0, 0, 224, 0, 0, 0, }, //glyph '-' code=12
  { 1, 0, 0, 0, 0, 128, 0, }, //glyph '.' code=13
  { 5, 8, 16, 32, 64, 128, 0, },  //glyph '/' code=14
  { 4, 96, 144, 144, 144, 96, 0, }, //glyph '0' code=15
  { 3, 64, 192, 64, 64, 224, 0, },  //glyph '1' code=16
  { 4, 224, 16, 96, 128, 240, 0, }, //glyph '2' code=17
  { 4, 224, 16, 96, 16, 224, 0, },  //glyph '3' code=18
  { 4, 144, 144, 240, 16, 16, 0, }, //glyph '4' code=19
  { 4, 240, 128, 224, 16, 224, 0, },  //glyph '5' code=20
  { 4, 96, 128, 224, 144, 96, 0, }, //glyph '6' code=21
  { 4, 240, 16, 32, 64, 64, 0, }, //glyph '7' code=22
  { 4, 96, 144, 96, 144, 96, 0, },  //glyph '8' code=23
  { 4, 96, 144, 112, 16, 96, 0, },  //glyph '9' code=24
  { 1, 0, 128, 0, 128, 0, 0, }, //glyph ':' code=25
  { 2, 0, 128, 0, 0, 128, 64, },  //glyph ';' code=26
  { 3, 32, 64, 128, 64, 32, 0, }, //glyph '<' code=27
  { 3, 0, 224, 0, 224, 0, 0, }, //glyph '=' code=28
  { 3, 128, 64, 32, 64, 128, 0, },  //glyph '>' code=29
  { 4, 224, 16, 96, 0, 64, 0, },  //glyph '?' code=30
  { 4, 96, 144, 176, 128, 112, 0, },  //glyph '@' code=31
  { 4, 96, 144, 240, 144, 144, 0, },  //glyph 'A' code=32
  { 4, 224, 144, 224, 144, 224, 0, }, //glyph 'B' code=33
  { 4, 112, 128, 128, 128, 112, 0, }, //glyph 'C' code=34
  { 4, 224, 144, 144, 144, 224, 0, }, //glyph 'D' code=35
  { 4, 240, 128, 224, 128, 240, 0, }, //glyph 'E' code=36
  { 4, 240, 128, 224, 128, 128, 0, }, //glyph 'F' code=37
  { 4, 112, 128, 176, 144, 112, 0, }, //glyph 'G' code=38
  { 4, 144, 144, 240, 144, 144, 0, }, //glyph 'H' code=39
  { 3, 224, 64, 64, 64, 224, 0, },  //glyph 'I' code=40
  { 4, 240, 16, 16, 144, 96, 0, },  //glyph 'J' code=41
  { 4, 144, 160, 192, 160, 144, 0, }, //glyph 'K' code=42
  { 4, 128, 128, 128, 128, 240, 0, }, //glyph 'L' code=43
  { 5, 136, 216, 168, 136, 136, 0, }, //glyph 'M' code=44
  { 4, 144, 208, 176, 144, 144, 0, }, //glyph 'N' code=45
  { 4, 96, 144, 144, 144, 96, 0, }, //glyph 'O' code=46
  { 4, 224, 144, 224, 128, 128, 0, }, //glyph 'P' code=47
  { 4, 96, 144, 144, 144, 96, 16, },  //glyph 'Q' code=48
  { 4, 224, 144, 224, 160, 144, 0, }, //glyph 'R' code=49
  { 4, 112, 128, 96, 16, 224, 0, }, //glyph 'S' code=50
  { 3, 224, 64, 64, 64, 64, 0, }, //glyph 'T' code=51
  { 4, 144, 144, 144, 144, 96, 0, },  //glyph 'U' code=52
  { 3, 160, 160, 160, 160, 64, 0, },  //glyph 'V' code=53
  { 5, 136, 168, 168, 168, 80, 0, },  //glyph 'W' code=54
  { 4, 144, 144, 96, 144, 144, 0, },  //glyph 'X' code=55
  { 3, 160, 160, 64, 64, 64, 0, },  //glyph 'Y' code=56
  { 4, 240, 16, 96, 128, 240, 0, }, //glyph 'Z' code=57
  { 2, 192, 128, 128, 128, 192, 0, }, //glyph '[' code=58
  { 5, 128, 64, 32, 16, 8, 0, },  //glyph '\' code=59
  { 2, 192, 64, 64, 64, 192, 0, },  //glyph ']' code=60
  { 5, 32, 80, 136, 0, 0, 0, }, //glyph '^' code=61
  { 4, 0, 0, 0, 0, 240, 0, }, //glyph '_' code=62
  { 2, 128, 64, 0, 0, 0, 0, },  //glyph '`' code=63
  { 3, 0, 224, 32, 224, 224, 0, },  //glyph 'a' code=64
  { 3, 128, 224, 160, 160, 224, 0, }, //glyph 'b' code=65
  { 3, 0, 224, 128, 128, 224, 0, }, //glyph 'c' code=66
  { 3, 32, 224, 160, 160, 224, 0, },  //glyph 'd' code=67
  { 3, 0, 224, 224, 128, 224, 0, }, //glyph 'e' code=68
  { 2, 64, 128, 192, 128, 128, 0, },  //glyph 'f' code=69
  { 3, 0, 224, 160, 224, 32, 224, },  //glyph 'g' code=70
  { 3, 128, 224, 160, 160, 160, 0, }, //glyph 'h' code=71
  { 1, 128, 0, 128, 128, 128, 0, }, //glyph 'i' code=72
  { 2, 0, 192, 64, 64, 64, 128, },  //glyph 'j' code=73
  { 3, 128, 160, 192, 160, 160, 0, }, //glyph 'k' code=74
  { 1, 128, 128, 128, 128, 128, 0, }, //glyph 'l' code=75
  { 5, 0, 248, 168, 168, 168, 0, }, //glyph 'm' code=76
  { 3, 0, 224, 160, 160, 160, 0, }, //glyph 'n' code=77
  { 3, 0, 224, 160, 160, 224, 0, }, //glyph 'o' code=78
  { 3, 0, 224, 160, 160, 224, 128, }, //glyph 'p' code=79
  { 3, 0, 224, 160, 160, 224, 32, },  //glyph 'q' code=80
  { 3, 0, 224, 128, 128, 128, 0, }, //glyph 'r' code=81
  { 2, 0, 192, 128, 64, 192, 0, },  //glyph 's' code=82
  { 3, 64, 224, 64, 64, 64, 0, }, //glyph 't' code=83
  { 3, 0, 160, 160, 160, 224, 0, }, //glyph 'u' code=84
  { 3, 0, 160, 160, 160, 64, 0, },  //glyph 'v' code=85
  { 5, 0, 168, 168, 168, 80, 0, },  //glyph 'w' code=86
  { 3, 0, 160, 64, 160, 160, 0, },  //glyph 'x' code=87
  { 3, 0, 160, 160, 224, 32, 224, },  //glyph 'y' code=88
  { 2, 0, 192, 64, 128, 192, 0, },  //glyph 'z' code=89
  { 3, 96, 64, 192, 64, 96, 0, }, //glyph '{' code=90
  { 1, 128, 128, 128, 128, 128, 0, }, //glyph '|' code=91
  { 3, 192, 64, 96, 64, 192, 0, },  //glyph '}' code=92
  { 3, 96, 192, 0, 0, 0, 0, },  //glyph '~' code=93
  { 4, 48, 64, 224, 64, 240, 0, },  //glyph '£' code=94
};
////числа шкалы так рисуем :)
static const char str0[] PROGMEM = "       3";
static const char str1[] PROGMEM = "   2       4";
static const char str2[] PROGMEM = "  1          5";
static const char str3[] PROGMEM = "0              6";
static const char str4[] PROGMEM = "     VOLTMETR";
void setup() {
  vga.begin();
  vga.clear(0);

}
void loop() {
  a = -PI * (1023 - analogRead(A5)) / 1023; //угол поворота стрелки прибора в зависимости от полученных с потенциометра данных
  if (abs(a - aa) > PI / 96) {
    line_(60, 59, 60 + cos(aa)*str, 59 + sin(aa)*str, 0); // стирание старой стрелки
    aa = a;
    for (float i = PI; i < 2 * PI; i = i + PI / 12) {
      line_(60 + cos(i)*str * 0.85,  59 + sin(i)*str * 0.85, 60 + cos(i)*str,  59 + sin(i)*str, 3  ); // риски-метки шкалы
      ////числа шкалы так рисуем :)
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str0, 15, 11, 1);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str1, 15, 20, 1);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str2, 15, 35, 1);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str3, 15, 55, 1);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 2, str4, 15, 45, 3);
    }
    line_(60, 59, 60 + cos(a)*str, 59 + sin(a)*str, 2); // рисование новой стрелки
  }
  vga.delay(20);
}
/////////////////////////////////////////////////////////
/////// базовая функция рисования отрезка по координатам концов заданным цветом
void line_(float x1, float y1, float x2, float y2, int c) {
  int divisions = int(1.1 * 1 * sqrt(pow((y2 - y1), 2) + pow((x2 - x1), 2)));
  for (int i = 0; i <= divisions; i++) {
    int x = int(x1 + i * (x2 - x1) / divisions);
    int y = int(y1 + i * (y2 - y1) / divisions);
    if (x > 0 && x < VGAX_WIDTH && y > 0 && y < VGAX_HEIGHT) {
      vga.putpixel(x, y, c);
    }
  }
}
///////////////////////////////////////////////////////////

 

lilik
Offline
Зарегистрирован: 19.10.2017

Гифка не грузится теперь, хоть и весит 1,74 Мб :(

lilik
Offline
Зарегистрирован: 19.10.2017

Тоже сделал часы на " vga.делее", по другому библиотека не даёт :)

////ШКАЛА-ИНДИКАТОР "ЧАСЫ"
#include <VGAX.h>
#define IMG_VARNAME_WIDTH 28
#define IMG_VARNAME_BWIDTH 7
#define IMG_VARNAME_HEIGHT 48
extern const unsigned char img_zifra_0 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_1 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_2 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_3 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_4 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_5 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_6 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_7 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_8 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];
extern const unsigned char img_zifra_9 [IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH];

VGAX vga;
byte N1 = 8; //часы
byte N2 = 33; //минуты
byte N3 = 0; //секунды
int T = 1030; //пауза 1 секунды примерно (подбор экспериментальный :)
byte n = 0; // счётчик долей Т

void setup() {
  vga.begin();
  vga.clear(0);

  vga.fillrect(7 + 2 * IMG_VARNAME_WIDTH, 28, 4, 4, 2); vga.fillrect(7 + 2 * IMG_VARNAME_WIDTH, 40, 4, 4, 2); //разделительные точки
  tik_tak_();//начальная установка цифр

  digitalWrite(A1, HIGH);// включить подтягивающий резистор N1++
  digitalWrite(A2, HIGH);// включить подтягивающий резистор N2++
  digitalWrite(A3, HIGH);// включить подтягивающий резистор N1--
  digitalWrite(A4, HIGH);// включить подтягивающий резистор N2--
  digitalWrite(A5, HIGH);// включить подтягивающий резистор СБРОС часов в 00:00
}
void loop() {
  ////// настройки показаний кнопками
  if (!digitalRead(A1) && N1 < 23) {
    N1++;
    zifra_(N1 / 10, 5, 12);
    zifra_(N1 % 10, 5 + IMG_VARNAME_WIDTH, 12);
  }
  if (!digitalRead(A3) && N1 != 0) {
    N1--;
    zifra_(N1 / 10, 5, 12);
    zifra_(N1 % 10, 5 + IMG_VARNAME_WIDTH, 12);
  }
  if (!digitalRead(A2) && N2 < 59) {
    N2++;
    zifra_(N2 / 10, 10 + 2 * IMG_VARNAME_WIDTH, 12);
    zifra_(N2 % 10, 10 + 3 * IMG_VARNAME_WIDTH, 12);
  }
  if (!digitalRead(A4) && N2 != 0) {
    N2--;
    zifra_(N2 / 10, 10 + 2 * IMG_VARNAME_WIDTH, 12);
    zifra_(N2 % 10, 10 + 3 * IMG_VARNAME_WIDTH, 12);
  }
  if (!digitalRead(A5)) {
    n = 0;
    N1 = 0;
    N2 = 0;
    zifra_(N1 / 10, 5, 12);
    zifra_(N1 % 10, 5 + IMG_VARNAME_WIDTH, 12);
    zifra_(N2 / 10, 10 + 2 * IMG_VARNAME_WIDTH, 12);
    zifra_(N2 % 10, 10 + 3 * IMG_VARNAME_WIDTH, 12);
  }
  //////
  n++;//
  if (n > 4) {
    n = 0;
    N3++;
    if (N3 > 59) {
      N3 = 0;
      N2++;
      if (N2 > 59) {
        N2 = 0;
        N1++;
        if (N1 > 23) {
          N1 = 0;
        }
      } tik_tak_();
    }
  }
  vga.delay(T / 5);
}
//////////////////////////////////////////////////////
void zifra_(byte n, byte x, byte y) {
  vga.fillrect(x, y, IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT, 0); //стираем предыдущюю цифру
  if (n == 0) {
    vga.blitwmask((byte*)((byte*)img_zifra_0), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y); //выбираем и рисуем новую цифру
  }
  if (n == 1) {
    vga.blitwmask((byte*)((byte*)img_zifra_1), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
  if (n == 2) {
    vga.blitwmask((byte*)((byte*)img_zifra_2), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
  if (n == 3) {
    vga.blitwmask((byte*)((byte*)img_zifra_3), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
  if (n == 4) {
    vga.blitwmask((byte*)((byte*)img_zifra_4), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
  if (n == 5) {
    vga.blitwmask((byte*)((byte*)img_zifra_5), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
  if (n == 6) {
    vga.blitwmask((byte*)((byte*)img_zifra_6), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
  if (n == 7) {
    vga.blitwmask((byte*)((byte*)img_zifra_7), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
  if (n == 8) {
    vga.blitwmask((byte*)((byte*)img_zifra_8), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
  if (n == 9) {
    vga.blitwmask((byte*)((byte*)img_zifra_9), (byte*)((byte*)img_zifra_0), IMG_VARNAME_WIDTH, IMG_VARNAME_HEIGHT , x, y);
  }
}
//////////////////////////////////////////////////////
void tik_tak_() { // установка цифр
  zifra_(N1 / 10, 5, 12); zifra_(N1 % 10, 5 + IMG_VARNAME_WIDTH, 12);
  zifra_(N2 / 10, 10 + 2 * IMG_VARNAME_WIDTH, 12); zifra_(N2 % 10, 10 + 3 * IMG_VARNAME_WIDTH, 12);
}
/////////////////////////////////////////////////////
#include <avr/pgmspace.h>

#define IMG_VARNAME_WIDTH 28
#define IMG_VARNAME_BWIDTH 7
#define IMG_VARNAME_HEIGHT 48
//размер данных=336 байт
const unsigned char img_zifra_0[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
 { 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{0, 0, 3, 255, 252, 0, 0,},
{0, 0, 255, 255, 255, 240, 0,},
{0, 3, 255, 192, 255, 252, 0,},
{0, 12, 3, 192, 63, 0, 0,},
{0, 63, 195, 0, 60, 42, 0,},
{0, 63, 63, 0, 15, 10, 128,},
{0, 48, 15, 0, 15, 34, 128,},
{0, 240, 12, 0, 12, 34, 128,},
{0, 192, 12, 0, 12, 0, 0,},
{3, 255, 252, 0, 15, 197, 80,},
{3, 195, 252, 0, 3, 241, 80,},
{3, 192, 252, 0, 3, 192, 16,},
{4, 0, 252, 0, 3, 200, 20,},
{4, 0, 12, 0, 0, 40, 196,},
{5, 81, 60, 0, 1, 40, 4,},
{4, 21, 48, 0, 1, 10, 4,},
{5, 4, 48, 0, 1, 72, 20,},
{5, 83, 240, 0, 1, 72, 20,},
{ 5, 84, 240, 0, 1, 80, 84, },
{4, 4, 48, 0, 1, 10, 4,},
{0, 48, 240, 0, 1, 74, 0,},
{3, 240, 240, 0, 1, 72, 32,},
{12, 192, 240, 0, 1, 72, 168,},
{12, 243, 192, 0, 1, 8, 8,},
{15, 255, 192, 0, 1, 72, 40,},
{15, 12, 48, 0, 1, 10, 40,},
{12, 34, 48, 0, 1, 2, 40,},
{12, 42, 48, 0, 5, 34, 8,},
{12, 0, 48, 0, 1, 34, 128,},
{15, 200, 240, 0, 1, 40, 48,},
{3, 192, 240, 0, 1, 64, 48,},
{3, 192, 204, 0, 0, 80, 240,},
{3, 255, 252, 0, 5, 79, 240,},
{0, 252, 204, 0, 4, 79, 192,},
{0, 60, 12, 0, 4, 15, 192,},
{0, 51, 252, 0, 5, 15, 0,},
{0, 12, 255, 0, 5, 79, 0,},
{0, 15, 3, 0, 0, 60, 0,},
{0, 3, 243, 255, 243, 240, 0,},
{0, 0, 63, 255, 255, 192, 0,},
{0, 0, 15, 255, 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, 0, 0, 0, 0, 0, 0, },
};
///////////////////////////////////////////////////////////////////////////////////
const unsigned char img_zifra_1[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
{ 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, 15, 0, 0,},
{0, 0, 0, 3, 255, 0, 0,},
{0, 0, 0, 40, 12, 0, 0,},
{0, 0, 0, 33, 64, 0, 0,},
{0, 0, 15, 192, 82, 0, 0, },
{0, 0, 60, 252, 64, 0, 0,},
{0, 0, 252, 255, 4, 0, 0,},
{0, 255, 252, 48, 84, 0, 0,},
{3, 255, 255, 0, 20, 0, 0,},
{0, 255, 3, 10, 20, 0, 0,},
{0, 0, 3, 192, 4, 0, 0,},
{0, 0, 3, 5, 4, 0, 0,},
{0, 0, 3, 21, 68, 0, 0,},
{0, 0, 3, 1, 68, 0, 0,},
{0, 0, 3, 40, 68, 0, 0,},
{0, 0, 3, 40, 68, 0, 0,},
{0, 0, 3, 0, 68, 0, 0,},
{0, 0, 3, 195, 4, 0, 0,},
{0, 0, 3, 255, 4, 0, 0,},
{0, 0, 0, 255, 4, 0, 0,},
{0, 0, 3, 252, 32, 0, 0,},
{0, 0, 3, 192, 168, 0, 0, },
{0, 0, 3, 194, 160, 0, 0,},
{0, 0, 3, 232, 0, 0, 0,},
{0, 0, 3, 16, 4, 0, 0,},
{0, 0, 3, 21, 84, 0, 0,},
{0, 0, 3, 1, 84, 0, 0,},
{0, 0, 3, 0, 84, 0, 0,},
{0, 0, 3, 33, 4, 0, 0,},
{0, 0, 3, 5, 4, 0, 0,},
{0, 0, 3, 5, 66, 0, 0,},
{0, 0, 3, 0, 66, 0, 0,},
{0, 0, 3, 252, 72, 0, 0,},
{0, 0, 3, 255, 8, 0, 0,},
{0, 0, 3, 0, 129, 0, 0,},
{0, 0, 3, 12, 129, 0, 0,},
{0, 0, 0, 63, 49, 0, 0,},
{0, 0, 3, 15, 48, 0, 0,},
{0, 255, 255, 3, 51, 255, 192,},
{0, 63, 255, 195, 255, 255, 192,},
{ 0, 255, 255, 255, 255, 255, 192, },
{ 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, },
};
///////////////////////////////////////////////////////////////////////////////////
const unsigned char img_zifra_2[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{0, 0, 0, 3, 192, 0, 0,},
{0, 0, 63, 255, 255, 0, 0,},
{0, 3, 255, 192, 63, 240, 0,},
{0, 15, 195, 243, 0, 240, 0,},
{0, 48, 63, 240, 64, 60, 0,},
{0, 3, 255, 252, 84, 15, 192,},
{0, 207, 0, 12, 85, 79, 0,},
{3, 252, 0, 0, 65, 76, 192,},
{3, 240, 0, 0, 64, 0, 240,},
{15, 192, 0, 0, 84, 64, 48,},
{15, 0, 0, 0, 21, 85, 48,},
{0, 0, 0, 0, 17, 20, 240,},
{0, 0, 0, 0, 16, 0, 48,},
{0, 0, 0, 0, 21, 3, 240,},
{0, 0, 0, 0, 5, 84, 240,},
{0, 0, 0, 0, 5, 84, 240,},
{0, 0, 0, 0, 21, 64, 192,},
{0, 0, 0, 0, 21, 3, 192,},
{0, 0, 0, 0, 20, 15, 0,},
{0, 0, 0, 0, 83, 207, 0,},
{0, 0, 0, 0, 67, 204, 0,},
{0, 0, 0, 0, 64, 48, 0,},
{0, 0, 0, 1, 65, 48, 0,},
{0, 0, 0, 5, 65, 64, 0,},
{0, 0, 0, 20, 85, 64, 0,},
{0, 0, 0, 0, 20, 0, 0,},
{0, 0, 0, 65, 80, 0, 0,},
{0, 0, 0, 85, 64, 0, 0,},
{0, 0, 5, 85, 0, 0, 0,},
{0, 0, 20, 84, 0, 0, 8,},
{ 0, 0, 17, 80, 0, 0, 40, },
{0, 3, 197, 64, 0, 0, 40,},
{0, 3, 192, 0, 0, 2, 168,},
{ 0, 15, 0, 0, 0, 10, 160, },
{0, 63, 14, 170, 170, 168, 32,},
{0, 252, 240, 40, 40, 8, 32,},
{2, 204, 194, 2, 3, 200, 160,},
{2, 48, 58, 138, 3, 10, 128,},
{10, 48, 0, 170, 32, 42, 128,},
{ 42, 130, 128, 160, 170, 170, 0, },
{ 42, 170, 170, 170, 170, 170, 0, },
{0, 0, 0, 8, 0, 10, 0,},
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },  
};
///////////////////////////////////////////////////
const unsigned char img_zifra_3[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
{ 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, 2, 170, 170, 128, 0,},
{0, 0, 168, 128, 170, 160, 0,},
{0, 2, 168, 32, 0, 40, 0,},
{0, 10, 42, 170, 0, 8, 0,},
{0, 48, 170, 170, 42, 131, 0,},
{0, 12, 192, 2, 160, 51, 0,},
{0, 79, 0, 0, 161, 67, 192,},
{0, 76, 0, 0, 140, 83, 192,},
{3, 60, 0, 0, 133, 83, 192,},
{3, 240, 0, 0, 160, 83, 192,},
{3, 240, 0, 0, 0, 67, 192,},
{0, 0, 0, 0, 21, 15, 0,},
{0, 0, 0, 0, 21, 15, 0,},
{0, 0, 0, 0, 84, 60, 0,},
{0, 0, 0, 0, 64, 240, 0,},
{0, 0, 0, 3, 15, 240, 0,},
{0, 0, 0, 15, 63, 0, 0,},
{ 0, 0, 0, 255, 240, 0, 0, },
{0, 0, 255, 192, 243, 192, 0,},
{0, 0, 255, 0, 207, 240, 0,},
{0, 0, 63, 252, 204, 60, 0,},
{0, 0, 0, 255, 252, 2, 0,},
{0, 0, 0, 3, 48, 82, 128,},
{0, 0, 0, 0, 136, 64, 160,},
{0, 0, 0, 0, 168, 72, 160,},
{0, 0, 0, 0, 34, 10, 160,},
{0, 0, 0, 0, 42, 8, 40,},
{0, 0, 0, 0, 10, 1, 40,},
{0, 0, 0, 0, 8, 241, 40,},
{0, 0, 0, 0, 10, 4, 8,},
{0, 0, 0, 0, 10, 20, 8,},
{0, 0, 0, 0, 8, 5, 80,},
{0, 0, 0, 0, 8, 20, 80,},
{3, 252, 0, 0, 49, 84, 80,},
{15, 15, 0, 0, 48, 0, 64,},
{12, 15, 0, 0, 60, 3, 0,},
{12, 19, 0, 3, 252, 255, 0,},
{12, 3, 0, 3, 48, 240, 0,},
{15, 204, 49, 64, 63, 192, 0,},
{3, 252, 252, 63, 255, 0, 0,},
{0, 15, 255, 255, 0, 0, 0,},
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },  
};
/////////////////////////////////////////////////////
const unsigned char img_zifra_4[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
{ 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, 80, 0,},
{0, 0, 0, 0, 1, 80, 0,},
{0, 0, 0, 0, 1, 16, 0,},
{0, 0, 0, 0, 5, 16, 0,},
{0, 0, 0, 0, 21, 16, 0,},
{0, 0, 0, 0, 192, 16, 0,},
{0, 0, 0, 0, 85, 16, 0,},
{0, 0, 0, 3, 21, 80, 0,},
{0, 0, 0, 3, 1, 0, 0,},
{0, 0, 0, 63, 193, 0, 0, },
{0, 0, 0, 63, 204, 48, 0,},
{0, 0, 0, 192, 48, 240, 0,},
{0, 0, 3, 3, 207, 240, 0,},
{0, 0, 3, 207, 12, 240, 0,},
{0, 0, 15, 252, 32, 48, 0,},
{0, 0, 16, 252, 163, 128, 0,},
{0, 0, 80, 242, 160, 128, 0,},
{0, 0, 83, 192, 168, 160, 0,},
{0, 5, 79, 0, 170, 160, 0,},
{0, 5, 60, 10, 162, 160, 0,},
{0, 20, 48, 2, 128, 160, 0,},
{0, 0, 240, 8, 136, 0, 0,},
{0, 63, 192, 8, 136, 128, 0,},
{3, 255, 0, 10, 170, 160, 0,},
{15, 204, 0, 10, 42, 32, 0,},
{60, 0, 0, 2, 8, 32, 0,},
{48, 63, 252, 242, 136, 162, 160,},
{ 48, 243, 255, 10, 160, 170, 32, },
{48, 252, 3, 192, 35, 40, 32,},
{3, 192, 0, 192, 63, 0, 192,},
{63, 255, 207, 255, 204, 63, 240,},
{63, 255, 255, 243, 204, 255, 240,},
{0, 0, 0, 0, 204, 240, 0,},
{0, 0, 0, 3, 12, 240, 0,},
{0, 0, 0, 15, 63, 240, 0,},
{0, 0, 0, 3, 0, 48, 0,},
{0, 0, 0, 15, 17, 48, 0,},
{0, 0, 0, 15, 1, 0, 0,},
{0, 0, 0, 3, 0, 0, 0,},
{0, 0, 0, 15, 252, 240, 0,},
{0, 0, 0, 15, 255, 240, 0,},
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },  
};
///////////////////////////////////////////////////
const unsigned char img_zifra_5[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
{ 0, 0, 0, 0, 0, 0, 0, },
{0, 0, 0, 0, 0, 0, 192,},
{ 0, 0, 0, 0, 0, 0, 240, },
{0, 0, 0, 0, 0, 3, 48,},
{0, 0, 170, 168, 42, 168, 240,},
{0, 2, 128, 42, 160, 168, 240,},
{0, 2, 20, 2, 128, 35, 240,},
{0, 0, 197, 64, 138, 128, 192,},
{0, 0, 193, 80, 170, 160, 192,},
{0, 3, 192, 16, 10, 3, 192,},
{0, 3, 255, 207, 240, 63, 0,},
{0, 3, 63, 255, 255, 255, 0,},
{0, 3, 0, 0, 0, 0, 0,},
{ 0, 3, 240, 0, 0, 0, 0, },
{ 0, 15, 240, 0, 0, 0, 0, },
{0, 12, 192, 0, 0, 0, 0, },
{0, 12, 192, 0, 0, 0, 0, },
{0, 12, 192, 0, 0, 0, 0, },
{0, 12, 255, 207, 192, 0, 0,},
{0, 12, 240, 255, 192, 0, 0,},
{0, 12, 240, 192, 21, 0, 0,},
{0, 12, 63, 193, 85, 64, 0,},
{0, 12, 15, 5, 64, 80, 0,},
{0, 15, 192, 0, 67, 0, 0,},
{0, 15, 252, 255, 3, 12, 0,},
{0, 15, 255, 243, 63, 252, 0,},
{0, 0, 0, 60, 15, 255, 0,},
{0, 0, 0, 15, 192, 3, 0,},
{0, 0, 0, 0, 193, 3, 192,},
{0, 0, 0, 0, 40, 3, 192,},
{0, 0, 0, 0, 40, 160, 192,},
{0, 0, 0, 0, 42, 168, 192,},
{0, 0, 0, 0, 8, 136, 192,},
{0, 0, 0, 0, 8, 3, 192,},
{0, 0, 0, 0, 8, 83, 192,},
{0, 0, 0, 0, 10, 3, 0,},
{ 0, 0, 0, 0, 40, 15, 0, },
{0, 0, 0, 0, 32, 63, 0,},
{0, 0, 0, 0, 35, 252, 0,},
{0, 0, 0, 0, 79, 240, 0,},
{15, 196, 0, 1, 79, 192, 0,},
{15, 197, 67, 204, 60, 0, 0,},
{15, 240, 51, 243, 252, 0, 0,},
{3, 252, 255, 255, 192, 0, 0,},
{0, 63, 255, 240, 0, 0, 0,},
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },  
};
///////////////////////////////////////////////////
const unsigned char img_zifra_6[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{0, 0, 0, 0, 0, 8, 0,},
{ 0, 0, 0, 0, 2, 170, 0, },
{0, 0, 0, 0, 252, 168, 0,},
{0, 0, 0, 15, 207, 0, 0,},
{0, 0, 0, 255, 60, 0, 0,},
{ 0, 0, 15, 240, 240, 0, 0, },
{0, 0, 15, 207, 192, 0, 0,},
{ 0, 0, 16, 15, 0, 0, 0, },
{0, 0, 83, 252, 0, 0, 0,},
{0, 5, 79, 48, 0, 0, 0,},
{0, 4, 80, 240, 0, 0, 0,},
{0, 33, 67, 192, 0, 0, 0,},
{0, 32, 3, 0, 0, 0, 0,},
{ 0, 35, 255, 0, 0, 0, 0, },
{ 0, 160, 60, 0, 0, 0, 0, },
{ 0, 160, 60, 0, 0, 0, 0, },
{2, 163, 252, 0, 252, 0, 0,},
{2, 131, 48, 63, 255, 192, 0,},
{10, 131, 3, 255, 0, 240, 0,},
{10, 131, 207, 192, 0, 255, 0,},
{0, 131, 207, 255, 255, 3, 192,},
{12, 3, 252, 0, 255, 48, 192,},
{15, 20, 0, 0, 63, 243, 240,},
{3, 20, 128, 0, 63, 51, 48,},
{63, 192, 128, 0, 60, 3, 240,},
{60, 0, 128, 0, 60, 243, 240,},
{60, 10, 128, 0, 15, 60, 48,},
{60, 42, 128, 0, 15, 60, 48,},
{60, 162, 128, 0, 12, 48, 240,},
{60, 130, 128, 0, 12, 60, 48,},
{ 60, 130, 128, 0, 15, 243, 240, },
{12, 42, 128, 0, 3, 195, 240,},
{15, 2, 128, 0, 15, 3, 240,},
{15, 240, 128, 0, 15, 60, 192,},
{15, 252, 16, 0, 15, 252, 192,},
{3, 192, 16, 0, 63, 195, 192,},
{3, 196, 20, 0, 12, 63, 0,},
{0, 192, 196, 0, 16, 255, 0,},
{0, 255, 195, 0, 83, 240, 0,},
{0, 15, 240, 255, 19, 192, 0,},
{0, 3, 255, 63, 31, 0, 0,},
{0, 0, 63, 255, 240, 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, },  
};
///////////////////////////////////////////////////
const unsigned char img_zifra_7[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
 { 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 15, 0, 0, 0, 0, 0, },
{0, 63, 255, 240, 20, 252, 12,},
{0, 60, 48, 63, 195, 255, 252,},
{0, 49, 15, 51, 240, 0, 60,},
{0, 252, 63, 252, 63, 1, 12,},
{0, 252, 48, 0, 0, 40, 60,},
{0, 252, 3, 0, 79, 0, 48,},
{0, 255, 255, 255, 63, 255, 240,},
{3, 255, 255, 255, 255, 204, 192,},
{3, 192, 0, 0, 0, 3, 192,},
{15, 192, 0, 0, 0, 19, 0,},
{15, 0, 0, 0, 0, 143, 0, },
{ 0, 0, 0, 0, 0, 143, 0, },
{0, 0, 0, 0, 2, 12, 0,},
{0, 0, 0, 0, 2, 32, 0,},
{0, 0, 0, 0, 10, 160, 0,},
{0, 0, 0, 0, 40, 160, 0,},
{0, 0, 0, 0, 160, 128, 0,},
{0, 0, 0, 0, 128, 128, 0,},
{0, 0, 0, 0, 202, 128, 0,},
{0, 0, 0, 3, 50, 128, 0,},
{0, 0, 0, 15, 48, 0, 0,},
{0, 0, 0, 15, 252, 0, 0,},
{0, 0, 0, 60, 12, 0, 0,},
{0, 0, 0, 64, 12, 0, 0,},
{ 0, 0, 0, 0, 160, 0, 0, },
{0, 0, 0, 42, 160, 0, 0,},
{0, 0, 2, 170, 160, 0, 0,},
{0, 0, 4, 162, 128, 0, 0,},
{0, 0, 0, 162, 128, 0, 0,},
{0, 0, 20, 32, 128, 0, 0,},
{0, 0, 21, 0, 128, 0, 0,},
{0, 0, 193, 42, 128, 0, 0,},
{0, 0, 192, 10, 0, 0, 0,},
{0, 3, 255, 48, 0, 0, 0,},
{0, 3, 3, 193, 0, 0, 0,},
{ 0, 15, 19, 0, 0, 0, 0, },
{0, 15, 19, 60, 0, 0, 0,},
{0, 15, 0, 252, 0, 0, 0,},
{0, 15, 240, 240, 0, 0, 0,},
{0, 3, 255, 240, 0, 0, 0,},
{0, 3, 255, 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, }, 
};
///////////////////////////////////////////////////
const unsigned char img_zifra_8[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
 { 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{0, 0, 0, 255, 0, 0, 0,},
{0, 0, 63, 255, 252, 192, 0,},
{0, 3, 243, 255, 204, 240, 0,},
{0, 15, 195, 192, 243, 63, 0,},
{0, 63, 51, 0, 60, 195, 0,},
{0, 128, 8, 0, 15, 3, 192,},
{2, 130, 168, 0, 3, 48, 192,},
{2, 138, 160, 0, 15, 192, 192,},
{2, 168, 0, 0, 3, 0, 192,},
{10, 128, 80, 0, 3, 240, 192,},
{10, 1, 64, 0, 0, 252, 192,},
{10, 48, 0, 0, 3, 204, 192,},
{8, 15, 48, 0, 3, 15, 192,},
{8, 15, 252, 0, 0, 83, 0,},
{10, 60, 204, 0, 0, 79, 0,},
{10, 60, 15, 0, 15, 12, 0,},
{10, 15, 63, 240, 15, 240, 0,},
{2, 131, 255, 252, 255, 192, 0,},
{ 0, 160, 0, 15, 240, 0, 0, },
{0, 42, 0, 0, 192, 0, 0,},
{0, 10, 170, 168, 255, 192, 0,},
{0, 0, 168, 129, 63, 240, 0,},
{0, 0, 40, 129, 48, 4, 0,},
{0, 3, 42, 1, 49, 68, 0,},
{0, 15, 40, 85, 240, 69, 64,},
{0, 60, 32, 21, 12, 85, 64,},
{0, 240, 160, 5, 65, 85, 0,},
{3, 194, 128, 0, 81, 5, 48,},
{3, 10, 0, 0, 20, 5, 48,},
{3, 42, 0, 0, 4, 192, 240,},
{15, 42, 0, 0, 4, 207, 240,},
{12, 130, 0, 0, 0, 255, 48,},
{12, 162, 0, 0, 10, 48, 240,},
{12, 170, 0, 0, 0, 48, 240,},
{12, 32, 0, 0, 3, 48, 240,},
{12, 1, 0, 0, 15, 243, 192,},
{15, 240, 192, 0, 12, 3, 192,},
{3, 195, 192, 0, 12, 15, 0,},
{3, 240, 255, 0, 48, 252, 0,},
{0, 63, 3, 255, 243, 192, 0,},
{0, 15, 240, 255, 255, 192, 0,},
{0, 0, 255, 255, 240, 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, }, 
};
///////////////////////////////////////////////////
const unsigned char img_zifra_9[IMG_VARNAME_HEIGHT][IMG_VARNAME_BWIDTH] PROGMEM={
{ 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, 15, 255, 252, 0, 0,},
{0, 0, 244, 252, 255, 192, 0,},
{0, 3, 196, 255, 15, 240, 0,},
{0, 15, 197, 0, 195, 255, 0,},
{0, 255, 4, 0, 19, 3, 0,},
{0, 252, 48, 0, 20, 19, 192,},
{3, 195, 252, 0, 4, 3, 192,},
{3, 63, 240, 0, 4, 63, 240,},
{3, 60, 240, 0, 2, 15, 240,},
{15, 192, 240, 0, 2, 128, 240,},
{15, 195, 192, 0, 2, 168, 48,},
{15, 207, 240, 0, 2, 130, 60,},
{12, 60, 48, 0, 2, 130, 60,},
{15, 12, 48, 0, 2, 138, 60,},
{12, 60, 240, 0, 2, 168, 60,},
{12, 60, 240, 0, 2, 160, 60,},
{15, 207, 60, 0, 2, 0, 60,},
{15, 192, 60, 0, 2, 3, 252,},
{12, 204, 252, 0, 2, 20, 192,},
{15, 207, 252, 0, 0, 20, 240,},
{3, 12, 255, 0, 63, 192, 48,},
{3, 192, 255, 255, 243, 194, 0,},
{0, 255, 0, 3, 243, 194, 160,},
{0, 15, 0, 255, 192, 194, 160,},
{0, 3, 255, 252, 12, 194, 128,},
{0, 0, 63, 0, 63, 202, 128,},
{0, 0, 0, 0, 60, 10, 0,},
{0, 0, 0, 0, 60, 10, 0,},
{0, 0, 0, 0, 255, 200, 0,},
{0, 0, 0, 0, 192, 8, 0,},
{0, 0, 0, 3, 193, 72, 0,},
{0, 0, 0, 15, 5, 16, 0,},
{0, 0, 0, 12, 241, 80, 0,},
{0, 0, 0, 63, 197, 0, 0,},
{0, 0, 0, 240, 4, 0, 0,},
{0, 0, 3, 243, 240, 0, 0,},
{ 0, 0, 15, 15, 240, 0, 0, },
{ 0, 0, 60, 255, 0, 0, 0, },
{0, 0, 243, 240, 0, 0, 0,},
{0, 42, 63, 0, 0, 0, 0,},
{ 0, 170, 128, 0, 0, 0, 0, },
{ 0, 32, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },
{ 0, 0, 0, 0, 0, 0, 0, },  
};
///////////////////////////////////////////////////

 

lilik
Offline
Зарегистрирован: 19.10.2017

Чисто из спортивного интереса, только + чего то коряво печатается, сбой в конвертере авторском видать :)

шрифт или глифы

прописные лень рисовать.

lilik
Offline
Зарегистрирован: 19.10.2017
#include <VGAX.h>
//шрифт сгенерирован из 2BITFONT - Сандро Маффиодо
//РУССКИЕ ЗАГЛАВНЫЕ
#define FNT_VARNAME_HEIGHT 8
#define FNT_VARNAME_SYMBOLS_COUNT 95
//размер данных=760 байт
const unsigned char fnt_varname_data[FNT_VARNAME_SYMBOLS_COUNT][1 + FNT_VARNAME_HEIGHT] PROGMEM = {
  { 1, 128, 128, 128, 128, 128, 0, 128, 0, }, //глиф '!' код=0
  { 5, 112, 136, 8, 56, 8, 136, 112, 0, }, //глиф '"' code=1
  { 6, 72, 72, 252, 72, 252, 72, 72, 0, }, //глиф '#' code=2
  { 4, 112, 160, 128, 96, 16, 80, 224, 0, }, //глиф '$' code=3
  { 6, 196, 200, 16, 48, 32, 76, 140, 0, }, //глиф '%' code=4
  { 6, 96, 144, 144, 96, 208, 180, 104, 0, }, //глиф '&' code=5
  { 5, 112, 136, 8, 120, 8, 136, 112, 0, }, // глиф ''' код = 6
  { 2, 64, 64, 128, 128, 128, 64, 64, 0, }, //глиф '(' code=7
  { 2, 128, 128, 0, 64, 64, 128, 128, 0, }, //глиф ')' code=8
  { 3, 0, 0, 0, 128, 64, 160, 0, 0, }, //глиф '*' code=9
  { 3, 0, 0, 0, 64, 192, 64, 0, 0, }, //глиф '+' code=10
  { 2, 0, 0, 0, 0, 0, 192, 192, 64, }, //глиф ',' code=11
  { 3, 0, 0, 0, 0, 224, 0, 0, 0, }, // глиф '-' код = 12
  { 2, 0, 0, 0, 0, 0, 192, 192, 0, }, //глиф '.' код=13
  { 3, 32, 32, 32, 64, 64, 128, 128, 128, }, // глиф '/' код = 14
  { 5, 112, 136, 136, 136, 136, 136, 112, 0, }, //глиф '0' code=15
  { 5, 32, 96, 224, 32, 32, 32, 248, 0, }, //глиф '1' code=16
  { 5, 112, 136, 136, 8, 240, 128, 248, 0, }, // глиф '2' code=17
  { 5, 112, 136, 8, 48, 8, 136, 112, 0, }, //глиф '3' code=18
  { 5, 16, 48, 80, 80, 144, 248, 16, 0, }, //глиф '4' code=19
  { 5, 248, 128, 240, 8, 8, 136, 112, 0, }, //глиф '5' code=20
  { 5, 112, 128, 128, 112, 136, 136, 112, 0, }, // глиф '6' code=21
  { 5, 248, 8, 8, 16, 32, 64, 128, 0, }, //глиф '7' code=22
  { 5, 112, 136, 136, 112, 136, 136, 112, 0, }, //глиф '8' code=23
  { 5, 112, 136, 136, 112, 8, 8, 112, 0, }, //глиф '9' code=24
  { 5, 168, 168, 168, 112, 168, 168, 168, 0, }, //глиф ':' code=25
  { 2, 0, 192, 192, 0, 0, 192, 192, 64, }, //глиф ';' код=26
  { 5, 248, 128, 128, 240, 136, 136, 240, 0, }, //глиф '<' code=27
  { 4, 0, 0, 0, 240, 0, 240, 0, 0, }, //глиф '=' code=28
  { 7, 156, 162, 162, 226, 162, 162, 156, 0, }, //глиф '>' code=29
  { 5, 112, 136, 8, 16, 32, 0, 32, 0, }, //глиф '?' код=30
  { 5, 32, 80, 136, 144, 168, 168, 144, 72, }, //глиф '@' code=31
  { 7, 84, 186, 146, 186, 84, 16, 16, 0, }, // глиф 'A' code=32
  { 5, 136, 152, 168, 168, 168, 200, 136, 0, }, // глиф 'B' code=33
  { 5, 112, 136, 128, 128, 128, 136, 112, 0, }, //глиф 'C' code=34
  { 5, 240, 136, 136, 176, 136, 136, 240, 0, }, // глиф 'D' код = 35
  { 5, 136, 136, 136, 112, 8, 136, 112, 0, }, // глиф 'E' code=36
  { 5, 112, 136, 136, 136, 248, 136, 136, 0, }, // глиф 'F' код = 37
  { 5, 248, 136, 136, 136, 136, 136, 136, 0, }, // глиф 'G' код = 38
  { 5, 240, 136, 136, 240, 128, 128, 128, 0, }, // глиф 'H' код = 39
  { 5, 136, 136, 136, 168, 168, 168, 248, 0, }, // глиф 'I' код = 40
  { 5, 112, 136, 136, 136, 136, 136, 112, 0, }, // глиф 'J' код = 41
  { 5, 56, 72, 136, 136, 136, 136, 136, 0, }, //глиф 'K' code=42
  { 6, 24, 40, 72, 72, 72, 72, 252, 132, }, //глиф 'L' code=43
  { 5, 128, 128, 128, 240, 136, 136, 240, 0, }, // глиф 'M' код = 44
  { 5, 248, 32, 32, 32, 32, 32, 32, 0, }, // глиф 'N' код = 45
  { 6, 136, 136, 136, 168, 168, 168, 252, 4, }, // глиф 'O' код = 46
  { 5, 112, 136, 8, 112, 8, 136, 112, 0, }, // глиф 'P' code=47
  { 5, 168, 136, 152, 168, 168, 200, 136, 0, }, //глиф 'Q' code=48
  { 5, 152, 176, 224, 192, 224, 176, 152, 0, }, //глиф 'R' code=49
  { 6, 132, 132, 132, 228, 148, 148, 228, 0, }, // глиф 'S' код = 50
  { 5, 248, 128, 128, 224, 128, 128, 248, 0, }, // глиф 'T' код = 51
  { 5, 248, 128, 128, 128, 128, 128, 128, 0, }, // глиф 'U' код = 52
  { 7, 130, 130, 68, 170, 146, 130, 130, 0, }, // глиф 'V' код = 53
  { 6, 136, 136, 136, 136, 136, 136, 124, 4, }, //глиф 'W' code=54
  { 5, 136, 136, 136, 112, 8, 8, 8, 0, }, //глиф 'X' code=55
  { 5, 136, 136, 136, 248, 136, 136, 136, 0, }, // глиф 'Y' код = 56
  { 5, 120, 136, 136, 104, 24, 104, 136, 0, }, //глиф 'Z' code=57
  { 2, 192, 128, 128, 128, 128, 128, 192, 0, }, //глиф '[' code=58
  { 3, 128, 128, 128, 64, 64, 32, 32, 32, }, //глиф '\' code=59
  { 2, 192, 64, 64, 64, 64, 64, 192, 0, }, //глиф ']' code=60
  { 3, 64, 160, 0, 0, 0, 0, 0, 0, }, //глиф '^' code=61
  { 4, 0, 0, 0, 0, 0, 0, 240, 0, }, //глиф '_' code=62
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф '`' code=63
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, // глиф 'a' code=64
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, // глиф 'b' код = 65
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'c' code=66
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, // глиф 'd' код = 67
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, // глиф 'e' код = 68
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'f' code=69
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'g' code=70
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'h' code=71
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'i' code=72
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'j' code=73
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'k' code=74
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'l' code=75
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'm' code=76
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'n' code=77
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, // глиф 'o' код = 78
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'p' code=79
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'q' code=80
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'r' code=81
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, // код глифа = 82
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 't' code=83
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, // глиф 'u' код = 84
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'v' code=85
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'w' code=86
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'x' code=87
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'y' code=88
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф 'z' code=89
  { 5, 136, 136, 80, 32, 80, 136, 136, 0, }, //глиф '{' code=90
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф '|' код=91
  { 6, 192, 64, 64, 120, 68, 68, 120, 0, }, //глиф '}' code=92
  { 5, 80, 168, 128, 240, 128, 128, 248, 0, }, //глиф '~' code=93
  { 1, 0, 0, 0, 0, 0, 0, 128, 0, }, //глиф '£' code=94
};

VGAX vga;

static const char str0[] PROGMEM = " 'NJ HECCRBQ ZPSR !";
static const char str1[] PROGMEM = "  PFUKFDYST <ERDS";
static const char str2[] PROGMEM = "    WDTN-UJKE<JQ";
static const char str3[] PROGMEM = "    0123456789;,.-=";
void setup() {
  vga.begin();
  vga.clear(3);
  vga.printPROGMEM((byte*)fnt_varname_data, FNT_VARNAME_SYMBOLS_COUNT , FNT_VARNAME_HEIGHT, 1, 1, str0, 1, 1, 1);
  vga.printPROGMEM((byte*)fnt_varname_data, FNT_VARNAME_SYMBOLS_COUNT , FNT_VARNAME_HEIGHT, 1, 1, str1, 1, 9, 0);
  vga.printPROGMEM((byte*)fnt_varname_data, FNT_VARNAME_SYMBOLS_COUNT , FNT_VARNAME_HEIGHT, 1, 1, str2, 1, 17, 2);
  vga.fillrect(1, 25, 118, 10, 0); //
  vga.printPROGMEM((byte*)fnt_varname_data, FNT_VARNAME_SYMBOLS_COUNT , FNT_VARNAME_HEIGHT, 1, 1, str3, 1, 26, 3);

}
void loop() {
}

 

lilik
Offline
Зарегистрирован: 19.10.2017

В принципе получилось что часы уходят как точно не подбирай в час на 2-3 секунды. Для "делай" хорошо, в сутки раз подводить надо. Для сторожа в фойе самое то :), заодно можно негласно контролировать его выход на работу.

livek
livek аватар
Offline
Зарегистрирован: 29.07.2017

Доброго дня уважаемый. Подскажите как вы нарисовали вольтметр. И активный он? И я так понимаю это вывод через VGA.
Который день ищу информацию как можно сделать анимационные приборы измерения электрических величин.
Спасибо заранее

lilik
Offline
Зарегистрирован: 19.10.2017

livek пишет:
Доброго дня уважаемый. Подскажите как вы нарисовали вольтметр. И активный он? И я так понимаю это вывод через VGA. Который день ищу информацию как можно сделать анимационные приборы измерения электрических величин. Спасибо заранее

////// ШКАЛА СТРЕЛОЧНАЯ - ВОЛЬТМЕТР
#include <VGAX.h>
//#include <VGAXUtils.h>
#define FNT_NANOFONT_HEIGHT 6
#define FNT_NANOFONT_SYMBOLS_COUNT 95
VGAX vga;
float regul=1.23;//коэфф.регулировки точности показаний вольтметра
int str = 59; //длина стрелки в пикселях
float a = 0.00; // переменная для угла поворота стрелки
float aa = 0.00; // переменная для угла поворота стрелки (предыдущее значение)
const unsigned char fnt_nanofont_data[FNT_NANOFONT_SYMBOLS_COUNT][1 + FNT_NANOFONT_HEIGHT] PROGMEM = {
  { 1, 128, 128, 128, 0, 128, 0, }, //glyph '!' code=0
  { 3, 160, 160, 0, 0, 0, 0, }, //glyph '"' code=1
  { 5, 80, 248, 80, 248, 80, 0, },  //glyph '#' code=2
  { 5, 120, 160, 112, 40, 240, 0, },  //glyph '$' code=3
  { 5, 136, 16, 32, 64, 136, 0, },  //glyph '%' code=4
  { 5, 96, 144, 104, 144, 104, 0, },  //glyph '&' code=5
  { 2, 128, 64, 0, 0, 0, 0, },  //glyph ''' code=6
  { 2, 64, 128, 128, 128, 64, 0, }, //glyph '(' code=7
  { 2, 128, 64, 64, 64, 128, 0, },  //glyph ')' code=8
  { 3, 0, 160, 64, 160, 0, 0, },  //glyph '*' code=9
  { 3, 0, 64, 224, 64, 0, 0, }, //glyph '+' code=10
  { 2, 0, 0, 0, 0, 128, 64, },  //glyph ',' code=11
  { 3, 0, 0, 224, 0, 0, 0, }, //glyph '-' code=12
  { 1, 0, 0, 0, 0, 128, 0, }, //glyph '.' code=13
  { 5, 8, 16, 32, 64, 128, 0, },  //glyph '/' code=14
  { 4, 96, 144, 144, 144, 96, 0, }, //glyph '0' code=15
  { 3, 64, 192, 64, 64, 224, 0, },  //glyph '1' code=16
  { 4, 224, 16, 96, 128, 240, 0, }, //glyph '2' code=17
  { 4, 224, 16, 96, 16, 224, 0, },  //glyph '3' code=18
  { 4, 144, 144, 240, 16, 16, 0, }, //glyph '4' code=19
  { 4, 240, 128, 224, 16, 224, 0, },  //glyph '5' code=20
  { 4, 96, 128, 224, 144, 96, 0, }, //glyph '6' code=21
  { 4, 240, 16, 32, 64, 64, 0, }, //glyph '7' code=22
  { 4, 96, 144, 96, 144, 96, 0, },  //glyph '8' code=23
  { 4, 96, 144, 112, 16, 96, 0, },  //glyph '9' code=24
  { 1, 0, 128, 0, 128, 0, 0, }, //glyph ':' code=25
  { 2, 0, 128, 0, 0, 128, 64, },  //glyph ';' code=26
  { 3, 32, 64, 128, 64, 32, 0, }, //glyph '<' code=27
  { 3, 0, 224, 0, 224, 0, 0, }, //glyph '=' code=28
  { 3, 128, 64, 32, 64, 128, 0, },  //glyph '>' code=29
  { 4, 224, 16, 96, 0, 64, 0, },  //glyph '?' code=30
  { 4, 96, 144, 176, 128, 112, 0, },  //glyph '@' code=31
  { 4, 96, 144, 240, 144, 144, 0, },  //glyph 'A' code=32
  { 4, 224, 144, 224, 144, 224, 0, }, //glyph 'B' code=33
  { 4, 112, 128, 128, 128, 112, 0, }, //glyph 'C' code=34
  { 4, 224, 144, 144, 144, 224, 0, }, //glyph 'D' code=35
  { 4, 240, 128, 224, 128, 240, 0, }, //glyph 'E' code=36
  { 4, 240, 128, 224, 128, 128, 0, }, //glyph 'F' code=37
  { 4, 112, 128, 176, 144, 112, 0, }, //glyph 'G' code=38
  { 4, 144, 144, 240, 144, 144, 0, }, //glyph 'H' code=39
  { 3, 224, 64, 64, 64, 224, 0, },  //glyph 'I' code=40
  { 4, 240, 16, 16, 144, 96, 0, },  //glyph 'J' code=41
  { 4, 144, 160, 192, 160, 144, 0, }, //glyph 'K' code=42
  { 4, 128, 128, 128, 128, 240, 0, }, //glyph 'L' code=43
  { 5, 136, 216, 168, 136, 136, 0, }, //glyph 'M' code=44
  { 4, 144, 208, 176, 144, 144, 0, }, //glyph 'N' code=45
  { 4, 96, 144, 144, 144, 96, 0, }, //glyph 'O' code=46
  { 4, 224, 144, 224, 128, 128, 0, }, //glyph 'P' code=47
  { 4, 96, 144, 144, 144, 96, 16, },  //glyph 'Q' code=48
  { 4, 224, 144, 224, 160, 144, 0, }, //glyph 'R' code=49
  { 4, 112, 128, 96, 16, 224, 0, }, //glyph 'S' code=50
  { 3, 224, 64, 64, 64, 64, 0, }, //glyph 'T' code=51
  { 4, 144, 144, 144, 144, 96, 0, },  //glyph 'U' code=52
  { 3, 160, 160, 160, 160, 64, 0, },  //glyph 'V' code=53
  { 5, 136, 168, 168, 168, 80, 0, },  //glyph 'W' code=54
  { 4, 144, 144, 96, 144, 144, 0, },  //glyph 'X' code=55
  { 3, 160, 160, 64, 64, 64, 0, },  //glyph 'Y' code=56
  { 4, 240, 16, 96, 128, 240, 0, }, //glyph 'Z' code=57
  { 2, 192, 128, 128, 128, 192, 0, }, //glyph '[' code=58
  { 5, 128, 64, 32, 16, 8, 0, },  //glyph '\' code=59
  { 2, 192, 64, 64, 64, 192, 0, },  //glyph ']' code=60
  { 5, 32, 80, 136, 0, 0, 0, }, //glyph '^' code=61
  { 4, 0, 0, 0, 0, 240, 0, }, //glyph '_' code=62
  { 2, 128, 64, 0, 0, 0, 0, },  //glyph '`' code=63
  { 3, 0, 224, 32, 224, 224, 0, },  //glyph 'a' code=64
  { 3, 128, 224, 160, 160, 224, 0, }, //glyph 'b' code=65
  { 3, 0, 224, 128, 128, 224, 0, }, //glyph 'c' code=66
  { 3, 32, 224, 160, 160, 224, 0, },  //glyph 'd' code=67
  { 3, 0, 224, 224, 128, 224, 0, }, //glyph 'e' code=68
  { 2, 64, 128, 192, 128, 128, 0, },  //glyph 'f' code=69
  { 3, 0, 224, 160, 224, 32, 224, },  //glyph 'g' code=70
  { 3, 128, 224, 160, 160, 160, 0, }, //glyph 'h' code=71
  { 1, 128, 0, 128, 128, 128, 0, }, //glyph 'i' code=72
  { 2, 0, 192, 64, 64, 64, 128, },  //glyph 'j' code=73
  { 3, 128, 160, 192, 160, 160, 0, }, //glyph 'k' code=74
  { 1, 128, 128, 128, 128, 128, 0, }, //glyph 'l' code=75
  { 5, 0, 248, 168, 168, 168, 0, }, //glyph 'm' code=76
  { 3, 0, 224, 160, 160, 160, 0, }, //glyph 'n' code=77
  { 3, 0, 224, 160, 160, 224, 0, }, //glyph 'o' code=78
  { 3, 0, 224, 160, 160, 224, 128, }, //glyph 'p' code=79
  { 3, 0, 224, 160, 160, 224, 32, },  //glyph 'q' code=80
  { 3, 0, 224, 128, 128, 128, 0, }, //glyph 'r' code=81
  { 2, 0, 192, 128, 64, 192, 0, },  //glyph 's' code=82
  { 3, 64, 224, 64, 64, 64, 0, }, //glyph 't' code=83
  { 3, 0, 160, 160, 160, 224, 0, }, //glyph 'u' code=84
  { 3, 0, 160, 160, 160, 64, 0, },  //glyph 'v' code=85
  { 5, 0, 168, 168, 168, 80, 0, },  //glyph 'w' code=86
  { 3, 0, 160, 64, 160, 160, 0, },  //glyph 'x' code=87
  { 3, 0, 160, 160, 224, 32, 224, },  //glyph 'y' code=88
  { 2, 0, 192, 64, 128, 192, 0, },  //glyph 'z' code=89
  { 3, 96, 64, 192, 64, 96, 0, }, //glyph '{' code=90
  { 1, 128, 128, 128, 128, 128, 0, }, //glyph '|' code=91
  { 3, 192, 64, 96, 64, 192, 0, },  //glyph '}' code=92
  { 3, 96, 192, 0, 0, 0, 0, },  //glyph '~' code=93
  { 4, 48, 64, 224, 64, 240, 0, },  //glyph '£' code=94
};
////числа шкалы так рисуем :)
static const char str0[] PROGMEM = "       3";
static const char str1[] PROGMEM = "   2       4";
static const char str2[] PROGMEM = "  1          5";
static const char str3[] PROGMEM = "0              6";
static const char str4[] PROGMEM = "     VOLTMETR";
void setup() {
  vga.begin();
  vga.clear(0);

}
void loop() {
  a = -PI * (1023 - analogRead(A5)/regul) / 1023; //угол поворота стрелки прибора в зависимости от полученных с потенциометра данных
  if (abs(a - aa) > PI / 96) {
    line_(60, 59, 60 + cos(aa)*str, 59 + sin(aa)*str, 0); // стирание старой стрелки
    aa = a;
    for (float i = PI; i < 2 * PI; i = i + PI / 12) {
      line_(60 + cos(i)*str * 0.85,  59 + sin(i)*str * 0.85, 60 + cos(i)*str,  59 + sin(i)*str, 3  ); // риски-метки шкалы
      ////числа шкалы так рисуем :)
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str0, 15, 11, 1);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str1, 15, 20, 1);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str2, 15, 35, 1);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str3, 15, 55, 1);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 2, str4, 15, 45, 3);
    }
    line_(60, 59, 60 + cos(a)*str, 59 + sin(a)*str, 2); // рисование новой стрелки
  }
  vga.delay(20);
}
/////////////////////////////////////////////////////////
/////// базовая функция рисования отрезка по координатам концов заданным цветом
void line_(float x1, float y1, float x2, float y2, int c) {
  int divisions = int(1.1 * 1 * sqrt(pow((y2 - y1), 2) + pow((x2 - x1), 2)));
  for (int i = 0; i <= divisions; i++) {
    int x = int(x1 + i * (x2 - x1) / divisions);
    int y = int(y1 + i * (y2 - y1) / divisions);
    if (x > 0 && x < VGAX_WIDTH && y > 0 && y < VGAX_HEIGHT) {
      vga.putpixel(x, y, c);
    }
  }
}
///////////////////////////////////////////////////////////

 

livek
livek аватар
Offline
Зарегистрирован: 29.07.2017

Огромное спасибо

livek
livek аватар
Offline
Зарегистрирован: 29.07.2017

Здравствуйте в очередной раз. Объясните мне пожалуйста.
Перечитал много информации и везде написано что в монохром разрешение 800х600, цветной 480х320, а в реале 120х60 монохром. Попробовал залить несколько проектов в ардуино нано v3, в том числе и прошивки с ваших постов. И что то меня очень расстроило.
Можно ли вообще выводить текст/переменные в размере 800х600 точек?
Спасибо за ранее

lilik
Offline
Зарегистрирован: 19.10.2017

livek пишет:
Здравствуйте в очередной раз. Объясните мне пожалуйста. Перечитал много информации и везде написано что в монохром разрешение 800х600, цветной 480х320, а в реале 120х60 монохром. Попробовал залить несколько проектов в ардуино нано v3, в том числе и прошивки с ваших постов. И что то меня очень расстроило. Можно ли вообще выводить текст/переменные в размере 800х600 точек? Спасибо за ранее

Средства данной библиотеки ограничены 120*60 в 3 цветах. Другими аппаратными и программными средствами думаю можно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

3 цвета-то откуда?

lilik
Offline
Зарегистрирован: 19.10.2017

andriano пишет:

3 цвета-то откуда?

Вру, 4 цвета - один фоновый.

livek
livek аватар
Offline
Зарегистрирован: 29.07.2017

RGB вот три цвета

lilik
Offline
Зарегистрирован: 19.10.2017

livek пишет:
RGB вот три цвета

:)

Во истину, так!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lilik пишет:

andriano пишет:

3 цвета-то откуда?

Вру, 4 цвета - один фоновый.

4 цвета - это 2 бита.

120*60*2/8=1800 байт. 224 байта на все остальное, включая глобальные переменные и стек, это не слишком мало?

lilik
Offline
Зарегистрирован: 19.10.2017

Ну других библиотек под УНО нет.