Перейти к содержанию

Avr+lcd Вывод Переменных На Диплей


l-e-o-n-a-r-d-o

Рекомендуемые сообщения

уже давно не маялся с контроллерами, но вот тут мне подогнали индикатор 1602(да впринципе не важно какой) 16*2

подключил на макетке лсд к тиньке2313, поигрался чуть, работает)) (но что интересно, в даташите полярность питания была перепутана!!!!!).

вот состряпал такой кусок программы:

unsigned char i=0;

lcd_init(16);

delay_ms(100);

lcd_gotoxy(0,0);

lcd_putsf(" please wait ");

lcd_gotoxy(0,1);

lcd_putsf("load:");

lcd_gotoxy(11,1);

lcd_putsf("%");

for (i=0;i<101;i++)

{

lcd_gotoxy(8,1);

lcd_putchar(i);

if (i==100) {i=0;};

delay_ms(100);

}

остальной кусок програмы я думаю не нужен(там инициализация и все остальное стандартное).

я хотел сделать так, чтоб возле слова лоад писалось 1, потом 2,3....10...50..99,100,1,2... ну типа строка загрузки(ради интереса)

на экране написалось

please wait

load: %

а вот после "лоад"..... вместо желаемых нарастающих от 0 до 100 появился английский алфавит по порядку(сначала большие, потом маленькие, потом еще всякие символы) :lol: :lol: :lol: каково было мое удивление :blink:

(наколько я понял, оно выводит символы анси таблицы по их номеру)

так шо вот способ вывести алфвит на экран дисплея....

Но чето значение переменных вывести мне так и не удалось, с записями типа lcd_putsf("%D",i); lcd_puts("%D",i); lcd_putchar("%D",i) и подобными компилятор (кодевижн) матюкается, мол типы не совпадают или много значений для функции.

Как вывести на экран дисплея значение переменных?

И еще вопросик: этот экран вроде и поддерживает руский шрифт, но чето мне тоже не удалось его нарисовать. Как это сделать?

(с дисплеем работаю впервые)

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Но чето значение переменных вывести мне так и не удалось

Давно еще было:

http://forum.cxem.net/index.php?s=&sho...st&p=184841

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

спасибо, я походу понял как оно там работает. Буду пробовать.

А про русский шрифт я нашел вот что:

// win1251 - LCD translation table

const unsigned char TransTable[] = {

0x41,0xA0,0x42,0xA1,0xE0,0x45,0xAB,0xA4,0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,

0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,0xAC,0xE2,0xAD,0xAE,0x62,0xAF,0xB0,0xB1,

0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE,

0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0,0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7 };

void lcd_put( char ch )

{

if (ch > 0xBF)

ch = TransTable [(ch-0xC0)];

lcd_putchar( ch );

}

эта штука работает, только по одному символу. Как вывести строку?

попробовал как в библиотеке кодевижына:

void lcd_rus(char *str)

{

char k;

while (k=*str++) lcd_put(k);

}

но оно не работает, говорит что линия слишком длинная

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

блин, чето не работает :wacko:

посмотрите пжлст всю прогу, в чем проблема?

#include <tiny2313.h>

// Alphanumeric LCD Module functions

#asm

.equ __lcd_port=0x18 ;PORTB

#endasm

#include <lcd.h>

#include <delay.h>

#include <string.h>

#include <stdio.h>

unsigned char i=0;

//unsigned char m=0;

char buffer [5];

void main(void)

{

// Declare your local variables here

// Crystal Oscillator division factor: 1

#pragma optsize-

CLKPR=0x80;

CLKPR=0x00;

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif

// LCD module initialization

lcd_init(16);

delay_ms(100);

delay_ms(100);

lcd_gotoxy(0,0);

//lcd_rus("пр");

lcd_putsf(" Please wait");

lcd_gotoxy(0,1);

lcd_putsf("load:");

//lcd_gotoxy(11,1);

//lcd_putsf("%");

for (i=0;i<101;i++)

{

sprintf(buffer, "%3d",i);

lcd_gotoxy(8,1);

lcd_puts(buffer);

//lcd_puts();

if (i==100) {i=0;};

delay_ms(200);

}

}

в настройказ кодевижина все сделал.(про спринтф)

