|
Строковые и символьные типы в AVR С |
|
|
|
Mar 5 2006, 13:31
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Работаю с индикатором LCD через ImageCraft Вот две функции: Цитата void LcdChr ( LcdFontSize size, byte ch ) { byte i, c; byte b1, b2; int tmpIdx;
if ( LcdCacheIdx < LoWaterMark ) { // Update low marker. LoWaterMark = LcdCacheIdx; }
if ( (ch < 0x20) || (ch > 0x7b) ) { // Convert to a printable character. ch = 92; }
if ( size == FONT_1X ) { for ( i = 0; i < 5; i++ ) { LcdCache[LcdCacheIdx++] = FontLookup[ch - 32][i] << 1; } } else if ( size == FONT_2X ) { tmpIdx = LcdCacheIdx - 84;
if ( tmpIdx < LoWaterMark ) { LoWaterMark = tmpIdx; }
if ( tmpIdx < 0 ) return;
for ( i = 0; i < 5; i++ ) { c = FontLookup[ch - 32][i] << 1; b1 = (c & 0x01) * 3; b1 |= (c & 0x02) * 6; b1 |= (c & 0x04) * 12; b1 |= (c & 0x08) * 24;
c >>= 4; b2 = (c & 0x01) * 3; b2 |= (c & 0x02) * 6; b2 |= (c & 0x04) * 12; b2 |= (c & 0x08) * 24;
LcdCache[tmpIdx++] = b1; LcdCache[tmpIdx++] = b1; LcdCache[tmpIdx + 82] = b2; LcdCache[tmpIdx + 83] = b2; }
// Update x cursor position. LcdCacheIdx += 11; }
if ( LcdCacheIdx > HiWaterMark ) { // Update high marker. HiWaterMark = LcdCacheIdx; }
// Horizontal gap between characters. LcdCache[LcdCacheIdx++] = 0x00; }
/*--------------------------------------------------------------------------------------------------
Name : LcdStr
Description : Displays a character at current cursor location and increment cursor location according to font size.
Argument(s) : size -> Font size. See enum. dataPtr -> Pointer to null terminated ASCII string to display.
Return value : None.
--------------------------------------------------------------------------------------------------*/ void LcdStr ( LcdFontSize size, byte *dataPtr ) { while ( *dataPtr ) { LcdChr( size, *dataPtr++ ); } } ЧТо-то не получается у меня... LcdStr(1,"hello"); LcdChr(1,'f'); не выводит ничего, LcdChr(1,"f"); - выдает ошибку found "pointer to char" expected "unsigned char" Что делать?
|
|
|
|
|
 |
Ответов
|
Mar 15 2006, 16:47
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Ладно, господа профессионалы, высочайшего класса. Вот вам пример, взятый из CodeVision Examples,т.е. 100% рабочий, т.е. все ошибки человека не отягощенного профессионализмом исключены, все указатели все переменные инициализированы. Даже если где и закралась ошибка, опечатка и пр - компилятор бы ругался. Вот пример Цитата flash unsigned char f[]="12345"; #pragma warn- eeprom unsigned char e[16]; #pragma warn+ unsigned char r[16];
//------------------------------------- // не знаю, конечно, но по моему нижеследующая функция // заточена под RAM //-------------------------------------
void LcdStr ( LcdFontSize size, byte *dataPtr, LcdPixelInverse inverse ) {
while (*dataPtr) { LcdChr( size, *dataPtr, inverse ); } }
//-------------------------------------
void main () {
char flash *ptr_to_flash; char eeprom *ptr_to_eeprom; char *ptr_to_ram; int i,j; // copy the string f from FLASH to // the string e in EEPROM ptr_to_flash=f; ptr_to_eeprom=e; while (*ptr_to_flash) *ptr_to_eeprom++=*ptr_to_flash++;
// copy the string e from EEPROM to // the string r in RAM ptr_to_eeprom=e; ptr_to_ram=r; while (*ptr_to_eeprom) *ptr_to_ram++=*ptr_to_eeprom++;
LcdInit(); Delay();
LcdStr(FONT_1X, ptr_to_ram , NORMAL); LcdUpdate(); } LcdStr ничего не выводит. Вы говорите, что я не умею размещать строки и указатели - вот, это уже сделали другие люди за меня. Уже получена переменная ptr_to_ram ей присвоено значение. Типы данных совпадают (я на всякий случай менял byte на char - без эффекта). Ваше мнение? Defunct, отвечаю на ваш вопрос - отдельно LcdChr работает. Предложенный вами вариант ни к чему не привел. Если в объявлении LcdStr писать __flash, то эта фнукция выводит строки через кавычки и строки инициализированные например так : flash unsigned char f[]="12345"; Но не все же хранить во флеше, что-то генерируется в ходе работы программы, что-то читается из EEPROM.
Сообщение отредактировал zheka - Mar 15 2006, 16:48
|
|
|
|
|
Mar 16 2006, 18:15
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Petka @ Mar 16 2006, 09:33)  Цитата(defunct @ Mar 15 2006, 20:06)  ... 2. для вывода строк хранящихся в eeprom (к тому же строки в eeprom выгоднее хранить в паскалевском представлении - первый символ - длина строки, дальше данные без нуль-терминатора)
Любопытно, а почему так выгоднее? Для ускорения поиска требуемой строки. (раз планируется использовать eeprom, то скорее всего предполагается обновление строк, а коль так, то будет меняться и их размер, следовательно потребуется поиск). Разумеется, сказанное имеет смысл только в том случае если не используется массив индексов (с указателями на начало строк).
Сообщение отредактировал defunct - Mar 16 2006, 18:52
|
|
|
|
Сообщений в этой теме
zheka Строковые и символьные типы в AVR С Mar 5 2006, 13:31 beer_warrior ЦитатаLcdStr(1,"hello"); LcdChr(1,'f... Mar 5 2006, 14:00 zheka Коллега! Честное слово, обижаете. Конечно увер... Mar 5 2006, 14:13 beer_warrior Библиотечка достточно объемная и без знания индика... Mar 5 2006, 14:46 zheka Хм.. разобрался я с буквами. Проблема свелась толь... Mar 5 2006, 15:58 vet Просто строка "abcdef" в данном случае ... Mar 5 2006, 16:21 zheka ЦитатаПоменяйте тип принимаемого параметра на byte... Mar 5 2006, 17:09 zheka Ну что-то я совсем запутался с типами....
Надо мн... Mar 6 2006, 15:40 vet Ну так по передаваемому в функцию адресу лежит чис... Mar 6 2006, 16:14 zheka Я привел текст функции LcdStr.
Вызываю я ее так :... Mar 6 2006, 17:25 Old1 Цитата(zheka @ Mar 6 2006, 21:25) Я приве... Mar 6 2006, 19:24 zheka И как вообще организовать массив из строк? Mar 6 2006, 18:38 zheka __flash byte mystring[]="abcde"; для это... Mar 6 2006, 19:53 defunct Когда появляется сразу сильно много тупых вопросов... Mar 6 2006, 20:44 zheka defunct, знаете, в С для AVR я ноль.
В некоторых д... Mar 6 2006, 20:53 defunct Цитата(zheka @ Mar 6 2006, 22:53) defunct... Mar 6 2006, 21:02 zheka Знаете, бегло просмотрел последнюю ссылку в течени... Mar 6 2006, 21:10 defunct Цитата(zheka @ Mar 6 2006, 23:10) А перва... Mar 6 2006, 21:21 dxp Цитата(zheka @ Mar 7 2006, 03:10) А перва... Mar 7 2006, 05:15 WHALE Блин,да открой ты хелп к кодвижину,там безумно под... Mar 7 2006, 11:25 freux Золотые слова, dxp.
Подтверждаю, вот недавно обкат... Mar 7 2006, 11:26 zheka Умные тут все. Судя по постам даже не вчитывались ... Mar 7 2006, 18:22 defunct Цитата(zheka @ Mar 7 2006, 20:22)
zheka,... Mar 7 2006, 18:52 zheka Ладно, замяли. Я сам разобрался и ладно.
Продолжим... Mar 7 2006, 19:17 WHALE не знаю,кодвижн у меня нормально передает русские ... Mar 7 2006, 19:30 zheka Ну у меня теперь тоже нормально передает - разобра... Mar 8 2006, 08:22 WHALE zheka Я еще раз насчет строковых констант-имхо,ты ... Mar 8 2006, 18:19 zheka Я работаю с индикатором от Nokia 3310 (контроллер... Mar 8 2006, 18:30 kv_addr Что касается фонта, то есть такая простенькая утил... Mar 9 2006, 01:54 zheka RE: Строковые и символьные типы в AVR С Mar 13 2006, 16:57 defunct Цитата(zheka @ Mar 13 2006, 18:57)
LcdC... Mar 13 2006, 20:23 beer_warrior Сядь и спокойно подумай - как производяться эти де... Mar 13 2006, 18:57 zheka ЦитатаИ ты предполагаешь, что компилятор сам найде... Mar 13 2006, 19:46 beer_warrior Увы и ах, я тоже подпишусь под постом dxp.
Есть яз... Mar 13 2006, 20:01 zheka Ну вот:
flash unsigned char f[]="123456... Mar 14 2006, 18:23 vet Куда показывает ptr_to_ram ? Mar 14 2006, 18:44 beer_warrior Тут непонимание системного уровня.
1.Делаем буфер ... Mar 14 2006, 19:38 zheka Цитата1.Делаем буфер в RAM
unsigned char r[16];
... Mar 14 2006, 21:43 freux [quote name='zheka' date='Mar 15 2006,... Mar 15 2006, 09:31 WHALE vet же сказал,у тебя *ptr_to_ram не инициализирова... Mar 15 2006, 06:05 defunct 2 zheka.
Вы так и не ответили на мой вопрос. Отде... Mar 15 2006, 07:08    Petka Цитата(defunct @ Mar 16 2006, 21:15) Цита... Mar 17 2006, 07:13     defunct Цитата(Petka @ Mar 17 2006, 09:13) Забавн... Mar 17 2006, 20:55 vet Цитата(zheka @ Mar 15 2006, 19:47) Ладно,... Mar 15 2006, 18:03 WHALE >>Но не все же хранить во флеше, что-то гене... Mar 15 2006, 17:43 zheka ЦитатаIMHO выгоднее написать 2 отдельные функции:
... Mar 15 2006, 17:50 defunct Цитата(zheka @ Mar 15 2006, 19:50) Ну? 1 ... Mar 15 2006, 21:20 WHALE Действительно,твой пример работать не будет-явная ... Mar 15 2006, 19:23 zheka Итак господа, продолжаем расследование.
Смеялись в... Mar 16 2006, 14:44 beer_warrior А куда указывает указатель s?
ПС если есть желан... Mar 16 2006, 15:46 zheka На строку s. В строку s копируется в данном случа... Mar 16 2006, 16:15 vet zheka
А ругаться не надо. Внимательно прочтите мой... Mar 16 2006, 16:32 beer_warrior char *s - это не строка, это указатель на строку.Э... Mar 16 2006, 16:51 beer_warrior Вдогонку,
совершенно непонятно зачем нужен sprint... Mar 16 2006, 17:05 zheka ЦитатаА ругаться не надо. Внимательно прочтите мой... Mar 16 2006, 17:33 zheka И strcpy тоже работает.
И все же, объясните, в че... Mar 16 2006, 17:45 WHALE zheka Разницы нету-это две возможные формы в CodeV... Mar 16 2006, 18:07 beer_warrior А вот это же детали конкретного компилятора.
char*... Mar 16 2006, 18:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|