Здравствуйте, делаю часы на основе адресной светодиодной матрицы. Нашел код с уже готовым алфавитом и методами вывода их на матрицу. Но мне нужно разобраться как именно этот код работает, помогите понять.
Методы для вывода текста:
void setPixel (byte x, byte y, uint32_t color) {
uint16_t curLed;
if (x%2==0){
curLed=MATRIX_HEIGHT*x+y;
}
else {
curLed=(MATRIX_HEIGHT*(x+1)-1)-y;
}
leds[curLed]=color;
}
byte getPixel (uint8_t vertPixels, byte startY, uint32_t color) {
byte pixel;
for (int k = 7; k >=0; k--) {//
pixel = ((vertPixels >> k) & 0x01);
if (pixel==1){
setPixel (curX, curY, color);
}
curY++;
}
curY=startY;
curX++;
}
void showText(String text, byte startX, byte startY, uint32_t color){//вывод статического текста
int i;
byte n;
bool isRusLetter=false;
byte vertPixels;
curX=startX;
curY=startY;
for (i=0;i<text.length();i++){
if (int(text[i])>=0){//цифры и символы
n=fontNumStr.indexOf(text[i]);
for (byte j=0;j<4;j++){
vertPixels=pgm_read_byte(&(font7num[n][j]));
if ((j==0)||(vertPixels>0)){//только первая колонка и не пустые колонки
getPixel (vertPixels, startY, color);
}
if (curX>=MATRIX_WIDTH) {
break;
}
}
curX++;
if (curX>=MATRIX_WIDTH) {
break;
}
}
else {//русские буквы
if (isRusLetter==true){
isRusLetter=false;
n=112+int(text[i]);
for (byte j=0;j<7;j++){
vertPixels=pgm_read_byte(&(font7let[n][j]));
if ((j==0)||(vertPixels>0)||((n==27)&&(j<6))){//только первая колонка, не пустые колонки и исключения буквы Ы
getPixel (vertPixels, startY, color);
}
if (curX>=MATRIX_WIDTH) {
break;
}
}
curX++;
if (curX>=MATRIX_WIDTH) {
break;
}
}
else {
isRusLetter=true;
}
}
}
}
void runText(String text, byte startY, uint32_t color, int speedText){//вывод бегущей строки
int i;
byte n;
bool isRusLetter=false;
byte vertPixels;
curY=startY;
curX=startRunLineX;
FastLED.clear();
int l=0;
for (i=0;i<text.length();i++){
if (int(text[i])>0){
n=fontNumStr.indexOf(text[i]);
for (byte j=0;j<4;j++){
vertPixels=pgm_read_byte(&(font7num[n][j]));
if ((j==0)||(vertPixels>0)){//только первая колонка и не пустые колонки
if ((l>=lineStart)&&(l<=lineFin)){
getPixel (vertPixels, startY, color);
}
l++;
}
if (j==3){//в конце каждого символа добавляем пробел
if ((l>=lineStart)&&(l<=lineFin)){
curX++;
}
l++;
}
}
}
else {
if (isRusLetter==true){
isRusLetter=false;
n=112+int(text[i]);
for (byte j=0;j<7;j++){
vertPixels=pgm_read_byte(&(font7let[n][j]));
if ((j==0)||(vertPixels>0)||((n==27)&&(j<6))){//только первая колонка, не пустые колонки или буква Ы
if ((l>=lineStart)&&(l<=lineFin)){
getPixel (vertPixels, startY, color);
}
l++;
}
if (j==6){//в конце каждого символа добавляем пробел
if ((l>=lineStart)&&(l<=lineFin)){
curX++;
}
l++;
}
}
}
else {
isRusLetter=true;
}
}
}
lineFin++;
if (lineFin>=MATRIX_WIDTH) {
lineStart++;
}
if (startRunLineX>0){//каждый кадр смещаем начало отрисовки бегущей строки на 1 пиксель влево от правого края матрицы
startRunLineX--;
}
if (lineStart>l){//воспроизводим с начала
l=0;
lineStart=0;
lineFin=0;
startRunLineX=MATRIX_WIDTH-1;
}
FastLED.show();
delay(speedText);
}
Алфавит:
const uint8_t font7num[][4] PROGMEM = {
{0x7C,0x82,0x82,0x7C}, //0
{0x40,0xFE,0x00,0x00}, //1
{0x46,0x8A,0x92,0x62}, //2
{0x44,0x82,0x92,0x6C}, //3
{0x18,0x28,0x48,0xFE}, //4
{0xF4,0xA2,0xA2,0x9C}, //5
{0x7C,0x92,0x92,0x4C}, //6
{0x80,0x8E,0xB0,0xC0}, //7
{0x6C,0x92,0x92,0x6C}, //8
{0x64,0x92,0x92,0x7C}, //9
{0x0,0x0,0x0,0x0}, //
{0xFA,0x0,0x0,0x0}, //!
{0x3,0x0,0x0,0x0}, //,
{0x2,0x0,0x0,0x0}, //.
{0x22,0x0,0x0,0x0}, //:
{0x23,0x0,0x0,0x0}, //;
{0x40,0x9A,0x90,0x60}, //?
};
const uint32_t font7let[][7] PROGMEM = {
{0x1E,0x68,0x88,0x68,0x1E,0x0,0x0}, //А
{0xFE,0x92,0x92,0xC,0x0,0x0,0x0}, //Б
{0xFE,0x92,0x92,0x7C,0x0,0x0,0x0}, //В
{0xFE,0x80,0x80,0x80,0x0,0x0,0x0}, //Г
{0x3,0x6,0xFA,0x82,0x82,0xFE,0x3}, //Д
{0xFE,0x92,0x92,0x92,0x92,0x0,0x0}, //Е
{0xC6,0x28,0x10,0xFE,0x10,0x28,0xC6}, //Ж
{0x44,0x82,0x92,0x6C,0x0,0x0,0x0}, //З
{0xFE,0xC,0x30,0x40,0xFE,0x0,0x0}, //И
{0xFE,0xC,0x90,0x20,0xFE,0x0,0x0}, //Й
{0xFE,0x10,0x6C,0x82,0x0,0x0,0x0}, //К
{0x2,0xFC,0x80,0x80,0xFE,0x0,0x0}, //Л›
{0xFE,0x60,0x10,0x8,0x10,0x60,0xFE}, //М
{0xFE,0x10,0x10,0x10,0xFE,0x0,0x0}, //Н
{0x7C,0x82,0x82,0x82,0x7C,0x0,0x0}, //О
{0xFE,0x80,0x80,0x80,0xFE,0x0,0x0}, //П
{0xFE,0x90,0x90,0xF0,0x0,0x0,0x0}, //Р
{0x7C,0x82,0x82,0x82,0x44,0x0,0x0}, //С
{0x80,0x80,0xFE,0x80,0x80,0x0,0x0}, //Т
{0xC2,0x32,0xC,0x30,0xC0,0x0,0x0}, //У
{0x38,0x44,0xFE,0x44,0x38,0x0,0x0}, //Ф
{0x82,0x6C,0x10,0x6C,0x82,0x0,0x0}, //Х
{0xFE,0x2,0x2,0x2,0xFE,0x3,0x0}, //Ц
{0xF0,0x8,0x8,0xFE,0x0,0x0,0x0}, //Ч
{0xFE,0x2,0x2,0xFE,0x2,0x2,0xFE}, //Ш
{0xFE,0x2,0x2,0xFE,0x2,0x2,0xFF}, //Щ
{0x80,0xFE,0x12,0x12,0xC,0x0,0x0}, //Ъ
{0xFE,0x12,0x12,0xC,0x0,0xFE,0x0}, //Ы
{0xFE,0x12,0x12,0xC,0x0,0x0,0x0}, //Ь
{0x44,0x92,0x92,0x7C,0x0,0x0,0x0}, //Э
{0xFE,0x10,0x7C,0x82,0x82,0x82,0x7C}, //Ю
{0x66,0x98,0x90,0x90,0xFE,0x0,0x0}, //Я
};
Определения:
#define NUM_LEDS 256
#define MATRIX_WIDTH 16
#define MATRIX_HEIGHT 16
#define BRIGHTNESS 30
//константы и переменные для работы с текстом
const String fontNumStr="0123456789 !,.:;?";
const String fontLetStr="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
uint16_t curPixel;
uint8_t curX;
uint8_t curY;
CRGB leds[NUM_LEDS];
//переменные для работы с бегущей строкой
uint16_t lineStart=0;//с какого столбца строки начинаем вопроизведение текста
uint16_t lineFin=0;//каким столбцом строки заканчиваем вопроизведение текста
uint8_t startRunLineX=MATRIX_WIDTH-1;//столбец X начала отрисовки бегущей строки