спринтф в библиотеке стдио.ш, мало тога, вот эта прога, что выше зажрала 93% тиньки... я в сшоке

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

эта штука работает, только по одному символу. Как вывести строку?

По идее, так же... Загоняем в буфер (массив) строку с помощью sprintf, затем для каждого элемента массива с помощью оператора for выполняем преобразование по TransTable, затем выводим...

А где вечный цикл?

while (1)  {
for (i=0;i<101;i++)
{
sprintf(buffer, "%3d",i);
lcd_gotoxy(8,1);
lcd_puts(buffer);
//lcd_puts();
//if (i==100) {i=0;};-я бы это убрал...
delay_ms(200);
};
};

Изменено пользователем Goodefine

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Может есть какой то другой способ менять сроку? ато спринтф не гуманно как то...

дописал, не помогло.

вечный цикл обеспечивается и так, за счет того, что в цикле for (i=0;i<101;i++) стоит 101, а доходя до 100 обнуляется : if (i==100) {i=0;};

Изменено пользователем l-e-o-n-a-r-d-o

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Так что конкретно не работает? Хоть что-то выводится? Что вообще надо сделать? В смысле "менять строку"? Ниче не понял что надо...

Может есть какой то другой способ менять сроку? ато спринтф не гуманно как то...

Если имеется в виду как цифры переменных выводить, то смогу кое-что предложить (без sprintf - не пробовал,но должно работать), только сначала скажите в чем загвоздка у вас...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

выводится

please wait

load:

потом оно моргает, как бы глючит, то буквы меняются местами то еще чтото. время от времени показывается нормально.

но желаемого наростающего 1,2,3,4...100 нету вообще.

Хочю сделать так, чтобы на экране после слова лоад наростало значение (переменная i ) от 0 до 100

я имел ввиду, как изменить строку без применения функции спринтф, которая жрет память и вообще у меня не работает

вот 3gp видео того, что на экране

(переименуйте в 3gp)

080806_143938.rar

Изменено пользователем l-e-o-n-a-r-d-o

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Горящий столбик в верхней строке означает что дисплей переинициализируется, такое ощущение что прога вылетает из вечного цикла. Ща попробую без спринтфа сделать - самому интересно, а то память жрет не по-детски...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

закоментировав строчку там где спринтф в цикле, уже ничего не моргает, изображение стабильное без глюков. И память опустилась с 93% на 43% -не хило однака. видимо корявая функция какаято. И зачем ей стоко памяти?

вот что нашел в хелпе кодевижина:

void sprintf(char *str, char flash *fmtstr [ , arg1, arg2, ...])

this function is identical to printf except that the formatted text is placed in the null terminated character string str.

void snprintf(char *str, unsigned char size, char flash *fmtstr [ , arg1, arg2, ...])

for the TINY memory model.

void snprintf(char *str, unsigned int size, char flash *fmtstr [ , arg1, arg2, ...])

for the other memory models.

this function is identical to sprintf except that at most size (including the null terminator) characters are placed in the character string str.

использовав snprintf опять матюкается что типы flash unsigned char и unsigned char не совпадают.

Изменено пользователем l-e-o-n-a-r-d-o

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Проблема решена. Правда для AT90S2313... Но разницы, практически нет. Размер кода 45,8% вместо 93%...

Проект для CVAVR и Proteus в архиве. Будут вопросы - постараюсь ответить. Скриншот:

post-20311-1218024498_thumb.jpg

2313LCD.RAR

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Если не хочется чтоб нолики выводились, вместо:

   buffer[0]=48+S;
  buffer[1]=48+D;
  buffer[2]=48+E;

Пишем:

if (S==0){  
			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;

Вот так:

post-20311-1218026509_thumb.jpg

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Большое спасибо!!!

Я понял как это работает, не понял тлько одно: почему lcd_puts(buffer); работает с массивом, но не работает с обыкновенной переменной :unsure: глупо как то...

посмотрите вот на это(опять 3GP) грозно аднака))

и исходник

080806_165301.rar

Копия_1.txt

Изменено пользователем l-e-o-n-a-r-d-o

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Нормально... Нолики убрать не пробовал? Или не мешают?

