Можно ещё одно прерывание по таймеру поставить, и мигание точки в него положить.Greymand писал(а):Здравствуйте уважаемые!
Так вот,как сделать чтобы цифра мигала с периодом 0,5-1 сек?
CodeVision AVR в вопросах и ответах
Если возникнут вопросы - посмотрите на мой аватар.
- Реклама
- Сообщения: 5
- Зарегистрирован: Пн окт 07, 2013 09:20:53
Эмм..Непонимаю)
Точка ж тоже динамически показывается.
Если я хочу зажечь точку после первого индикатора,я должен ее включать только тогда,когда включается именно первый индикатор.
Тогда она будет гореть постоянно.
Вот входим мы в прерывание,которое сделали для динамической индикации.
И там,как я понимаю,надо сделать так,чтобы в N-ом количестве прерываний зажигать точку вместе с первым индикатором,а в остальных-зажигать первый индикатор без точки...
Тока как это грамотно сделать,не знаю(
Точка ж тоже динамически показывается.
Если я хочу зажечь точку после первого индикатора,я должен ее включать только тогда,когда включается именно первый индикатор.
Тогда она будет гореть постоянно.
Вот входим мы в прерывание,которое сделали для динамической индикации.
И там,как я понимаю,надо сделать так,чтобы в N-ом количестве прерываний зажигать точку вместе с первым индикатором,а в остальных-зажигать первый индикатор без точки...
Тока как это грамотно сделать,не знаю(
Обычный счётчик (переменная), считающий кол-во входов. По счётчику уже судим - зажигать после гашения индикатор или нет.Greymand писал(а):И там,как я понимаю,надо сделать так,чтобы в N-ом количестве прерываний зажигать точку вместе с первым индикатором,а в остальных-зажигать первый индикатор без точки...
Тока как это грамотно сделать,не знаю(
Код: Выделить всё
void ind_upd(void){ // Входим 1 раз в 1 Ms
static unsigned int cnt_mig=0; // Счётчик вхождений
static unsigned char fl_mig=0; // Флаг включения индикаторов
if(++cnt_mig>1000) cnt_mig=0;
fl_mig = cnt_mig<500;
Гасим индикаторы();
if(++ind_num>=3) ind_num=0;
if(! fl_mig) return; // Если флаг сброшен - выходим из ф-ии без включения индикаторов
switсh(ind_num){
case 0:
.........
break;
case 1:
.........
break;
case 2:
.........
break;
}
}
Константы 500 и 1000 можно менять в зависимости от необходимой интенсивности мигания и частоты обновления индикации.
берешь еще один таймер , допустим Т2Greymand писал(а):Здравствуйте уважаемые!
Сильно не пинайте,новичек я.
Есть,вообщем,динамическая индикация.Три разряда и точка.
Кода под рукой нет,но вообщем,логика такая:
Прерывание таймера;
Гасим все;
i++;
swith(i)
case 1: включаем первый индикатор;выводим циферку1;
case 2: включаем второй;выводим циферку2;
case 3: включаем третий,выводим циферку3;i=0;зажигаем точку;
Так вот,как сделать чтобы цифра мигала с периодом 0,5-1 сек?
настраиваешь его так, чтобы он давал прерывание, например по переполнению, через 500мс
в телее обработчика этого прерывания пишешь
Код: Выделить всё
ststic char blink;
blink=^blink;Код: Выделить всё
Гасим все;
выводим новое значение;
if(++i>=4)i=0;
swith(i)
case 0: if(blink==1)включаем первый индикатор;// данный разряд будет мигать
case 1: включаем второй;
case 2: включаем третий;
case 3: зажигаем точку;Tell Me The Truth
- Сообщения: 114
- Зарегистрирован: Чт ноя 24, 2011 12:39:13
А как же ответ на мой вопрос?! Как сделать так чтобы при корректировке текущего времени подчеркивалось время или часы в зависимости от того что именно корректируется! Как корректировать я уже понял, а вот как вывести подчерк под значением времени или минуты ну никак не соображу!
- Реклама
Marchello, я читал что есть определенная ф-ция которая делает мигание курсора, но более точно ничего сказать не могу так как сам еще ни разу не запускал дисплей.
Tell Me The Truth
- Сообщения: 114
- Зарегистрирован: Чт ноя 24, 2011 12:39:13
На сколько я понял за курсор в виде подчеркивания отвечает функция _lcd_write_data (0x0d); но куда ее вставлять и вообще как ею пользоваться не могу сообразить! Единственное что смог сделать так это хаотичное мерцание курсора по всему экрану!
- Сообщения: 5
- Зарегистрирован: Пн окт 07, 2013 09:20:53
Спасибо большое!Аlex писал(а):Обычный счётчик (переменная), считающий кол-во входов. По счётчику уже судим - зажигать после гашения индикатор или нет.Greymand писал(а):И там,как я понимаю,надо сделать так,чтобы в N-ом количестве прерываний зажигать точку вместе с первым индикатором,а в остальных-зажигать первый индикатор без точки...
Тока как это грамотно сделать,не знаю(
Как-то, приблизительно, так...
Константы 500 и 1000 можно менять в зависимости от необходимой интенсивности мигания и частоты обновления индикации.
Получилось)
- Сообщения: 78
- Зарегистрирован: Чт июл 07, 2011 14:42:13
Всем добрый день. В программировании я новичок, поэтому не рассказывайте какой из меня программист, сам знаю. Стоит вот такая задача:
у МК одна нога выход на ней единица и она управляет устройством. к трём другим подключены кнопки.
Одна основная кнопка при нажатии которой на выходе появляется ноль на определённое время, не зависимо от времени удержания этой кнопки.
вот код который это реализует. Не знаю правильно ли он у меня написан, но в протеусе работает.
while (1) // Главный цикл
{
if (!PINB.3) // если нажата кнопка на pinB3
{
delay_ms(20); // антидребезговая задержка
PORTB.0=0; // установить на ноге PB0 ноль
delay_ms(100); // подождать 100ms,(продолжительность импульса)
DDRB.0=0; // сделать ногу PB0 входом.
PORTB.0=1; // установить на ноге 0 единицу
if (PINB.3==1) // если на ноге PB3 появиття 1 (единица) то
{
delay_ms(20); // антидребезговая задержка
DDRB.0=1; // ногу PB0 сделать выходом и
PORTB.0=1; // записать на ногу PB0 1 (единицу)
};
}
Теперь мне надо при нажатии на вторую кнопку
If (!PINB.2){ увеличивать продолжительность импульса }
а при нажатии на третью
if(!PINB.1){ уменьшать },
с шагом допустим 10ms. Можно ли это сделать с выше изложенным кодом или нужен другой алгоритм? Дальше будет стоять последняя задача: записать полученные изменения в EEPROM.
у МК одна нога выход на ней единица и она управляет устройством. к трём другим подключены кнопки.
Одна основная кнопка при нажатии которой на выходе появляется ноль на определённое время, не зависимо от времени удержания этой кнопки.
вот код который это реализует. Не знаю правильно ли он у меня написан, но в протеусе работает.
while (1) // Главный цикл
{
if (!PINB.3) // если нажата кнопка на pinB3
{
delay_ms(20); // антидребезговая задержка
PORTB.0=0; // установить на ноге PB0 ноль
delay_ms(100); // подождать 100ms,(продолжительность импульса)
DDRB.0=0; // сделать ногу PB0 входом.
PORTB.0=1; // установить на ноге 0 единицу
if (PINB.3==1) // если на ноге PB3 появиття 1 (единица) то
{
delay_ms(20); // антидребезговая задержка
DDRB.0=1; // ногу PB0 сделать выходом и
PORTB.0=1; // записать на ногу PB0 1 (единицу)
};
}
Теперь мне надо при нажатии на вторую кнопку
If (!PINB.2){ увеличивать продолжительность импульса }
а при нажатии на третью
if(!PINB.1){ уменьшать },
с шагом допустим 10ms. Можно ли это сделать с выше изложенным кодом или нужен другой алгоритм? Дальше будет стоять последняя задача: записать полученные изменения в EEPROM.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Заведите переменную, которая будет хранить время продолжительности единички при нажатии кнопки №1. Опрашивайте кнопки №2,3 и изменяйте эту переменную, в зависимости от нажатой кнопки.
Алгоритм прост до безобразия...
ЗЫ: Про кнопки есть отдельная тема, почитайте её, там и примеры есть.
Алгоритм прост до безобразия...
ЗЫ: Про кнопки есть отдельная тема, почитайте её, там и примеры есть.
- Сообщения: 114
- Зарегистрирован: Чт ноя 24, 2011 12:39:13
А на мой вопрос мне так никто и не ответит на счет мигающего курсора?!
Marchello, Вы теперь через каждый пост будете вставлять свой ответ ?
Покурите даташит на контроллер своего дисплея, там есть возможность помигать курсором - уже Вам ответили выше.
Покурите даташит на контроллер своего дисплея, там есть возможность помигать курсором - уже Вам ответили выше.
- Сообщения: 78
- Зарегистрирован: Чт июл 07, 2011 14:42:13
Та к в том то всё и дело, что для новичка он оказался не очень прост.Аlex писал(а):Заведите переменную, которая будет хранить время продолжительности единички при нажатии кнопки №1. Опрашивайте кнопки №2,3 и изменяйте эту переменную, в зависимости от нажатой кнопки.
Алгоритм прост до безобразия...
ЗЫ: Про кнопки есть отдельная тема, почитайте её, там и примеры есть.
Допустим я обозначу переменную time и задам ей значение и при нажатии кнопки я буду это значение уменьшать или увеличивать, тут понятно. Но уменя время импульса задано задержкой delay_ms(100), и как эту задержку привязать к переменной я не понимаю.
Про кнопки обязательно почитаю. Спасибо.
Что поиск рулит знаю. Забанен во всех поисковых системах.
Код: Выделить всё
delay_ms(time);Или так
Код: Выделить всё
void _delay(unsigned int ms){
while(ms--) delay_ms(1);
}
.............
.............
_delay(time);
- Сообщения: 114
- Зарегистрирован: Чт ноя 24, 2011 12:39:13
Ок! Вопрос №2
Задаю массив - int loc_array[5][2] = {{8,1}, {11,1}, {8,2}, {11,2}, {14,2}}; в котором значения это x и y которые необходимо будет указывать в lcd_gotoxy ()
Как мне в lcd_gotoxy () прописать значение массива?
Задаю массив - int loc_array[5][2] = {{8,1}, {11,1}, {8,2}, {11,2}, {14,2}}; в котором значения это x и y которые необходимо будет указывать в lcd_gotoxy ()
Как мне в lcd_gotoxy () прописать значение массива?
http://yandex.ru/yandsearch?clid=9582&t ... D0%B8&lr=2
Неужели это сложно сделать самому ?
Неужели это сложно сделать самому ?
- Сообщения: 114
- Зарегистрирован: Чт ноя 24, 2011 12:39:13
В том то и дело, что не сложно, проблема в том, что мне как новичку который никогда в жизни не программировал очень трудно разобраться в терминологии и в структуре той или иной функции. Поэтому я и обращаюсь к вам!
- Сообщения: 114
- Зарегистрирован: Чт ноя 24, 2011 12:39:13
И все равно ничего не понял! Может все таки кто нибудь подскажет как в lcd_gotoxy (); вставить значение x,y из массива int loc_array[5][2] = {{8,1}, {11,1}, {8,2}, {11,2}, {14,2}}; где {8 это x, 1 это y}, {11 это x, 1 это y} одним словом значения записанные в массив это координаты x,y
Наверное, так:
Код: Выделить всё
lcd_gotoxy(loc_array[a][0], loc_array[a][1]); //a - номер пары координат
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
В какой терминологии ? Вам слово "массив" неизвестно ? Вы же его сами произносили.Marchello писал(а):мне трудно разобраться в терминологии и в структуре той или иной функции.
На самом деле всё просто. Берёте учебник, садитесь и читаете ... читаете ... читаете ... "до посинения". Такие элементарные вопросы есть в любой книге по Си.
Если Вас отправляют в гугл, это не значит, что Вас оскорбляют, издеваются, унижают и т.д... Значит этот вопрос тищу раз пережёван и ответы лежат в свободном доступе в интернете. Вам нужно просто сидеть и гуглить до тех пор, пока не найдёте ответ на свой вопрос.
И не стоит говорить фразу "я ничего не понял". Назревает сразу-же вопрс - что конкретно Вы не поняли ? Где это "то", что Вы не поняли ? Дайте ссылку на текст, в котором Вам что-то не понятно.
А так, складывается впечатление, что Вы ничего даже не искали и не читали, успокаивая себя словами "я новичок, я всё равно ничего не пойму..."...
Учитесь пользоваться литературой, она - сила !


