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

 
 
> Как вывести на LCD большое число, Не могу вывести число, большее 32767
Tomade
сообщение Aug 20 2008, 11:53
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Tomade
сообщение Aug 22 2008, 07:25
Сообщение #2


Участник
*

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



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


Местный
***

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


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 04:28
Рейтинг@Mail.ru


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