Конечно будет, никто и не спорит.
Речь идёт не о Вашей ф-ии, которая выводит данные на дисплей, а о строке. Вы объявили строку как константу и пытаетесь изменить её с помощью sprintf. Но забыли о том, что она не может меняться, т.к. она константа !
Поскольку sprintf() - чет уж очень слишком большой. Я мучил гугл в поисках его альтернативы. Нашел itoa() (из int делает char*). В функция нестандартная, в обычных библиотеках Keil'a ее нет. Может у кого завалялся листинг itoa() ? Поделитесь, пожалуйста. sprintf уж очень неэкономично..
ЗЫ пробовал взять отсюда http://www.scribd.com/doc/59309455/ITOA-C , скопировалось с косяками. поправлял долго, но все равно достаточное количество ошибок.
Ругается вот так *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
на SYMBOL: cadena и SYMBOL: _itoa
Ну можно сымпровизировать. Это урезанная версия: минимальный набор для чисел с десятичным основанием системы счисления. Полная версия будет немного поболее, если она вообще нужна будет.
IfoR
Подобный вариант мне попадался. Только я что то протупил над той функцией. void itoa( int value, char * str ) здесь value это число которое надо преобразовать, а str это массив куда всё записывается.
Как мне этой функцией воспользоваться?
я предполагаю что так (для проверки):
int T;
char sT[25];
void itoa( int value, char * str );
void main (void)
{
T = 25;
itoa(T, sT);
write_1(0, sT); //вывод на ЛСД
while (1)
{}
}
Примерно так? Или все проще делается с ней?
Я просто хочу вывести на экран значения с ds1820 примерно такие -55 и 125 (без знака +)
ЗЫ У меня пока главной задачей в оптимизации стоит избавление от sprintf
Aerarh, спасибо еще раз. void LCD_WriteInt(unsigned int Data) работает нормально!=) правда нули впереди появляются когда число не 5тизначное, но это можно решить добавив пару условий.
IfoR, странно. я вроде так и использовал, но экран оставался пустым. еще раз попробую, может где то что то не так скопировал я. сейчас по-быстрому проверял, как то странно вышло мне компилятор сказал что слишком много параметров, когда я вот так подставил itoa(T, sT). я все равно это itoa добью))
[quote="Vlad0o"]Aerarh, спасибо еще раз. void LCD_WriteInt(unsigned int Data) работает нормально!=) правда нули впереди появляются когда число не 5тизначное, но это можно решить добавив пару условий.
Да, по началу нагрузочка глаза разбегаются... Все в отладочном режиме, еще знак и нули... в общем мод "хоть что-то покажи, а красоту потом наведем"
Error [1346] ; 0. can't find 0x2 words for psect "config" in segment "CONFIG" (largest unused contiguous range 0x1)
Вероятно Вы неправильно задали конфигурационное слово - оно у Вас больше 14 бит в размере, естественно для него не хватает места в конфиг-области памяти, которая размером 1 слово. Конфигурировать надо примерно так:
Дефайны для макроса __CONFIG можно посмотреть в заголовочном файле на Ваш контроллер, обычно в конце. Естественно, в код должен быть включен файл htc.h
Написать свои функции для работы с датчиком.
Подобное 100 раз обсасывалось на этом форуме.
Тем более, Вы же сами запрещаете прерывания на длительное время
Error [1346] ; 0. can't find 0x2 words for psect "config" in segment "CONFIG" (largest unused contiguous range 0x1)
Вероятно Вы неправильно задали конфигурационное слово - оно у Вас больше 14 бит в размере, естественно для него не хватает места в конфиг-области памяти, которая размером 1 слово. Конфигурировать надо примерно так:
Дефайны для макроса __CONFIG можно посмотреть в заголовочном файле на Ваш контроллер, обычно в конце. Естественно, в код должен быть включен файл htc.h
Да я уже разобрался, Так и было, и дефайны нашел именно там. Спс.
Надеюсь я не исчерпал свою квоту на глупые вопросы.
У меня возникло очередное затруднение, скорее всего из специфичности самодельного девелопментборда (как оказалось этот термин больше подходит, чем "kit").
К третьему порту (Р3) по пинам (3.1, 3.2, 3.3, 3.4) подключен LCD (работает ). Но! Для экономии портов на эти же пины ( 3.1 - 3.4) посадили кнопки (обычные кнопки) и с помощью контрольного пина 3.0 так сказать проверяется нажата ли кнопка или нет.
Вот так вот примерно http://i023.radikal.ru/1111/b8/80306427b39b.jpg.
Опрашивать получается - светодиод при нажатии загорается.
Вот такой вот бесконечный цикл для проверки.
while (1)
{
P3MDOUT = 0; //определение порта на вход
B1 = 0;
B2 = 1; //опрос именно этой кнопки!
B3 = 0;
B4 = 0;
if (B0 == 1) //если кнопка нажата
{Delay(1000);} //проверка на
if (B0 == 1) //дребезг
{LED1 = 1;}
else {LED1 = 0;}
}
Но если подставить вместо "LED1 = 1;" вывод на экран произвольного текста при нажатии, то ничего хорошего не получается.... выводится только то что стоит в else (я так понимаю какой то "конфликт" - ведь один же порт используется). У меня даже в процессе экспериментов с кодом при нажатии длительном бледная буква "й" пробегала (один раз) по верхней строке справа налево (а ведь это не планировалось ) и при этом на той же верхней строке более ярко был текст. К сожалению текст программы утерян..
Как мне разобраться с кнопкой? К примеру сделать счетчик нажатий кнопки. Нажимаешь - 1, еще раз - 2 на экране единицу сменяет двойка...как то так. Я понял только то что надо использовать "флаги" - глобальные переменные которые сохраняют текущее и предыдущее состояния кнопки. но пока это не дало результатов....