Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LCD Перекодировка текста не получается
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
new
Помогите разобратся в чем проблема, не перекодируется текст, или Proteus или у меня глючит.

Код
#include <mega16.h>
#include <delay.h>
#include <stdio.h>


// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15;PORTC
#endasm
#include <lcd.h>


// Таблица перекодировки из кодовой таблицы 1251

unsigned int const TabWin[256] = {
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,   // псевдографика
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,   // псевдографика
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,   // псевдографика
0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee,   // псевдографика
0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,   // псевдографика
0xa2, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,   // Ё    псевдографика
0xfe, 0xff, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec,   // псевдографика
0xb5, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xfd, 0xff,   // ё    псевдографика
0x41, 0xa0, 0x42, 0xa1, 0xe0, 0x45, 0xa3, 0xa4,   // АБВГДЕЖЗ
0xa5, 0xa6, 0x4b, 0xa7, 0x4d, 0x48, 0x4f, 0xa8,   // ИЙКЛМНОП
0x50, 0x43, 0x54, 0xa9, 0xaa, 0x58, 0xe1, 0xab,   // РСТУФХЦЧ
0xac, 0xe2, 0xad, 0xae, 0x62, 0xaf, 0xb0, 0xb1,   // ШЩЪЫЬЭЮЯ
0x61, 0xb2, 0xb3, 0xb4, 0xe3, 0x65, 0xb6, 0xb7,   // абвгдежз
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0x6f, 0xbe,   // ийклмноп
0x70, 0x63, 0xbf, 0x79, 0xe4, 0x78, 0xe5, 0xc0,   // рстуфхцч
0xc1, 0xe6, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7    // шщъыьэюя
};

flash unsigned char t1[] = "= Приветствие! Проверка Бегущей строки на LCD =";

void main(void)
{
// Declare your local variables here
unsigned char c;
unsigned int b;
unsigned char i;
// Input/Output Ports initialization
PORTA=0x00;
DDRA=0xFF;

PORTB=0x00;
DDRB=0xFF;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
ADMUX=0;
ADCSRA=0x87;

// LCD module initialization
lcd_init(16);

while (1){
//***********************************************************
//       Вывод Бегущей строки
//***********************************************************        

for(c=0; c<32; c++){
for (lcd_gotoxy(0,1),b=0; b<16; b++){
i = (t1[c+b]);
if(i>=0x80){        // Если символ не латинский то,
  i -= 0x80;        // уменьшаем таблицу
  i = TabWin[i];        // Перекодировать
  }     
lcd_putchar(i);
delay_ms(15);
  }
  }
}
}

Прикрепил файл в Proteuse
new
Что-то, ни кто ничего не прокомментировал.

Скажите, может в коде где ошибка. Компилятор CVAVR.
singlskv
не суетитесь smile.gif
просто в соседних постах мы решаем "мировые" проблемы biggrin.gif
как надоест, обязательно обсудим и Вашу
ждите ответа...
Цитата(new @ Aug 14 2007, 19:58) *
Что-то, ни кто ничего не прокомментировал.

Скажите, может в коде где ошибка. Компилятор CVAVR.
SasaVitebsk
Узнаю свою таблицу. smile.gif
А что значит "не перекодирует"? Что-то не понимаю?
singlskv
OFF: biggrin.gif
Цитата(SasaVitebsk @ Aug 14 2007, 20:17) *
Узнаю свою таблицу. smile.gif

OFF: вот я же обесчал что сейчас подтянутся biggrin.gif
new
//А что значит "не перекодирует"? Что-то не понимаю?

