Перейти к содержанию

max7219 матрица и avr , перевернуть символы


artos5

Рекомендуемые сообщения

А вообще, если хочешь полный контроль над матрицами, как один целый экран - создай функцию отрисовки точки по определённым координатам. Тогда уже хоть символы, хоть что угодно и куда угодно сможешь выводить.

Только что, 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;
}
/***********************************************************************************************************************************/

 

Может помогут.

Ссылка на комментарий
Поделиться на другие сайты

Что то не вкурю как выполнить запись в экран по координатам x y ... У кого есть пример??

Вот у меня есть массив (буфер) экрана 8*4 байт как в нем отрисовывать символы ?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

и ты не в состоянии в этом массиве найти координату каждого бита (пикселя)???

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Да я то в состоянии найти координату , моя задача вывести символ . Основная сложность - оформление этого всего в библиотеку для универсальности .

Alex , спасибо за код!!! Сейчас попробую.

14 часа назад, Alex сказал:

Может помогут

А есть у тебя зта функция?

Set_Pixel(x_cursor+j, y_cursor+j2, tmp&(1<<a));

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В общем разобрался с выводом символа на экран . Написал свои функции , так как чужие функции не завелись . Сейчас выводится буква по нужному адресу :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

3 часа назад, artos5 сказал:

А есть у тебя зта функция?

Set_Pixel(x_cursor+j, y_cursor+j2, tmp&(1<<a));

Дак это - обычная отрисовка пикселя. Аргументы - координаты x и y + значение пикселя.

Ссылка на комментарий
Поделиться на другие сайты

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); 

Не вкурю как его крутить теперь .... кто подскажет?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Попробуй реализовать вывод с координатами, выходящие за рамки дисплея. Например, чтобы :

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 ? :)

Ссылка на комментарий
Поделиться на другие сайты

Что то не совсем понятно ..

Вот тут я строку передаю;

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++;
}

}

как зто реализовать ?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Первое, что брасается в глаза - постоянный пересчёт координат. Создай в модуле статические переменные, например x_pos и y_pos. И тогда их не нужно будет всегда пересчитывать, только при изменнении координат.
Далее, создай функцию установки курсора в соответствующую координату.
А при прорисовки символа, просто инкрементируй координату и всё.

На мой взгляд, у тебя сейчас всё реализовано как-то не очень, что-ли. От этого и "связаны руки" с манипуляциями.

Ссылка на комментарий
Поделиться на другие сайты

30 минут назад, Alex сказал:

называется string ? :)

Да сначала обозвал , так как хотел строку загнать , потом решил хотелки снизить и отсылать сначала символ , а переименовать влом :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Давай ещё немного попробуем упростить функцию  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;

Красивей, не правда ли ? :)

Изменено пользователем Alex
Ссылка на комментарий
Поделиться на другие сайты

Спасибо! Классный код !

Так а как теперь сдвигать передаваемый текст на пиксель ? 

Пока вообще не вкурю :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

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;
} 
}

Оптимизацией потом займёшься.

Ссылка на комментарий
Поделиться на другие сайты

20 минут назад, Alex сказал:

И функцию занесения в них значений :


void matrix_set_pos(int x, int y){
  x_pos=x;
  y_pos=y;
}

Не пойму зачем она ...

Если x_pos , y_pos нигде дальше не используются ..

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Далее, вывод символа.

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);

Пробуем :)

Ссылка на комментарий
Поделиться на другие сайты

38 минут назад, Alex сказал:

Пробуем :)

Попробовал - не работает . Буква первая выводится перевернутой на 90град. и мигает ))

Ща буду разбираться что не так.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Что-то с 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;

 

?

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, Alex сказал:

?

Нет.

И неправильно  работает set_pixel

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Вот что то тут не так :

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;
}

Но у меня от циклов уже каша в голове )))

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Только что, artos5 сказал:

Вот что то тут не так :

Почему так думаешь ?
Попробуй просто повыводить пикселы.

Скорее всего, проблема в функции вывода пиксела.

Смена координат местами что дала ?

Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, Alex сказал:

Попробуй просто повыводить пикселы.

Cделал так 

matrix_set_pixel(3, 3, 1);

получил по иксу 5 пиксел по игрику 3й

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...