Страница 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 бита