Вывод текста в светодиодной матрице

Xomyc
Offline
Зарегистрирован: 10.04.2020

Народ, сразу признаюсь я далеко не асс во всяких С++. Писал когда-то на Delphi, сейчас PowerShell, VBScript, чуть чуть java.

Таки пытаюсь разобраться с выводом текста на матрицу 16х16. Как создать шрифт понял, а вот в задании светящихся точек на матрице не въезжаю. А конкретно не понимаю вот это выражение:

pixel = ((vertPixels >> k) & 0x01);

const uint8_t font7num[][3] PROGMEM = {
  {0x1F,0x11,0x1F}, //0
  {0x0,0x8,0x1F}, //1
  {0x13,0x15,0x19}, //2
  {0x11,0x15,0x1F}, //3
  {0x6,0xA,0x1F}, //4
  {0x1D,0x15,0x17}, //5
  {0x1F,0x15,0x17}, //6
  {0x10,0x17,0x18}, //7
  {0x1F,0x15,0x1F}, //8
  {0x1D,0x15,0x1F}, //9
  {0x0}, // 
  {0x1}, //.
  {0x9}, //:
};

Вот мой маленький шрифтик, состоящий из цифр, пробела, точки и двоеточия.

Вот считываем 2. vertPixels это двоичное представление разряда. Т.е. 19, 21 и 25.

vertPixels >> k - k -это последовательность от 4 до 0. Т.е. сдвигаем скажем 19 на 4, потом на , на 2, на 1 и на 0.

11001 >> 4 = 00001
11001 >> 3 = 00011
11001 >> 2 = 00110
11001 >> 1 = 01100
11001 >> 0 = 11001

А вот следующее действие хоть убей не понимаю. & 0x01. Читал. Весь день читал. Как-то обработать по маске. И результаты есть:

11001 >> 4 = 00001 & 0x01=1
11001 >> 3 = 00011 & 0x01=0
11001 >> 2 = 00110 & 0x01=0
11001 >> 1 = 01100 & 0x01=1
11001 >> 0 = 11001 & 0x01=1

Но как не понимаю! Объясните плиз!

b707
Offline
Зарегистрирован: 26.05.2017

Xomyc пишет:

А вот следующее действие хоть убей не понимаю. & 0x01. Читал. Весь день читал. Как-то обработать по маске. И результаты есть:


11001 >> 4 = 00001 & 0x01=1
11001 >> 3 = 00011 & 0x01=0
11001 >> 2 = 00110 & 0x01=0
11001 >> 1 = 01100 & 0x01=1
11001 >> 0 = 11001 & 0x01=1

Но как не понимаю! Объясните плиз!

неправильные у вас результаты, потому и не понимаете. Выражение (x & 0x01) установит бит 1 в младшем разряде, если в х на этом месте тоже единица:

11001 >> 4 = 00001 & 0x01= 00001
11001 >> 3 = 00011 & 0x01= 00001
11001 >> 2 = 00110 & 0x01= 00000
11001 >> 1 = 01100 & 0x01= 00000
11001 >> 0 = 11001 & 0x01= 00001

 

Xomyc
Offline
Зарегистрирован: 10.04.2020

b707 пишет:

неправильные у вас результаты, потому и не понимаете. Выражение (x & 0x01) установит бит 1 в младшем разряде, если в х на этом месте тоже единица:

11001 >> 4 = 00001 & 0x01= 00001
11001 >> 3 = 00011 & 0x01= 00001
11001 >> 2 = 00110 & 0x01= 00000
11001 >> 1 = 01100 & 0x01= 00000
11001 >> 0 = 11001 & 0x01= 00001

Самое главное, что у меня тоже так получается. Но  тогда будут светится не те сегменты. На практике получается именно как я написал. Вот у той же двойки. первый столбик 19, второй 21, третий 25.

Берем средний столбик. Все цифры у меня 3х5 диодов. Т.е. средний должен гореть как 10101.

А если считть по правильному, то получаем:

100001 >> 4 = 000010 & 0x01=0
100001 >> 3 = 000100 & 0x01=0
100001 >> 2 = 001000 & 0x01=0
100001 >> 1 = 010000 & 0x01=0
100001 >> 0 = 100001 & 0x01=1

Т.е. в среднем столбце у 2 будет гореть только верхний сегмент Ни средний ни нижний не загорятся!

b707
Offline
Зарегистрирован: 26.05.2017

Xomyc пишет:

Берем средний столбик. Все цифры у меня 3х5 диодов. Т.е. средний должен гореть как 10101.

ну правильно - вот и надо брать 0х15 = 10101.  А вы что берете? почему 100001 ? - мало того, что на один разряд длиннее, так еще и единицу в центре потеряли

А если считть по правильному, то получаем:

10101 >> 4 = 00001 & 0x01=1
10101  >> 3 = 00010 & 0x01=0
10101  >> 2 = 00101 & 0x01=1
10101  >> 1 = 01010  & 0x01=0
10101  >> 0 = 10101  & 0x01=1

 

 

Xomyc
Offline
Зарегистрирован: 10.04.2020

b707 пишет:

ну правильно - вот и надо брать 0х15 = 10101.  А вы что берете? почему 100001 ? - мало того, что на один разряд длиннее, так еще и единицу в центре потеряли

Совсем запутался. 2 это {0x13,0x15,0x19}

Но это в шестнадцатиричных значениях. Или нет? Просто

vertPixels=pgm_read_byte(&(font7num[n][j]));

И значения он в порт выдает 19, 21 и 25. Я и переводил их на бумаге в двоичный код, а потом все проделывал с ними. А надо получается ...... брррр! Кажется понял. Я эти числа в калькуляторе вводил как шестнадцатиричные! А надо было десятичные выбрать! Блин весь день голову ломал! Спасибо!

 

b707
Offline
Зарегистрирован: 26.05.2017

не за что, обращайтесь :)