Вроде как после перекодировки на LCD должна бежать строка по русски а она все равно остается не читаемой, выводит эроглифы кторые по умолчанию в занкогенераторе
676038
В Протеусе модели LCD не содержат кириллицы, потому и видишь вместо нее не то, что надо. Попробуй на настоящем железе, все должно быть нормально.
new
[quote name='676038' date='Aug 14 2007, 21:22' post='283186']
В Протеусе модели LCD не содержат кириллицы, ......
[/quoеуъ

Вот с железом пока напряг, жду STK500 по рекламной акции ATMEL
Интересно, но ведь есть LCD которые содержат кирилицу и есть в которых её нет,
я так понимаю если LCD содержит кирилицу то и не надо ничего перекодировать текст и так будет
выводится по русски.

И еще если скачать приатаченый файл и запустить, то можно увидеть что некоторые буквы в бегущей строке всетаки перекодировались, для сравнения можно условие if закоментировать, и посмотреть строку без перекодировки.

Завтра сделаю так чтобы в в верхней строке LCD строка бежала без перекодировки а в нижне после перекодировки
676038
Для вывода кириллицы понадобится перекодировка в любом случае, т.к. у LCD с кириллицей совсем не виндовая кодировка, это можно увидеть из любого даташита на LCD с кириллицей.
Те символы, которые выводятся правильно - просто имеют аналог в латинице (например P->Р, H->Н). Кстати, это может свидетельствовать о том, что перекодировка все же выполняется.
bezobraznic
Замени модель из протеуса на модель из файла и получи оргазм!!!!! И ещё, зачем таблица, есть в cvavre диретивы #pragma rl+ и #pragma rl- компилятор сам это делает.
new
Всем спасибо
Если честно то я до сих пор толком не понял как происходит перекодировка, я нигде не нашел более менее нормального описания этого процеса, приходится все делять методом тыка,
и еще можно хотя бы в двух словах о дерективах #pragma rl+ и #pragma rl- как их использовать
SasaVitebsk
А в общем-то вы все не правы. smile.gif Так как у меня написано не требуется перекодировки протеуса и т.п.
У меня вообще на IAR написано и перекодировка осуществляется. Она же программная. Именно поэтому никакие pragma и не нужны. На прогу внимательнее посмотрите. Может у Вас CV ещё раз перекодирует - это другое дело. Тогда надо эту перекодировку выключить.
bezobraznic
Цитата(new @ Aug 14 2007, 22:25) *
можно хотя бы в двух словах о дерективах #pragma rl+ и #pragma rl- как их использовать


#pragma rl+
lcd_putsf("По РРусски!!!!!");
#pragma rl-(можно не ставить)
new
#pragma rl+ c функцией lcd_putsf("русская буква е"); работает (работает также как и по таблице, только пару символов перекодирует)
а вот с функцией lcd_putchar('е'); не работает, на экран вообще ничего не выводит
676038
Цитата(new @ Aug 15 2007, 13:13) *
#pragma rl+ c функцией lcd_putsf("русская буква е"); работает (работает также как и по таблице, только пару символов перекодирует)
а вот с функцией lcd_putchar('е'); не работает, на экран вообще ничего не выводит


Замени библиотеку в Протеусе, как советовал bezobraznic выше
new
По совету bezobraznic заменил библиотеку, но там в знакогенераторе прошиты символы кириллицы,
а мне хотелось полностью разобраться как вывести русскую строку если занкогенератор не содержит
символов кириллицы.
Вопрос остался открытым.
Возможно косяк в CVAVR или в PROTEUSE.
Буду ждать STK500 и тогда пробовать в железе
Всем спасибо.
676038
Цитата(new @ Aug 15 2007, 14:51) *
По совету bezobraznic заменил библиотеку, но там в знакогенераторе прошиты символы кириллицы,
а мне хотелось полностью разобраться как вывести русскую строку если занкогенератор не содержит
символов кириллицы...

если занкогенератор не содержит символов кириллицы, то отобразить такие символы невозможно (ведь контроллер LCD может отобразить только те символы, о которых знает).

Для отдельных извращенцев остается способ перепрограммирования знакогенератора, но так можно перепрограммировать только 8 или 16 (не помню точно) первых символов, остальные зашиты намертво. Поэтому можно перед выводом нужного символа запрограммировать начертание этого символа в пользовательской области знакогенератора, а затем отобразить его... Но зачем бороться с ветряными мельницами?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.