|
Таблицы, как сделать на Си? |
|
|
|
Aug 4 2006, 11:43
|
Знающий
   
Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063

|
Цитата(Костян @ Aug 4 2006, 12:56)  В итоге с const мы видем наличие 'retlw0x60'. Без нее:MOVLW 0x60 MOVWF 0xf . Получаем экономию в два раза + не забиваем ОЗУ.
Лучше наблюдать на большом обьеме данных (около 100 единиц).
Например: const conv[]={ 0xEB, 0x60, 0xA7, 0xE5,.......................................,'~' }; ... unsigned char in=0; while (conv[in]!='~') {PORTB=conv[in];in++;}
сравниваем с (незабываем смотреть на ОЗУ):
char conv[]={ 0xEB, 0x60, 0xA7, 0xE5,.......................................,'~' }; ... unsigned char in=0; while (conv[in]!='~') {PORTB=conv[in];in++;} Я согласен с вами.Код с const эффективней.Обращение к таблице будет быстрее. Кроме того ,без const, для каждого элемента массива будет выделяться отдельная ячейка RAM.
|
|
|
|
|
Aug 8 2006, 08:50
|
Группа: Новичок
Сообщений: 12
Регистрация: 18-07-05
Пользователь №: 6 878

|
А подскажите, как разместить таблицу, например const unsigned char table[..] с какого-то заданного адреса в памяти программ (аналог ORG XYZ в MPASMе)? Пытаюсь в лоб Код const unsigned char table[..] @ 0xXYZ; на что компилятор грязно ругается Пытаюсь сделать таблицу перекодировки кодов букв русских символов в коды индикатора HD44780. Если для латиницы коды совпадают с ASCII, то с русскими там полный бардак.
Сообщение отредактировал giran - Aug 8 2006, 08:53
|
|
|
|
|
Aug 8 2006, 09:22
|
Знающий
   
Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059

|
Цитата(giran @ Aug 8 2006, 06:50)  Пытаюсь сделать таблицу перекодировки кодов букв русских символов в коды индикатора HD44780. Если для латиницы коды совпадают с ASCII, то с русскими там полный бардак. Попробуйте так ("Г"+x), где х-десятичное число, устраняющее разницу в ASCII коде. А вот с ручным размещением таблиы нужно быть осторожным. Таблицы retlw размещаются в подпрограмме, причем при возврате с нее, можно вернутся только на адрес 0..255 (в стек загружается только младшие 8 бит счетчика команд).
|
|
|
|
|
Aug 8 2006, 10:24
|
Группа: Новичок
Сообщений: 12
Регистрация: 18-07-05
Пользователь №: 6 878

