#define screen_view 25 //через сколько кадров смена картинки
//25 кадров = 100 мс или 10 картинок в секунду
byte str[4] = {5,4,3,2};
struct screen //один кадр кодируется двумя байтами
{
byte data[2];
};
//8 кадров
screen screens[8]{
{0x00,0x00},{0x80,0x00},
{0x48,0x00},{0x24,0x80},
{0x12,0x48},{0x01,0x24},
{0x00,0x12},{0x00,0x01}};
void setup()
{
for(auto i:str) pinMode(i, OUTPUT);
DDRB = 0xFF; //пины 8 и больше в режим OUTPUT
for(auto i:str) digitalWrite(i, HIGH);
}
byte str_now; //сканируемая в текущий момент строка
byte scr_num = 0; //индекс отображаемого кадра
unsigned screen_time = 0; //счетчик кадров
void loop()
{
for (str_now = 0; str_now<4; str_now++) //цикл сканирования строк
{
digitalWrite(str[str_now], LOW); //включить строку
draw(); //отрисовать стобцы в этой строке
digitalWrite(str[str_now], HIGH); //выключить строку
}
screen_time++; //счетчик кадров
if (screen_time==screen_view) {scr_num++; screen_time = 0; if(scr_num==8) scr_num = 0;}
}
void draw()
{
//дешифратор из двух байт (экран) в 4 бита (строка)
byte num = screens[scr_num].data[str_now>>1]>>((1-str_now&1)*4);
PORTB = num; //включить нужные столбцы
delay(1); //сколько мс горит одна строка (длительность кадра больше в 4 раза)
PORTB = 0; //выключить столбцы
}