|
|
  |
Строковые и символьные типы в 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 5 2006, 14:00
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Цитата LcdStr(1,"hello"); LcdChr(1,'f'); не выводит ничего С технической стороны все правильно, а вот с логической.... 1.Вы уверены, что индикатор жив, проинициализирован, выставлена контрастность? 2.Вы уверены, что Код LcdFontSize size может быть равно 1. 3. Код if ( size == FONT_1X ) наводит на мысль, что существуют какие-то макросы для описания фонтов. И последнее - напишите простую функцию инициализации и вывода на LCD 1-2 символов.Без извращений и оптимизаций простую как грабли. Это гарантирует вам возможность четко разделять ошибки в софте от проблем в железе.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 5 2006, 14:13
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Коллега! Честное слово, обижаете. Конечно уверен в работоспособности, я выводил линии на экран: Цитата void main () { int i,j; LcdInit(); for (i=0;i<11;i++) LcdLine(i*8,0,i*8,48, PIXEL_ON); for (j=0;j<11;j++) LcdLine(0,j*4,80,j*4, PIXEL_ON); LcdGotoXY(20,20); LcdStr(1,"ff"); LcdUpdate(); } А полный текст модуля здесь http://www.microsyl.com/nokialcd/nokialcd.htmlИз него понятно, как генерируются буквы. Если несложно, ознакомьтесь, и посоветуйте что-нибудь.
|
|
|
|
|
Mar 5 2006, 15:58
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Хм.. разобрался я с буквами. Проблема свелась только к одной фукции: Цитата void LcdStr ( LcdFontSize size, byte *dataPtr ) { while ( *dataPtr ) { LcdChr( size, *dataPtr++ ); } } Сама по себе LcdChr(1,'F'); работает. Без проблем! А вот LcdStr(1, 'abcdef'); пишет character constant is too long Замена кавычек - LcdStr(1, "abcdef"); ошибка function parameter #2 incompartible with its declaration Как мне запустить функцию LcdStr() c параметром "abcdef", как эту строку передать функции?
|
|
|
|
|
Mar 6 2006, 15:40
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Ну что-то я совсем запутался с типами.... Надо мне вывести список строк который будет в EEPROM на экран. Но вначале я тренируюсь с прописанными константами: Цитата const float Freq [10] = { 103.1 , 108.2 , 133.3 , 253.4 , 324.5 , 544.6 , 623.7 , 721.8 , 778.9 , 868.9 }; Как-только ни пробовал не получается... Как мне в цикле вывести список этих частот на экран? напомню: функция вывода следующая: Цитата void LcdStr ( LcdFontSize size, byte __flash *dataPtr ) {
while ( *dataPtr) { LcdChr( size, *dataPtr++); } }
|
|
|
|
|
Mar 6 2006, 17:25
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Я привел текст функции LcdStr. Вызываю я ее так : LcdStr(FONT_1X, "abcdef"); а вот как мне ее вызвать не указывая конкретную строку в кавычках а через переменную? Цитата mystring="abcde"; LcdStr(FONT_1X, mystring); Как объявить этот mystring? Какого типа он должен быть? А потом уже будем говорить о sprintf, ведь она тоже требует параметры. Кстати говоря, при попытке запихнуть float в sprintf вылетает ощибка float type is not allowed here Вот сделал, упростил до int: Цитата const int Freq [10] = { 103 , 108 , 133 , 253 , 324 , 544 , 623 , 721 , 778 , 868 };
///////////////////////////////////////// void main () { int i,j;
byte mystring;
LcdInit();
for (i=1;i<5;i++) { LcdGotoXY(1,i); sprintf(Freq[i],mystring); LcdStr(FONT_1X, mystring); } } Пишет для LcsStr: function parameter #2 incompartible with its declaration.
Сообщение отредактировал zheka - Mar 6 2006, 17:27
|
|
|
|
|
Mar 6 2006, 19:24
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Цитата(zheka @ Mar 6 2006, 21:25)  Я привел текст функции LcdStr. Вызываю я ее так : LcdStr(FONT_1X, "abcdef"); а вот как мне ее вызвать не указывая конкретную строку в кавычках а через переменную? Цитата mystring="abcde"; LcdStr(FONT_1X, mystring);
Как объявить этот mystring? Какого типа он должен быть? Судя по реализации функции LcdStr(...), строка должна быть объявлена так: Код __flash byte mystring[]="abcde"; а в функцию передается указатель на эту строку: mystring. Цитата И как вообще организовать массив из строк? Один из вариантов решения- это создать массив указателей на строки и инициализировать его. Вот пример такого массива указателей на строки во flash, сам массив хранится во flash: Код __flash char __flash *MasStr[3]={(char __flash *)"String1", (char __flash *)"String2", (char __flash *)"String3"}; Если работатете с ИАРом то в дополнительных опциях компилятора нужно прописать ключик: --string_literals_in_flash. Со строками в SRAM можно поступить аналогичным образом.
|
|
|
|
|
Mar 6 2006, 19:53
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
__flash byte mystring[]="abcde"; для этой строки CodeVision выдает: storage modifier not allowed in this context a для LcdStr - function parameter #2 incompartible with its declaration Вот вам код: Цитата for (i=0;i<10;i++) { LcdGotoXY(1,i);
LcdStr(FONT_1X, StrArray[i]); } Создайте StrArray. Цитата __flash char __flash *StrArray[3]={(char __flash *)"String1", (char __flash *)"String2", (char __flash *)"String3"}; Этот код, даже без обращения к StrArray приводит к тому что на индикатор не выводится даже то что рисуется другими функциями.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|