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

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-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 пользователей онлайн

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

  • Сообщения

    • Да ну нафиг! Это как "раз поехали на рыбалку, а водку забыли...."
    • Похоже вас угораздило на латералы попасть. Они сами себя стабилизируют и никакой дополнительной стабилизации им не нужно. У меня двухкиловаттные Крафты так на металлических Эксиконах работают даже без "эмиттерных" резисторов. Тупо впараллель.
    • @korsaj Попробовал записать код в разных вариантах предложенных тобой. Первый вариант вообще отказался работать. Заработал второй вариант на приём. Теперь уже хотя бы есть полноценный приём. char i = 0; if (rx_buf[i] == 'M'){ i++; if (rx_buf[i] == '1') { //unsigned int n = getDecFromHexStr(rx_buf, i+2); //Выводим на экран номер текущего трека LED_1_ON(); LED_2_OFF(); send_UART('M'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); flags = 0; } else if (rx_buf[i] == '2') { //unsigned int n = getDecFromHexStr(rx_buf, i+2); //Выводим на экран количество треков LED_1_OFF(); LED_2_ON(); send_UART('M'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); flags = 0; } else if (rx_buf[i] == 'T') { //unsigned int n = getDecFromHexStr(rx_buf, i+2); //Выводим на экран общее время трека LED_1_ON(); LED_2_ON(); send_UART('M'); send_UART('T'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); flags = 0; } else if (rx_buf[i] == 'K') { //unsigned int n = getDecFromHexStr(rx_buf, i+2); //Выводим на экран текущее время трека LED_1_OFF(); LED_2_OFF(); send_UART('M'); send_UART('K'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); flags = 0; } } Но однако есть ещё некоторые вещи которые нужно подкорректировать. Пока я просто разбираю UART поэтому на терминал вывожу так сказать ответ ну и просто видеть потому как индикатора к микре не подключено пока что. Однако такой вариант с ответкой нужен будет мне и для другого проекта где UART лучше всего подойдёт. Это я уже смотрю на будущее. Но тут тоже когда приходит комманда по  UART микроконтроллер отправляет ответ, но он начинает постоянно спамится. Нужно как то сделать чтоб этого не происходило. Я же в свою очередь пробовать сбросить flags = 0;, но это никак не помогло. Может чего подскажешь тут понятно что нужно как то будет обнулить данные чтобы выйти из этого условия программы. Есть вот такая проблемка. И ещё есть одна проблема с строкой  unsigned int n = getDecFromHexStr(rx_buf, i+2); Не спроста я её отключил в коде с помощью комментария. А тут проблема в том что студия не может опзнать этот код. Возможно нужно что подключить из встроенных библиотек самой студии.
    • Зачем закладываться на максимальный ток стабилитрона? Поставьте по два двухкилоомных последовательно или возможно 3-5 килоома что то есть.
    • Здравствуйте. В эту магнитолу захотелось установить модуль блютуз. Вроде бы проблем нет, да? Привод CD выкинут как рудимент,- на нём драйвер сгорел (не хорошие инженеры, на огромной линейке моделей подложили бяку-серво двигатель и на нём платка переходник для распайки на плату обработки, только вот двигатель болтается в пластике посадочном убивая пайку делая плохое самочувствие драйверу-привода-лазера))). Вот. Проблемы начинаются следующие. Тюнер имеет мозги аудиопроцессору по цифре,-отпадает. Разъёма чейнджера нет но есть вся разводка без обвязки,-восстановление мелочи (стаб-рез) и эмуляция подключенного чейнджера не помогает, странно Kasuga Radio Co. Ltd. (это ирония про 1946 год) сэкономила на программном обеспечении . Ага. Подключится на вход УМЗЧ-пошло и глупо. Вопрос. Есть варианты подключить? kenwood_kdc-4590.pdf
    • А здесь всё о том как и чем делать ...
    • "Приходит мужик в магазин одежды, чтоб подобрать себе шляпу. Надевает первую попавшуюся, а она ему - как раз." А вообще не понятно. Он ему дает говорить, даже матюкаться, а анекдот не дает рассказать. Почему? (сори, если вопрос тупой, я просто не в теме радиосвязи и радиохулиганства)
×
×
  • Создать...