Я, так понимаю, следующий шаг это руссификация? Чтобы не парится, можно создать парочку буферов, числа в которых будут соответствовать номерам соотв. русских букв (если есть в знакогенераторе) и выводить вместо строковых сообщений эти буферы...

Изменено пользователем Goodefine

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

да впринципе не мешают пока что. Это часть большого проэкта на атмеге128, там уже буду мудрить все остальное. А пока тренеруюсь "на кошках" ^_^

Еще раз боьшое спасибо.

Основа с этих всех експериментов- это способ вывода переменной с помощью масива, который очень даже пригодится, и универсален: допустим напишев в первых 3 элементах какието циферки, в другие слова по буковкам или еще что нить, и запишем в экран одной командой, и не прийдется просчитывать и писать типа лсд_гото кучу раз.

Можно чтото типа библиотечки написать или подпрограммы как полезный инструмент. И жрет она значительно меньше памяти.

можно создать парочку буферов, числа в которых будут соответствовать номерам соотв. русских букв (если есть в знакогенераторе) и выводить вместо строковых сообщений эти буферы...

да, очень интересная идея! масивы рулят)))

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Сам думаю библиотечку написать, только руки не доходят. Спринтф создан с претензиями на универсальность, отсюда и размер. Не идет на 2313 почему-то... Целочисленные переменные гораздо эконмичнее выводить можно...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

Вот уж спасибо!!!!!!!!!! супер!!! работает :) :) :rolleyes: :rolleyes: :rolleyes:

теперь хотелось бы узнать, что делают даные чудесные строки? #pragma rl+, #pragma rl-

блин, и чего в инете про русыфикацию предлагают юзать всякие таблицы символов, когда можно все так просто...

Изменено пользователем l-e-o-n-a-r-d-o

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Здраствуйте! Помогите с выводом переменных,а именно переменной int temp - в моей программе в этой переменной сохраняется значение датчика температуры DS18B20, мне нужно это значение вывести на ЛСД екран, датчика подключается 2 шт, остается только после каждой строки lcd_putchar('='); ввести код который будет выводить значение температуры

В языке СИ я начинающий, и использую только ограниченые знания в работе на С++ для ПК

зарание спасибо!

// Під*єднуєм бібліотеки для зручнішої роботи
#include <mega8.h> // Бібліотека для мікроконтроллера
//#include <delay.h> //   Для програмних затримок
#include <lcd.h>   //   Для роботи з індикатором
#asm                             //об*являєм куди під*єднані датчики 
       .equ __w1_port=0x15; PORTC 
       .equ __w1_bit=3 
#endasm 
#asm                             //об*являєм куди під*єднаний індикатор
   .equ __lcd_port=0x12; PORTD 
#endasm
#include <1wire.h>               //бібліотека для роботи з інтерфейсом 1Wire 
#include <ds18b20.h>             //бібліотека для роботи з датчиком ds18b20 
#define MAX_DS18b20 2    
void main(void)
{     
     char *_str="Temperatura na ulice"; //Створюєм строку для виводу на дисплей 
     char *_str2="Temperatura v dome";  //Температура на вулиці і температура в домі
     unsigned char devices;   //змінна, у якій знаходиться кількість під*єднаних датчиків
     unsigned char rom_code[MAX_DS18b20][9]; 
     int temp;       //змінні для збереження температури першого і другого датчика
     PORTD=0x00; //Виставляємо на всіх виводах порта Д лог 0 
     DDRD=0xff; // Використовуємо усі виводи порта Д як виходи 
     lcd_init(20); // Ініціалізація ЖКІ на 20 символів
     lcd_gotoxy(0, 0); // Переводим курсор на перший символ першої строки 
     lcd_puts(_str);   // І виводимо строку "Temperatura na ulice"
     lcd_gotoxy(0, 2); // Переводим курсор на перший символ третьої строки 
     lcd_puts(_str2);   // І виводимо строку "Temperatura v dome"
                        // Надалі ці строки постійно будуть на індикаторі
     devices=w1_search(0xf0,rom_code);     //перевіряємо наявність датчиків 
     while(devices==2)     //Якщо є обидва датчика - переходим у безкінечний цикл                                     
             {       
                     temp=ds18b20_temperature(&rom_code[0][0]);  //читаем температуру першого датчика
                     if (temp>1000)
                            {          //якщо перший датчик видає більше 1000 
                                  temp=4096-temp;//віднімаєм від данних 4096 
                                  temp=-temp;      //і ставим знак "мінус" 
                            }
                     lcd_gotoxy(0, 1);
                     lcd_putchar('=');
                     temp=ds18b20_temperature(&rom_code[1][0]);  //читаем температуру другого датчика
                     if (temp>1000)
                            {          //якщо другий датчик видає більше 1000 
                                  temp=4096-temp;//віднімаєм від данних 4096 
                                  temp=-temp;      //і ставим знак "мінус" 
                            }
                     lcd_gotoxy(0, 3);
                     lcd_putchar('=');       
             }
}

