|
LCD Перекодировка текста не получается, Proteus & LCD не перекодирует помогите. |
|
|
|
Aug 14 2007, 09:22
|
Группа: Новичок
Сообщений: 14
Регистрация: 14-02-07
Пользователь №: 25 343

|
Помогите разобратся в чем проблема, не перекодируется текст, или 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
Прикрепленные файлы
LCD.rar ( 68.99 килобайт )
Кол-во скачиваний: 68
|
|
|
|
|
Aug 14 2007, 15:58
|
Группа: Новичок
Сообщений: 14
Регистрация: 14-02-07
Пользователь №: 25 343

|
Что-то, ни кто ничего не прокомментировал.
Скажите, может в коде где ошибка. Компилятор CVAVR.
|
|
|
|
|
Aug 14 2007, 16:05
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
не суетитесь  просто в соседних постах мы решаем "мировые" проблемы как надоест, обязательно обсудим и Вашу ждите ответа... Цитата(new @ Aug 14 2007, 19:58)  Что-то, ни кто ничего не прокомментировал.
Скажите, может в коде где ошибка. Компилятор CVAVR.
|
|
|
|
|
Aug 14 2007, 18:01
|
Группа: Новичок
Сообщений: 14
Регистрация: 14-02-07
Пользователь №: 25 343

|
//А что значит "не перекодирует"? Что-то не понимаю?
Вроде как после перекодировки на LCD должна бежать строка по русски а она все равно остается не читаемой, выводит эроглифы кторые по умолчанию в занкогенераторе
|
|
|
|
|
Aug 14 2007, 18:22
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-07-06
Пользователь №: 19 070

|
В Протеусе модели LCD не содержат кириллицы, потому и видишь вместо нее не то, что надо. Попробуй на настоящем железе, все должно быть нормально.
|
|
|
|
|
Aug 14 2007, 18:43
|
Группа: Новичок
Сообщений: 14
Регистрация: 14-02-07
Пользователь №: 25 343

|
[quote name='676038' date='Aug 14 2007, 21:22' post='283186'] В Протеусе модели LCD не содержат кириллицы, ...... [/quoеуъ
Вот с железом пока напряг, жду STK500 по рекламной акции ATMEL Интересно, но ведь есть LCD которые содержат кирилицу и есть в которых её нет, я так понимаю если LCD содержит кирилицу то и не надо ничего перекодировать текст и так будет выводится по русски.
И еще если скачать приатаченый файл и запустить, то можно увидеть что некоторые буквы в бегущей строке всетаки перекодировались, для сравнения можно условие if закоментировать, и посмотреть строку без перекодировки.
Завтра сделаю так чтобы в в верхней строке LCD строка бежала без перекодировки а в нижне после перекодировки
|
|
|
|
|
Aug 14 2007, 18:58
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-07-06
Пользователь №: 19 070

|
Для вывода кириллицы понадобится перекодировка в любом случае, т.к. у LCD с кириллицей совсем не виндовая кодировка, это можно увидеть из любого даташита на LCD с кириллицей. Те символы, которые выводятся правильно - просто имеют аналог в латинице (например P->Р, H->Н). Кстати, это может свидетельствовать о том, что перекодировка все же выполняется.
|
|
|
|
|
Aug 14 2007, 19:14
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 26-05-05
Пользователь №: 5 441

|
Замени модель из протеуса на модель из файла и получи оргазм!!!!! И ещё, зачем таблица, есть в cvavre диретивы #pragma rl+ и #pragma rl- компилятор сам это делает.
|
|
|
|
|
Aug 14 2007, 19:25
|
Группа: Новичок
Сообщений: 14
Регистрация: 14-02-07
Пользователь №: 25 343

|
Всем спасибо Если честно то я до сих пор толком не понял как происходит перекодировка, я нигде не нашел более менее нормального описания этого процеса, приходится все делять методом тыка, и еще можно хотя бы в двух словах о дерективах #pragma rl+ и #pragma rl- как их использовать
|
|
|
|
|
Aug 14 2007, 19:41
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 26-05-05
Пользователь №: 5 441

|
Цитата(new @ Aug 14 2007, 22:25)  можно хотя бы в двух словах о дерективах #pragma rl+ и #pragma rl- как их использовать #pragma rl+ lcd_putsf("По РРусски!!!!!"); #pragma rl-(можно не ставить)
|
|
|
|
|
Aug 15 2007, 07:13
|
Группа: Новичок
Сообщений: 14
Регистрация: 14-02-07
Пользователь №: 25 343

|
#pragma rl+ c функцией lcd_putsf("русская буква е"); работает (работает также как и по таблице, только пару символов перекодирует) а вот с функцией lcd_putchar('е'); не работает, на экран вообще ничего не выводит
Сообщение отредактировал new - Aug 15 2007, 07:38
|
|
|
|
|
Aug 15 2007, 08:11
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-07-06
Пользователь №: 19 070

|
Цитата(new @ Aug 15 2007, 13:13)  #pragma rl+ c функцией lcd_putsf("русская буква е"); работает (работает также как и по таблице, только пару символов перекодирует) а вот с функцией lcd_putchar('е'); не работает, на экран вообще ничего не выводит Замени библиотеку в Протеусе, как советовал bezobraznic выше
|
|
|
|
|
Aug 15 2007, 08:51
|
Группа: Новичок
Сообщений: 14
Регистрация: 14-02-07
Пользователь №: 25 343

|
По совету bezobraznic заменил библиотеку, но там в знакогенераторе прошиты символы кириллицы, а мне хотелось полностью разобраться как вывести русскую строку если занкогенератор не содержит символов кириллицы. Вопрос остался открытым. Возможно косяк в CVAVR или в PROTEUSE. Буду ждать STK500 и тогда пробовать в железе Всем спасибо.
Сообщение отредактировал new - Aug 15 2007, 09:20
|
|
|
|
|
Aug 15 2007, 12:45
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-07-06
Пользователь №: 19 070

|
Цитата(new @ Aug 15 2007, 14:51)  По совету bezobraznic заменил библиотеку, но там в знакогенераторе прошиты символы кириллицы, а мне хотелось полностью разобраться как вывести русскую строку если занкогенератор не содержит символов кириллицы... если занкогенератор не содержит символов кириллицы, то отобразить такие символы невозможно (ведь контроллер LCD может отобразить только те символы, о которых знает). Для отдельных извращенцев остается способ перепрограммирования знакогенератора, но так можно перепрограммировать только 8 или 16 (не помню точно) первых символов, остальные зашиты намертво. Поэтому можно перед выводом нужного символа запрограммировать начертание этого символа в пользовательской области знакогенератора, а затем отобразить его... Но зачем бороться с ветряными мельницами?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|