|
Как вывести на LCD большое число, Не могу вывести число, большее 32767 |
|
|
|
Aug 20 2008, 11:53
|
Участник

Группа: Новичок
Сообщений: 23
Регистрация: 26-05-08
Пользователь №: 37 817

|
Подскажите чайнику, как переехать такую проблему. Микроконтроллер серии ATMega, нужно выводить на ЖКИ типа РС1602F (c контроллером) инкрементируемую переменную, которая может принимать значения, к примеру, от 0 до 1 000 000. Работу программы (см. вложение) симулирую на VMLAB3.12. Что получается? До значания переменной, равного 32767, всё идёт нормально. А вот следующее индицируемое число равняется -32768 (со знаком минус), и все последующие начинают декрементироваться, то есть -32767, -32766, -32765 и т.д. Почему?
Сообщение отредактировал Tomade - Aug 20 2008, 11:55
|
|
|
|
|
 |
Ответов
|
Aug 22 2008, 07:25
|
Участник

Группа: Новичок
Сообщений: 23
Регистрация: 26-05-08
Пользователь №: 37 817

|
Ну вот, проблема решилась. Сделал следующее. 1.Сгенерировал начальные коды под микроконтроллер ATMega64L (было ATMega16). 2.В строке sprintf(lcd_buffer,"%u",x); вместо u поставил lu (как ранее советовал АНТОХА. Всем спасибо.
|
|
|
|
|
Aug 25 2008, 07:32
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Можно сделать несколько иначе - не используя громоздкую sprintf (на мелких МК не всегда работает, плюс памяти отжирает много) для трехзначной переменной (наращивается аналогично), например: Код //объявляем переменные char j=1; char buffer [4]; char S =0; //сотни char D =0; //десяки char E =0; //единицы //функция преобразования void decbin (unsigned int x) { unsigned int i; // Place your code here for (i=x; i>=100; i=i-100) {S++;}; for (i=x-100*S; i>=10; i=i-10) {D++;}; for (i=x-100*S-10*D; i>=1; i=i-1) {E++;}; }
main { .... while (1) { // Place your code here j++; decbin(j); if (S==0){ //условия для того, чтобы отображалось не "005 " а "5" - нолики убирают... buffer[0]=1; } else { buffer[0]=48+S; }; if ((D==0)&&(S==0)){ buffer[1]=1; } else { buffer[1]=48+D; }; buffer[2]=48+E; lcd_gotoxy(7,1); lcd_puts(buffer); if (j==150) {j=0;}; //считаем до 150
S=0; D=0; E=0;
delay_ms(100); };
.... } Для attiny2313 размер кода со sprintf около 92%, а таким способом - около 45%...
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
Сообщений в этой теме
Tomade Как вывести на LCD большое число Aug 20 2008, 11:53 zhevak Для ответа на Ваш вопрос, Вы указали мало данных.
... Aug 20 2008, 12:04 Maik-vs Цитата(Tomade @ Aug 20 2008, 15:53) Подск... Aug 20 2008, 12:04 =GM= Цитата(Maik-vs @ Aug 20 2008, 11:04)... Aug 20 2008, 12:10  Tomade Цитата(=GM= @ Aug 20 2008, 16:10) Всё рав... Aug 20 2008, 12:18   AHTOXA "%i" - это int, надо - "%l" ил... Aug 20 2008, 12:22   zhevak Цитата(Tomade @ Aug 20 2008, 18:18) Так и... Aug 20 2008, 13:08 Genadi Zawidowski Странно... есть же на данном форуме тема с чужим г... Aug 20 2008, 12:36 GDI Цитатаsprintf(lcd_buffer,"%i",x);
Цитата... Aug 20 2008, 12:41 bloodden Цитата(GDI @ Aug 20 2008, 15:41) Еще от к... Aug 21 2008, 06:52 Tomade Спасибо всем откликнувшимся. Вот что получилось (к... Aug 21 2008, 05:49 AHTOXA Цитата(Tomade @ Aug 21 2008, 11:49) Если ... Aug 21 2008, 06:05 zhevak Цитата(Tomade @ Aug 21 2008, 11:49) Спаси... Aug 21 2008, 06:36 sergeeff А через функцию char *ltoa(long value, char *strin... Aug 21 2008, 06:27 Tomade АНТОХА: Надо не I, а L! (от long)
В вашем пре... Aug 21 2008, 09:59 zhevak Цитата(Tomade @ Aug 21 2008, 15:59) Короч... Aug 21 2008, 10:15 AHTOXA Цитата(Tomade @ Aug 21 2008, 15:59) АНТОХ... Aug 21 2008, 10:47 Tomade Антоха: Клевета! Было маленькое L - l.
Прошу ... Aug 21 2008, 11:08 sss992 можно так сделать:
...
unsigned long int x = 1000... Aug 21 2008, 11:16
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|