Alex Опубликовано 13 декабря, 2017 Поделиться Опубликовано 13 декабря, 2017 А вообще, если хочешь полный контроль над матрицами, как один целый экран - создай функцию отрисовки точки по определённым координатам. Тогда уже хоть символы, хоть что угодно и куда угодно сможешь выводить. Только что, artos5 сказал: А есть у тебя готовый массив символов? 5х7 :font5x7.h Методы, выводящие символы/строки : Скрытый текст /***********************************************************************************************************************************/ Image& Image::Putc(unsigned char c, unsigned char size){ unsigned char i, a, tmp, start=0, end=5, j, j2; if(c=='\n'){ x_cursor=0; y_cursor+=8*size; return *this; } if((c<32)) c=32; c-=32; if(!Font5x7[c][0] && !Font5x7[c][1]) start=1; if(!Font5x7[c][4] && !Font5x7[c][3]) end=4; if(!c) start=2; // Если пробел, то -1 for(i=start; i<end; i++){ tmp=Font5x7[c][i]; for(a=0; a<7; a++){ //----------------------------- for(j2=0; j2<size; j2++) for(j=0; j<size; j++){ Set_Pixel(x_cursor+j, y_cursor+j2, tmp&(1<<a)); } //----------------------------- y_cursor+=size; } y_cursor-=7*size; x_cursor+=size; } x_cursor+=size; return *this; } /***********************************************************************************************************************************/ Image& Image::Puts_XY(unsigned char x_pos, unsigned char y_pos, const char* s, unsigned char size){ Goto_XY(x_pos, y_pos); Puts(s, size); return *this; } /***********************************************************************************************************************************/ Image& Image::Putc_XY(unsigned char x_pos, unsigned char y_pos, unsigned char c, unsigned char size){ Goto_XY(x_pos, y_pos); Putc(c, size); return *this; } /***********************************************************************************************************************************/ Image& Image::Goto_XY(unsigned char x_pos, unsigned char y_pos){ x_cursor=x_pos; y_cursor=y_pos; return *this; } /***********************************************************************************************************************************/ Image& Image::Puts(const char* s, unsigned char size){ while(*s) Putc(*s++, size); return *this; } /***********************************************************************************************************************************/ Может помогут. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 Что то не вкурю как выполнить запись в экран по координатам x y ... У кого есть пример?? Вот у меня есть массив (буфер) экрана 8*4 байт как в нем отрисовывать символы ? 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Starichok Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 и ты не в состоянии в этом массиве найти координату каждого бита (пикселя)??? 0 Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду. Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 Да я то в состоянии найти координату , моя задача вывести символ . Основная сложность - оформление этого всего в библиотеку для универсальности . Alex , спасибо за код!!! Сейчас попробую. 14 часа назад, Alex сказал: Может помогут А есть у тебя зта функция? Set_Pixel(x_cursor+j, y_cursor+j2, tmp&(1<<a)); 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 В общем разобрался с выводом символа на экран . Написал свои функции , так как чужие функции не завелись . Сейчас выводится буква по нужному адресу 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 3 часа назад, artos5 сказал: А есть у тебя зта функция? Set_Pixel(x_cursor+j, y_cursor+j2, tmp&(1<<a)); Дак это - обычная отрисовка пикселя. Аргументы - координаты x и y + значение пикселя. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 void xy_max7219(char x , char y, char char_) { //x = x*4; // количество микросхем // y // точка по горизонтали максимум 8*4 = 32 пикселя (бит) char b=0, c=0; b=char_; if(y<8) { if(char_)data[x*4]|=1<<(7-y); else data[x*4]&=~1<<(7-y); } else if(y<16) { if(char_)data[x*4+1]|=1<<(7-(y-8)); else data[x*4+1]&=~1<<(7-(y-8)); } else if(y<24) { if(char_)data[x*4+2]|=1<<(7-(y-16)); else data[x*4+2]&=~1<<(7-(y-16)); } else if(y<32) { if(char_)data[x*4+3]|=1<<(7-(y-24)); else data[x*4+3]&=~1<<(7-(y-24)); } for(a=0; a<8; a++) { z= a*4; CS0; led_out(a+1, data[z]); led_out(a+1, data[z+1]); led_out(a+1, data[z+2]); led_out(a+1, data[z+3]); CS1; } } void string(char char_, char pos) { char y=0, x=0; for(y=0; y<8; y++) { for(x=0; x<5; x++) { if(Font5x7[char_][x]&(1<<y))xy_max7219(y, x+pos, 1); else xy_max7219(y, x+pos, 0); } } } void string(char char_, char pos) { char y=0, x=0; for(y=0; y<8; y++) { for(x=0; x<5; x++) { if(Font5x7[char_][x]&(1<<y))xy_max7219(y, x+pos, 1); else xy_max7219(y, x+pos, 0); } } void string_out(char *char_,char pos_) { char y=0, x=0; char_+=0; while(char_[x]!=0) { string((char_[x]-48+16), (pos_ + x*6)); x++; } } В общем написал функции которые выводят текст на зкран. Вот так: string_out_sh("Тест программы! Test programm!", 0, 0, 18); Не вкурю как его крутить теперь .... кто подскажет? void xy_max7219(char x , char y, char char_) { //x = x*4; // количество микросхем // y // точка по горизонтали максимум 8*4 = 32 пикселя (бит) char b=0, c=0; b=char_; if(y<8) { if(char_)data[x*4]|=1<<(7-y); else data[x*4]&=~1<<(7-y); } else if(y<16) { if(char_)data[x*4+1]|=1<<(7-(y-8)); else data[x*4+1]&=~1<<(7-(y-8)); } else if(y<24) { if(char_)data[x*4+2]|=1<<(7-(y-16)); else data[x*4+2]&=~1<<(7-(y-16)); } else if(y<32) { if(char_)data[x*4+3]|=1<<(7-(y-24)); else data[x*4+3]&=~1<<(7-(y-24)); } for(a=0; a<8; a++) { z= a*4; CS0; led_out(a+1, data[z]); led_out(a+1, data[z+1]); led_out(a+1, data[z+2]); led_out(a+1, data[z+3]); CS1; } } void string(char char_, char pos) { char y=0, x=0; for(y=0; y<8; y++) { for(x=0; x<5; x++) { if(Font5x7[char_][x]&(1<<y))xy_max7219(y, x+pos, 1); else xy_max7219(y, x+pos, 0); } } } void string(char char_, char pos) { char y=0, x=0; for(y=0; y<8; y++) { for(x=0; x<5; x++) { if(Font5x7[char_][x]&(1<<y))xy_max7219(y, x+pos, 1); else xy_max7219(y, x+pos, 0); } } void string_out(char *char_,char pos_) { char y=0, x=0; char_+=0; while(char_[x]!=0) { string((char_[x]-48+16), (pos_ + x*6)); x++; } } В общем написал функции которые выводят текст на зкран. Вот так: string_out_sh("Тест программы! Test programm!", 0, 0, 18); Не вкурю как его крутить теперь .... кто подскажет? 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 Попробуй реализовать вывод с координатами, выходящие за рамки дисплея. Например, чтобы : string_out("Тест программы! Test programm!", -100); при выводе, просто игнорировались запредельные координаты. Тогда, манипулируя так координатой, можно выводить часть текста. У тебя код какой-то запутанный. Тяжело въехать, что в нём происходит Вот это : void string(char char_, char pos) { char y=0, x=0; for(y=0; y<8; y++) { for(x=0; x<5; x++) { if(Font5x7[char_][x]&(1<<y))xy_max7219(y, x+pos, 1); else xy_max7219(y, x+pos, 0); } } по всей видимости, вывод символа. Почему называется string ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 Что то не совсем понятно .. Вот тут я строку передаю; void string_out(char *char_,char pos_) { char y=0, x=0; char_+=0; while(char_[x]!=0) { string((char_[x]-48+16), (pos_ + x*6)); x++; } } как зто реализовать ? 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 Первое, что брасается в глаза - постоянный пересчёт координат. Создай в модуле статические переменные, например x_pos и y_pos. И тогда их не нужно будет всегда пересчитывать, только при изменнении координат. Далее, создай функцию установки курсора в соответствующую координату. А при прорисовки символа, просто инкрементируй координату и всё. На мой взгляд, у тебя сейчас всё реализовано как-то не очень, что-ли. От этого и "связаны руки" с манипуляциями. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 30 минут назад, Alex сказал: называется string ? Да сначала обозвал , так как хотел строку загнать , потом решил хотелки снизить и отсылать сначала символ , а переименовать влом 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 (изменено) Давай ещё немного попробуем упростить функцию xy_max7219 Код : if(y<8) { if(char_)data[x*4]|=1<<(7-y); else data[x*4]&=~1<<(7-y); } else if(y<16) { if(char_)data[x*4+1]|=1<<(7-(y-8)); else data[x*4+1]&=~1<<(7-(y-8)); } else if(y<24) { if(char_)data[x*4+2]|=1<<(7-(y-16)); else data[x*4+2]&=~1<<(7-(y-16)); } else if(y<32) { if(char_)data[x*4+3]|=1<<(7-(y-24)); else data[x*4+3]&=~1<<(7-(y-24)); } имеет схожие элементы и каждое условие отличается друг от друга только смещением в массиве и модулем по 8-ми в сдвиге. Попробуй сделать так : if(char_)data[x*4+(y/8-1)]|=1<<(7-y%8); else data[x*4+(y/8-1)]&=~1<<(7-y%8); без всяких условий. А лучше сделать так : unsigned char offset = x*4+(y/8-1); unsigned char mask = 1<<(7-y%8); if(char_) data[offset]|=mask; else data[offset]&=~mask; Красивей, не правда ли ? Изменено 14 декабря, 2017 пользователем Alex 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 Спасибо! Классный код ! Так а как теперь сдвигать передаваемый текст на пиксель ? Пока вообще не вкурю 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 20 минут назад, artos5 сказал: Так а как теперь сдвигать передаваемый текст на пиксель ? Пока ещё никак Давай по-порядку... Создавай 2 переменные, в которых будут храниться координаты : static int x_pos, y_pos; И функцию занесения в них значений : void matrix_set_pos(int x, int y){ x_pos=x; y_pos=y; } Далее, функция вывода точки : void matrix_set_pixel(int x , int y, char val){ unsigned char a, z; unsigned char offset = x*4+(y/8-1); unsigned char mask = 1<<(7-y%8); if(val) data[offset]|=mask; else data[offset]&=~mask; for(a=0; a<8; a++){ z=a*4; CS0; led_out(a+1, data[z]); led_out(a+1, data[z+1]); led_out(a+1, data[z+2]); led_out(a+1, data[z+3]); CS1; } } Оптимизацией потом займёшься. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 20 минут назад, Alex сказал: И функцию занесения в них значений : void matrix_set_pos(int x, int y){ x_pos=x; y_pos=y; } Не пойму зачем она ... Если x_pos , y_pos нигде дальше не используются .. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 Далее, вывод символа. void matrix_putc(unsigned char ch){ unsigned char i, a, tmp; for(i=0; i<5; i++){ tmp=Font5x7[ch][i]; for(a=0; a<7; a++){ matrix_set_pixel(x_pos , y_pos, tmp&(1<<a)); y_pos+=1; } y_pos-=7; x_pos+=1; } x_pos+=1; } Блин, плохо писать вслепую и в форумном редакторе Проверяем : matrix_set_pos(5,5); matrix_putc('A'); 26 минут назад, artos5 сказал: Если x_pos , y_pos нигде дальше не используются .. Они будут использоваться. Дело в том, что правильнее всегда держать в памяти текущую позицию курсора и уже относительно её выводить данные на экран. Это позволит выводить текст символ за символом, не пересчитывая постоянно координаты, а просто их смещая на нужную позицию. Дальше вообще всё просто. Как кубики складываешь. Функция вывода строки : void matrix_puts(const char *str){ while(*str) matrix_putc(*str++); } Вывод строки по координатам : void matrix_puts_xy(int x, int y, const char *str){ matrix_set_pos(x, y); matrix_puts(str); } Итог : /* matrix.c */ static int x_pos, y_pos; static void matrix_set_pixel(int x , int y, char val){ unsigned char a, z; unsigned char offset = x*4+(y/8-1); unsigned char mask = 1<<(7-y%8); if(val) data[offset]|=mask; else data[offset]&=~mask; for(a=0; a<8; a++){ z=a*4; CS0; led_out(a+1, data[z]); led_out(a+1, data[z+1]); led_out(a+1, data[z+2]); led_out(a+1, data[z+3]); CS1; } } void matrix_set_pos(int x, int y){ x_pos=x; y_pos=y; } void matrix_putc(unsigned char ch){ unsigned char i, a, tmp; for(i=0; i<5; i++){ tmp=Font5x7[ch][i]; for(a=0; a<7; a++){ matrix_set_pixel(x_pos , y_pos, tmp&(1<<a)); y_pos+=1; } y_pos-=7; x_pos+=1; } x_pos+=1; } void matrix_puts(const char *str){ while(*str) matrix_putc(*str++); } void matrix_puts_xy(int x, int y, const char *str){ matrix_set_pos(x, y); matrix_puts(str); } /* matrix.h */ extern void matrix_set_pos(int x, int y); extern void matrix_putc(unsigned char ch); extern void matrix_puts(const char *str); extern void matrix_puts_xy(int x, int y, const char *str); Пробуем 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 38 минут назад, Alex сказал: Пробуем Попробовал - не работает . Буква первая выводится перевернутой на 90град. и мигает )) Ща буду разбираться что не так. 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 Что-то с matrix_set_pixel не то... Попробуй поменять местами координаты: void matrix_set_pixel(int y , int x, char val){ ........ ......... ......... Блин, тяжело так, без железа ... А вот это изменение, вообще, заработало : 1 час назад, Alex сказал: unsigned char offset = x*4+(y/8-1); unsigned char mask = 1<<(7-y%8); if(char_) data[offset]|=mask; else data[offset]&=~mask; ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 7 минут назад, Alex сказал: ? Нет. И неправильно работает set_pixel 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 Такс, давай разбираться... Закинь в функцию matrix_set_pixel свой код вывода пиксела, который работал. И проверь. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 Вот что то тут не так : void matrix_putc(unsigned char ch){ unsigned char i, a, tmp; for(i=0; i<5; i++){ tmp=Font5x7[ch][i]; for(a=0; a<7; a++){ matrix_set_pixel(x_pos , y_pos, tmp&(1<<a)); y_pos+=1; } y_pos-=7; x_pos+=1; } x_pos+=1; } Но у меня от циклов уже каша в голове ))) 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 Только что, artos5 сказал: Вот что то тут не так : Почему так думаешь ? Попробуй просто повыводить пикселы. Скорее всего, проблема в функции вывода пиксела. Смена координат местами что дала ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 6 минут назад, Alex сказал: Попробуй просто повыводить пикселы. Cделал так matrix_set_pixel(3, 3, 1); получил по иксу 5 пиксел по игрику 3й 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 декабря, 2017 Поделиться Опубликовано 14 декабря, 2017 Ну вот, что-то в этой функции не то. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 14 декабря, 2017 Автор Поделиться Опубликовано 14 декабря, 2017 и еще в конце зкрана вывелось... 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.