|
То есть что-то типа такого: Код const unsigned char table[64]={ 0x41, //А 0xA0, //Б 0x42, //В 0xA1, //Г 0xE0, //Д 0x45, //Е 0xA2, //Ё 0xA3, //Ж...... 0xC7 // я} а обращаться Код table['Г'-0xC0] (C0- код "А" в ASCII а дальше они по порядку, кроме ёЁ). Тогда и абсолютной адресации вроде не надо. Попробую.
Сообщение отредактировал giran - Aug 8 2006, 10:39
|
|
|
|
|
Aug 8 2006, 10:46
|
Знающий
   
Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059

|
Цитата(giran @ Aug 8 2006, 08:24)  То есть что-то типа такого: Код const unsigned char table[64]={ 0x41, //А 0xA0, //Б 0x42, //В 0xA1, //Г 0xE0, //Д 0x45, //Е 0xA2, //Ё 0xA3, //Ж...... 0xC7 // я} Не нужно оперировать кодами букв, за Вас это сделает Mplab const table[]={'П','р','и','в','е','т',' ','м','и','р','`'}; ............... unsigned char i=0; While (table[i]!='`') { write(table[i]+x); //отправляем на индикатор букву и с помощью x добиваемся коректного отображеня на ЖКИ i++; }
|
|
|
|
|
Aug 9 2006, 02:30
|
Группа: Новичок
Сообщений: 12
Регистрация: 18-07-05
Пользователь №: 6 878

|
Цитата Не нужно оперировать кодами букв Вы немного не поняли, в table[] не текст сообщения (типа "Хело, волд"), а коды русских букв по "Таблице кодов символов контроллера Epson, набор "Russian"": http://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm
|
|
|
|
|
Aug 9 2006, 05:39
|
Группа: Новичок
Сообщений: 12
Регистрация: 18-07-05
Пользователь №: 6 878

|
Вообщем, вот окончательный вариант, если кому пригодится, правда без русских букв ёЁ, но это 2-мя отдельными if-ами. Вывожу на 16-знаковый ЖКИ hd44780r, проверил в железе, работает. Код const unsigned char rusTable[64]= { 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, 0xAD, 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};
const unsigned char Message[16]= {"Привет,мир World"};
main() { unsigned char i,currentPOS; TRISB=0x00; di(); //---------инициализация lcd----------- lcd=0; delay(1300); lcd=0x30; bitset (lcd, en); bitclr (lcd, en);// _/\_ delay(7); bitset (lcd, en); bitclr (lcd, en);// _/\_ delay(230); wr_command_lcd(0x20); wr_command_lcd(0x28); wr_command_lcd(0x0C); wr_command_lcd(0x06); wr_command_lcd(0x01); delay(230); //----------Загрузка строки -------- wr_command_lcd(0x80); for (i=0;i<8;i++) { currentPOS= Message[i]; if (currentPOS > 0x7F) currentPOS=rusTable[Message[i]-0xC0]; wr_data_lcd(currentPOS); } wr_command_lcd(0xC0); for (i=8;i<16;i++) { currentPOS= Message[i]; if (currentPOS > 0x7F) currentPOS=rusTable[Message[i]-0xC0]; wr_data_lcd(currentPOS); }
|
|
|
|
|
Aug 11 2006, 05:17
|
Знающий
   
Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063

|
Цитата(giran @ Aug 9 2006, 08:39)  Вообщем, вот окончательный вариант, если кому пригодится, правда без русских букв ёЁ, но это 2-мя отдельными if-ами. Вывожу на 16-знаковый ЖКИ hd44780r, проверил в железе, работает. Код const unsigned char rusTable[64]= { 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, 0xAD, 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};
const unsigned char Message[16]= {"Привет,мир World"};
main() { unsigned char i,currentPOS; TRISB=0x00; di(); //---------инициализация lcd----------- lcd=0; delay(1300); lcd=0x30; bitset (lcd, en); bitclr (lcd, en);// _/\_ delay(7); bitset (lcd, en); bitclr (lcd, en);// _/\_ delay(230); wr_command_lcd(0x20); wr_command_lcd(0x28); wr_command_lcd(0x0C); wr_command_lcd(0x06); wr_command_lcd(0x01); delay(230); //----------Загрузка строки -------- wr_command_lcd(0x80); for (i=0;i<8;i++) { currentPOS= Message[i]; if (currentPOS > 0x7F) currentPOS=rusTable[Message[i]-0xC0]; wr_data_lcd(currentPOS); } wr_command_lcd(0xC0); for (i=8;i<16;i++) { currentPOS= Message[i]; if (currentPOS > 0x7F) currentPOS=rusTable[Message[i]-0xC0]; wr_data_lcd(currentPOS); } Да первая группа русских букв идет после 7F , но вычитать надо 80, а не С0. Анализа второй группы после DF не вижу. Поясните как вы с мелкими буквами выкрутились.
|
|
|
|
|
Aug 11 2006, 06:49
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 11-07-06
Пользователь №: 18 734

|
const unsigned char rus_codes[66]= { 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa2,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,0XB5,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 } ;
// кодировка win1251 -- буквы русские, вроде работает if(c>=0xc0 || c==0xb8 || c==0xa8) { if(c=='Ё') c=6; else if(c=='ё') c='е'-'А' + 2; else if(c<='Е') c=c-'А'; else if(c<='ж') c=c-'А'+1; else c=c-'А'+2; c=rus_codes[c]; }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|