Вывод символов на vga монитор.
- Войдите на сайт для отправки комментариев
Пнд, 06/06/2022 - 11:27
Была задумка заменить "севшие" и неисправные кинескопы в УЦИ на светодиодные индикаторы.
Чтобы меньше паять(напаялся уже),взял готовые 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 такого нет)
:)
Интересная тема, сейчас много таких мониторов скапливается без дела. Был бы полезен скетч-пример с функциями ( или библиотека) для вывода данных по аналогии экранчика SSD1306 128*64 пикселя. Примерно такой:
Функции: вставка картинки (из "прогмем"), рисование точки, отрезка, окружности...
:)
Интересная тема, сейчас много таких мониторов скапливается без дела. Был бы полезен скетч-пример с функциями ( или библиотека) для вывода данных по аналогии экранчика SSD1306 128*64 пикселя. Примерно
С ATmega328 особо не разбежишься.
Это да, нашлась "библиотека по мотивам"... 120*60 пикселей, похоже предел без использования дополнительной платы Ардуино. Странно, что китайцы ещё не сделали "видеокарту под Ардуино".
https://github.com/smaffer/vgax
На всякий случай напомню: http://arduino.ru/forum/proekty/s-stm32f103-na-televizor-polnyi-tv-signal
BluePill 512х240 пикселей.
Да, вопрос функционального назначения важен. Экранчики таких размеров - многоглазы, например, демонстрационный вольтметр на уроках...
...отрезал болгаркой от материнки и собрал по схеме...
...библиотека полна сюрпризов...
////// ШКАЛА СТРЕЛОЧНАЯ - ВОЛЬТМЕТР #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); } } } ///////////////////////////////////////////////////////////Гифка не грузится теперь, хоть и весит 1,74 Мб :(
Тоже сделал часы на " 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, }, }; ///////////////////////////////////////////////////Чисто из спортивного интереса, только + чего то коряво печатается, сбой в конвертере авторском видать :)
шрифт или глифы
прописные лень рисовать.
#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() { }В принципе получилось что часы уходят как точно не подбирай в час на 2-3 секунды. Для "делай" хорошо, в сутки раз подводить надо. Для сторожа в фойе самое то :), заодно можно негласно контролировать его выход на работу.
Доброго дня уважаемый. Подскажите как вы нарисовали вольтметр. И активный он? И я так понимаю это вывод через 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); } } } ///////////////////////////////////////////////////////////Огромное спасибо
Здравствуйте в очередной раз. Объясните мне пожалуйста.
Перечитал много информации и везде написано что в монохром разрешение 800х600, цветной 480х320, а в реале 120х60 монохром. Попробовал залить несколько проектов в ардуино нано v3, в том числе и прошивки с ваших постов. И что то меня очень расстроило.
Можно ли вообще выводить текст/переменные в размере 800х600 точек?
Спасибо за ранее
Средства данной библиотеки ограничены 120*60 в 3 цветах. Другими аппаратными и программными средствами думаю можно.
3 цвета-то откуда?
3 цвета-то откуда?
Вру, 4 цвета - один фоновый.
RGB вот три цвета
:)
Во истину, так!
3 цвета-то откуда?
Вру, 4 цвета - один фоновый.
4 цвета - это 2 бита.
120*60*2/8=1800 байт. 224 байта на все остальное, включая глобальные переменные и стек, это не слишком мало?
Ну других библиотек под УНО нет.