реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Таблицы, как сделать на Си?
upc2
сообщение Aug 4 2006, 11:43
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
giran
сообщение Aug 8 2006, 08:50
Сообщение #17





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
Костян
сообщение Aug 8 2006, 09:22
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



Цитата(giran @ Aug 8 2006, 06:50) *
Пытаюсь сделать таблицу перекодировки кодов букв русских символов в коды индикатора HD44780. Если для латиницы коды совпадают с ASCII, то с русскими там полный бардак.

Попробуйте так ("Г"+x), где х-десятичное число, устраняющее разницу в ASCII коде.
А вот с ручным размещением таблиы нужно быть осторожным. Таблицы retlw размещаются в подпрограмме, причем при возврате с нее, можно вернутся только на адрес 0..255 (в стек загружается только младшие 8 бит счетчика команд).
Go to the top of the page
 
+Quote Post
giran
сообщение Aug 8 2006, 10:24
Сообщение #19





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
Костян
сообщение Aug 8 2006, 10:46
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 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++;

}
Go to the top of the page
 
+Quote Post
giran
сообщение Aug 9 2006, 02:30
Сообщение #21





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



Цитата
Не нужно оперировать кодами букв

Вы немного не поняли, в table[] не текст сообщения (типа "Хело, волд"), а коды русских букв по "Таблице кодов символов контроллера Epson, набор "Russian"": http://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm
Go to the top of the page
 
+Quote Post
giran
сообщение Aug 9 2006, 05:39
Сообщение #22





Группа: Новичок
Сообщений: 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);    }
Go to the top of the page
 
+Quote Post
upc2
сообщение Aug 11 2006, 05:17
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 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 не вижу.
Поясните как вы с мелкими буквами выкрутились.
Go to the top of the page
 
+Quote Post
dialex
сообщение Aug 11 2006, 06:49
Сообщение #24


Участник
*

Группа: Новичок
Сообщений: 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];
}
Go to the top of the page
 
+Quote Post
upc2
сообщение Aug 11 2006, 08:01
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



dialex Спасибо я разобрался.Различие в таблицах кодов ASCII и win1251 .Все правильно.
Go to the top of the page
 
+Quote Post
Костян
сообщение Aug 11 2006, 20:35
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



Цитата(giran @ Aug 9 2006, 00:30) *
Вы немного не поняли, в table[] не текст сообщения (типа "Хело, волд"), а коды русских букв по "Таблице кодов символов контроллера Epson, набор "Russian"": http://www.gaw.ru/html.cgi/txt/lcd/chips/hd44780/start.htm

Хм.. действительно, аброкадабра. Я свои примеры приводил для смешенной ASCII таблицы (иногда смешена и латиница). Запутал в данном случае.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th July 2025 - 00:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016