Забанен за рекламу

Ссылка на комментарий
Поделиться на другие сайты

добавте вот таие строчки:

#include <stdio.h>

.....

char buffer [5];

sprintf(buffer, "%3d",temp);

lcd_gotoxy(...);

lcd_puts(buffer);

подкорректируйте то что наклонным шрифтом.

резмер буффера должен быть раза в 2 больше количества символов в отображаемой переменной (не знаю чего так, но по другому не работает)

и еще в настройках прожект-конфигуре- с компайлер- там есть "(s)printf features" ставим long with precission/

есть еще функции itoa i atoi можно ими попробовать (я не пробовал пока что)

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

Спасибо! Сделал все как надо! Но теперь рахмер хекс файла 9,1 кБайт!! Напомню что в АТмега8 всего 8 кБайт памяти! Вобще непонимаю почему такие большие коды на Си получаются! А ведь у меня реальный проект, и незнаю теперь шо делать :mellow:

Посоветуйте как уменьшить размер кода.. На асемблере такая штука занимала бы ну я думаю максимум - 4 кБайт. Чот я разочаровуюсь в языке Си :(

И еще при компиляции CVAVR мне выдает:

EEPROM usage: 0 byte(s) (0,0% of EEPROM)

Program size: 1655 words (40,4% of FLASH)

Тоесть по идее код должен занимать 40,4% памяти програм. Я правильно понял???

Но хекс всеравно 9,1 кБайт!!

Забанен за рекламу

Ссылка на комментарий
Поделиться на другие сайты

9.1 кб это скорее всего в винде оно так занимает, на самом деле там все должно быть норм.

Если пишет что 40%- так оно и есть.

ну а че тут странного.. асм исходник занимает к примеру 49 кб (у меня так было) а хекс файл всего 2..

это функция снпринтф такая огромная. я же говорю, можно поппробовать атои или итоа (точно не помню) использовать, я не пробовал.

в окне программатора откройте этот хекс файл - увидете, там и будет этих 40% занято.

я вот только что глянул один из мвоих проектов на тини2313 с 2кб памяти, так там хекс занимает 6 кб, хотя кодевижн говорит что это 92% памяти. И всенорм работает и прошито. Так что не обращайте внимание.

Изменено пользователем l-e-o-n-a-r-d-o

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

О спасибо, вы меня успокоили... Тогда завтра пойду датчики покупать!

Теперь еще вопросик - а как теперь сделать руский шрифт???

Забанен за рекламу

Ссылка на комментарий
Поделиться на другие сайты

у Вас сейчас все именно теже вопросы, ради которых я когда то создал эту тему. Ответ и на этот вопрос так же имеется, и кстати нужно было прочитать всю тему, тут в 17 посте есть на него ответ.

чем шире кругозор, тем тупее угол обозрения

Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

выводится

please wait

load:

потом оно моргает, как бы глючит, то буквы меняются местами то еще чтото. время от времени показывается нормально.

но желаемого наростающего 1,2,3,4...100 нету вообще.

Хочю сделать так, чтобы на экране после слова лоад наростало значение (переменная i ) от 0 до 100

я имел ввиду, как изменить строку без применения функции спринтф, которая жрет память и вообще у меня не работает

вот 3gp видео того, что на экране

(переименуйте в 3gp)

Знаете, я бы сделал программную задержку перед каждым пересчтом, например delay_ms(500);

Изменено пользователем motoalex
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...