Страница 1 из 1

Перевести из одного формата в другой

Добавлено: Ср май 13, 2009 19:41:15
ipkin
имеется устройство отображения инфо.
жк-дисплей сегментный (производитель неизвестен заказной)
для управления этим жк-дисплеем используется контроллер lc75874.
с управлением и выводом на дисплей инфы разобрался (вызвонил каждый сегмент).

задача: нужно данные которые приходили на этот контроллер преобразовать легко читаемый формат.
допустим 1=31h для вывода на другой индикатор(например на чипе HD44780)
вот к примеру чтобы на дисплее получить символ "В" нужно отправить на контроллер следующую посылку: 00000101 01110010 00010000
общая длина информационного слова без служебных команд 264 бита
посоветуйте способы преобразования

Добавлено: Ср май 13, 2009 21:01:15
DrWatson
Я с дисплеем от панели магнитолы на контроллере lc7582 делал так: разбил всю посылку на группы от 3 до 8 бит, под каждую группу свой байт. Там где 7-сегментники подогнал чтоб на каждый байт приходился один разряд. Всякие иконки и т.п. получились как получились. Потом выводил все биты последовательно из каждой группы. Не оптимально, зато работает.
Примерно так:

Код: Выделить всё

void LCD_WriteBuffer()
{
   char n;
#asm("cli")
   LCDCEBIT=1;
   LCD_Wait(2);
   LCD_WriteBits(LCDIcon[0],0,2); // Два бита - иконки
   LCD_WriteByte(LCDSmall[0]);   // Маленькая цифра
   LCD_WriteBits(LCDIcon[0],2,6);// 6 бит иконки
   LCD_WriteByte(LCDLine[0]);    // Иконки настройка
   LCD_WriteByte(LCDLine[1]);   // Иконки настройка
   LCD_WriteBits(LCDIcon[1],0,4);//4 бит иконки
   LCD_WriteByte(LCDSmall[1]);  // Вторая маленькая цифра
   LCD_WriteBits(LCDSmall[2],0,6);//Третья маленькая цифра 6 бит
   LCD_WriteBits(LCDSmall[3],0,3);//Четвертая малая цифра 3 бита
   LCD_WriteBits(1,0,3);                // Переход на вторую страницу
   LCD_Wait(2);
   LCDDATABIT=0;
   LCDCEBIT=0;
   LCD_Wait(8);
   LCDCEBIT=1;
   LCD_Wait(2);
   LCD_WriteBits(LCDSmall[3],3,4);//Продолжение 4 малой цифры 4 бита
   for(n=0;n<4;n++) LCD_WriteByte(LCDBig[n]); // 4 большие цифры
   LCD_WriteDummy(17); // 17 Неиспользуемых бит
   LCD_WriteBits(4,0,3); // Управляющие биты
   LCDDATABIT=0;
   LCD_Wait(2);
   LCDCEBIT=0;  // Завершение записи
#asm("sei")
}

Добавлено: Чт май 14, 2009 06:59:56
ipkin
спасибо за ответ.
но в вашем примере вы управляете нестандартным индикатором , а я хочу посылку данных которая шла на контроллер управления нестандартным индикатором перевести в посылку для более распространённых индиков.
в моём случае одно знакоместо может располагаться в двух полубайтах и одном байте вот к примеру
00000101 01110010 00010000
---- ---------- -----

одно знакоместо состоит из 14-ти сегментов

Добавлено: Чт май 14, 2009 10:44:59
DrWatson
ipkin писал(а):я хочу посылку данных которая шла на контроллер управления нестандартным индикатором перевести в посылку для более распространённых индиков...

А смысл? Проще свой драйвер написать.
...одно знакоместо состоит из 14-ти сегментов
Тогда не используемые полубайты в топку, остается два байта, которыми кодировать символы. Получится таблица символов из энного количества 16-битных слов. ими кодировать изображения символов.
А подпрограмма-драйвер будет коды символов переводить в эти 16-битные коды, пихать их в нужные места буфера (из 264 бит = 33 байта), а потом весь буфер загонять в контроллер.
А ваше деление посылки для контроллера на байты весьма условно. Что мешает загнать просто 4 бита, тогда код символа выровняется на 2 байта, а с двумя байтами проще работать.
Я разбирался так: сделал табличку соответствия каждого бита в посылке своему сегменту/иконке, проверил где граница группы сегментов каждого разряда (цифры) индикатора. и исходя из этого пропускал где надо биты а дальше гнал байты, потом снова пропускал где надо и так все 264 бита