|
Вывод на ЖКИ значений переменных. |
|
|
|
Mar 7 2008, 15:21
|
Группа: Новичок
Сообщений: 8
Регистрация: 7-03-08
Пользователь №: 35 720

|
Подскажите новичку, как выводить значения переменных на экран ЖКИ HD44780 при программировании в CodeVisionAVR. Вывод символьных строк и отдельных символов получается, а значений переменных - нет. C примером на Си, пожалйста.
|
|
|
|
|
Mar 7 2008, 15:27
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Цитата(andre583 @ Mar 7 2008, 18:21)  Подскажите новичку, как выводить значения переменных на экран ЖКИ HD44780 при программировании в CodeVisionAVR. Вывод символьных строк и отдельных символов получается, а значений переменных - нет. C примером на Си, пожалйста. Если CV поддерживает sprintf, то сделать можно так: Код #include <stdio.h>
int x = 123; char s[17]; sprintf(s, "x = %i", x);
// Дальше выводим строку s на индикатор, той функцией, что у Вас имеется
|
|
|
|
|
Mar 7 2008, 15:33
|
Группа: Новичок
Сообщений: 8
Регистрация: 7-03-08
Пользователь №: 35 720

|
Спасибо, все заработало!!!
|
|
|
|
|
Mar 20 2008, 08:41
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(andre583 @ Mar 7 2008, 18:33)  Спасибо, все заработало!!! Приветствую , Вас. А у меня нет  На sprintf дебагер Протеуса останавливается и все... Дисплей горит, но дальше никаких действий. stdio.h в CVAvr присутствует. Размер 1.9kb. В чем может быть дело ?
|
|
|
|
|
Mar 20 2008, 10:00
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 12:30)  sprintf формирует строку символов в памяти. Дальше её надо отправить на индикатор, как обычно. Понимаю, что туплю... Занялся мк буквально неделю назад - интересно стало. За неделю разобрался с прерываниями, умудрился спидометр сделать (пока только в эмуляции) с выходом на семисегментные матрицы светодиодные и решил это дело перевести на LCD. Но что-то никак непойму эти функции вывода. Вот кусок кода : lcd_init(16); lcd_putsf("Test\nSpeed - control"); delay_ms(2000); lcd_clear(); x=123; sprintf(s,"x = %i", x) ; lcd_puts(s); Все что до sprintf - работает. Где я затупил ? Прошу прощения, что спрашиваю такие элементарные вещи. Сейчас сижу вычитываю форум....
|
|
|
|
|
Mar 20 2008, 10:41
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 13:22)  Вверху - lcd_putsf() внизу - lcd_puts() Хотя, может просто описка Можно глянуть на описание функции? У меня внизу lcd_puts. Я что-то совсем ничего не пойму. Функции берутся из lcd.h, и там они описаны так : ------------------------------------------------------------ #ifndef _LCD_INCLUDED_ #define _LCD_INCLUDED_ #pragma used+ ....... // write the string str located in SRAM to the LCD void lcd_puts(char *str); // write the string str located in FLASH to the LCD void lcd_putsf(char flash *str); ....... #pragma used- #pragma library lcd.lib #endif --------------------------------------------------------------- Как я понимаю, нужно смотреть функции в lcd.lib ? Если так, то там вот что : // write the string str located in SRAM to the LCD void lcd_puts(char *str) { char k; while (k=*str++) lcd_putchar(k); } // write the string str located in FLASH to the LCD void lcd_putsf(char flash *str) { char k; while (k=*str++) lcd_putchar(k); } ----------------------------------------------------------------- и теперь я в полном тупике - обе функции описаны совершенно одинаково... О  Нашел разницу, пардон.
Сообщение отредактировал А.Петрович - Mar 20 2008, 10:43
|
|
|
|
|
Mar 20 2008, 11:24
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 14:13)  Если только sprintf не работает... Хотя с чего бы ему не работать? Вот меня и терзают смутные сомнения  перерастающие в уверенность. Если б была какая-то проблема с lcd_puts(), то либо комприллятор ругнулся бы, либо просто ничего б не вывелось и программа пошла бы дальше, а там след.строкой опять стоит lcd_putsf("Text") . Как только убираю sprintf - печатается след.строка. Вот код : ------------------------------- ...... x=1; //sprintf(s,"x = %i", x) ; lcd_puts(s); delay_ms(200); lcd_putsf("sprintf not work !!!"); --------------------------------- В результате на дисплее "sprintf not work !!!". Вопрос в следущем - как проверить stdio.h на "рабочесть" ?
|
|
|
|
|
Mar 20 2008, 11:47
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(А.Петрович @ Mar 20 2008, 14:24)  Вопрос в следущем - как проверить stdio.h на "рабочесть" ? Про CodeVision врать не буду - не работал. Вот если MSP430+IAR - то пожалуйста. Может, попробовать #include <stdio.h> #include <stdlib.h> #include <stdarg.h> Хуже-то не станет... А линкёр не ругается? может пути до библиотек не прописаны и он не может прилинковать, и молчит себе в тряпочку?
Сообщение отредактировал MrYuran - Mar 20 2008, 11:50
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Mar 20 2008, 12:52
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 14:47)  #include <stdio.h> #include <stdlib.h> #include <stdarg.h>
Хуже-то не станет...
А линкёр не ругается? может пути до библиотек не прописаны и он не может прилинковать, и молчит себе в тряпочку? Линкер не ругается, библиотеки подцепляются. Кажется понял я в чем дело. А дело в форматном выводе. Неправильно указываю тип выводимых данных похоже. sprintf(s,"%i",x) весь вопрос в том что ставить после %. Теперь вот роюсь в хелпах. Может на вскидку подскажете. Все перепробовал и i и f и u. Люди добрые, подскажите какие там буковки вообще могут быть. Все что у Кернигана с Ритчи указано перепробовал  По моему разумению, для вышеуказанного примера должно быть либо i либо d - но не работает... Может в CVAvr свои какие-то понятия о форматном выводе ?
|
|
|
|
|
Mar 20 2008, 13:40
|
Группа: Новичок
Сообщений: 8
Регистрация: 20-03-08
Пользователь №: 36 074

|
Цитата(MrYuran @ Mar 20 2008, 16:33)  а может, так попробовать?
sprintf(s,"Test"); Это-то прокатывает  Проходит даже sprintf(s,"%c",x); Выдает символ соответствующий скан коду знакогенерируещей таблицы... Может s как-то по другому описывать надо ? Может не char s[33] ? Цитата(MrYuran @ Mar 20 2008, 16:33)  Ещё можно попробовать передать в функцию lcd_... указатель на s, хотя вроде имя массива и так должно быть указателем
Можно ещё вот чего: инициализировать массив s какой-нибудь строкой и попытаться вывести. Только в конце строки обязательно должен стоять 0 Попробую пока второй вариант. Спасибо за подсказки
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|