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

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

 

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

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

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

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

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

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

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

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

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

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

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

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

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

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

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

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 пользователей онлайн

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

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