Easyelectronics.ru

Электроника для всех
Текущее время: 06 дек 2019, 02:46

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос по Шрифтам на графический дисплей.
СообщениеДобавлено: 21 мар 2019, 03:07 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1138
Привет!

Делал счетчик ленты c дисплеем на контроллере ST7558 (i2c)
Заказчик попросил увеличить шрифт.
Шрифт стоял стандартный 8x5 пикселей.
Преобразовал виндовый шрифт 16x12 пикселей, и тут появился подводный камешек:

Адресация у дисплея идет строчками, высота строки 8 пикселей, всего в строке 96 точек (16 байт)

Вывод данных на дисплей командой 40.xx.xx.xx.xx.xx.xx....... (вывод идет в одну строчку) как только дошли до конца, осуществляется переход на следующую строку.

Для того чтобы мне вывести шрифт нужно использовать 2 строки и вот тут то я и завис.

Дело в том, что курсор ставится в позицию специальной командой 00.30.80+x.40+y. где (x= 0..95, y =0..7)
При попытке вывести данные получается следующая каша:
я вывожу верхнюю половину символа, затем мне нужно перевести курсор на следующую строчку, вернуть курсор в стартовую позицию и вывести вторую половину символа.

Может быть есть у кого то реализация подобного ?
pS/
У меня строчки пляшут, из за того что уплывают половинки символов на разных строках.
По одному символу вывожу все нормально.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по Шрифтам на графический дисплей.
СообщениеДобавлено: 21 мар 2019, 03:12 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6307
У некоторых контроллеров, кроме стандартного (по строке) есть режим вертикального перемещения (по столбцам). Причем, там ограничивается верхняя и нижняя строчки, между которыми "бегает". Т.о., если выставить вертикальный режим для двух строк, то, как раз и выйдет потоковая запись символов х16.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по Шрифтам на графический дисплей.
СообщениеДобавлено: 21 мар 2019, 07:32 
Старожил
Аватара пользователя

Зарегистрирован: 13 дек 2010, 23:15
Сообщения: 2077
Откуда: Киев
Что-то не совсем понятно как у вас хранение данных символа сделано. Типа сначала верхняя половина, затем нижняя?
Так вроде нет проблем написать цикл,который будет это учитывать, так-как ширина символа извесна.
По готовой реализации можно покурить например https://bitbucket.org/bperrybap/openglcd/wiki/Home, но там либа монструозная.
Еще видел где-то универсальную реализицаю, с поточечным выводом, но работает оно тормознуто.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по Шрифтам на графический дисплей.
СообщениеДобавлено: 21 мар 2019, 08:14 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3793
Создайте в ОЗУ МК промежуточный буфер на две строки дисплея, заполните его шрифтом, и потом за раз выведите буфер в дисплей.
Либо каждый символ выводите в два приема - верхнюю и нижнюю его половины. А что тут такого? Всё нормально.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по Шрифтам на графический дисплей.
СообщениеДобавлено: 21 мар 2019, 14:24 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1138
Спасибо за подсказки !

В общем решил не ломать себе голову, заказчик попросил только цифры, ну вот он их и получил :)
Код:
const unsigned char  dig1216[]  =                                  {//digits big font
0,0,248,254,6,131,195,99,51,30,254,248,0,0,7,31,27,49,48,48,48,24,31,7,      // 0
0,0,0,12,12,14,255,255,0,0,0,0,0,0,0,48,48,48,63,63,48,48,48,0,              // 1
0,0,28,30,7,3,131,195,227,119,62,28,0,0,56,60,62,55,51,49,48,48,48,48,       // 2
0,0,12,14,7,195,195,195,195,231,126,60,0,0,12,28,56,48,48,48,48,57,31,14,    // 3
0,0,192,224,112,56,28,14,255,255,0,0,0,0,7,7,6,6,6,6,63,63,6,6,              // 4
0,0,120,127,103,99,99,99,99,227,195,131,0,0,12,28,56,48,48,48,48,56,31,15,   // 5
0,0,192,240,248,220,206,199,195,195,128,0,0,0,15,31,57,48,48,48,48,57,31,15, // 6
0,0,3,3,3,3,3,195,243,63,15,3,0,0,0,0,48,60,15,3,0,0,0,0,                    // 7
0,0,0,188,254,231,195,195,231,254,188,0,0,0,15,31,57,48,48,48,48,57,31,15,   // 8
0,0,60,126,231,195,195,195,195,231,254,252,0,0,0,48,48,48,56,28,14,7,3,0,    // 9
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,56,56,0,0,0,0                  // .
};

void LCD_PrintBig(long value, char xx,char yy)                      {// Print Dec
   
    char i, d, dp,j;
    unsigned char text[10];
            
      dp =3; // decimal point position
    i= 5;
      
      do
        {
       if (i == dp) text[i] = 10; // place decimal point
       else
          {
            if (value == 0)
             {
              if (i >= dp - 1) 
                        text[i] = 0; // place zero
              else   
                        text[i] = 0; // place leading space
             }
            else
             {
              d = value % 10; // least significant digit
              text[i] = d; // make ASCII char and put into text
              value /= 10; // "decimal right shift" -- divide by ten
             }
          }
           i--;
        }
         while(i);

//--------------------------------------------------------------------
   i=1;d=1;
   
         I2C_Start();I2C_write(0x00);I2C_write(0x30);
          I2C_write(0x80 | 1+xx*13);                 //(0...8 Colls
       I2C_write(0x40 | yy);                         //(0...7 - Rows)
       I2C_Stop();
   do
   {
       I2C_Start();
     I2C_write(0x40);
     for(j=0; j<12; j++)
     {
       I2C_write(dig1216[(text[i])*24+j]);
       }
       I2C_Stop();
      i++;
   }
   while(i<6);
   
          I2C_Start();I2C_write(0x00);I2C_write(0x30);
       I2C_write(0x80 | 1+xx*13);                              //(0...8 Colls
       I2C_write(0x40 | yy +1);                                  //(0...7 - Rows)
       I2C_Stop();
   
   do
   {
       I2C_Start();
     I2C_write(0x40);
     for(j=12; j<24; j++)
     {
       I2C_write(dig1216[(text[d])*24+j]);
       }
       I2C_Stop();
      d++;
   }
   while(d<6);
   
}


В общем выводится сначала верхняя строчка (половинки цифр) потом нижние :)
Зато прорисовка быстрей чем с каждой цифрой мучатся :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB