Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
10.09.2007, 20:40
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Кнопки
Привет!
МК ATmega16.
К PIND.6 присоединена кнопка, выводом на ‘-’.
В программе хочу, в зависимости от численного значения счетчика ‘n’, выводить то или иное сообщение на ЖК:
Код:
|
int n = 0x30;
//---------------------------------------------------------
Пропускаю конфигурацию портов и таймеров
//---------------------------------------------------------
DDRD=0x00;
PORTD=0x00;
//---------------------------------------------------------
Пропускаю конфигурацию портов и таймеров
//---------------------------------------------------------
while(1)
{
if(PIND.6==0)
n=n+1;
switch(n) 8)
{
Case 1:
lcd_clear();
lcd_gotoxy(1,0);
lcd_putsf("Hello");
Break;
Case 2:
lcd_clear();
lcd_gotoxy(1,1);
lcd_putsf("avr123.nm.r");
Break; :P
Case 3:
lcd_clear();
lcd_gotoxy(2,1);
lcd_putsf("u");
Break;
}
} |
Почему-то не работает. Не подскажите, что я не правильно делаю?
Ну сколько раз повторять ..
Выкладываете код используйте соответствующую кнопку... dosikus
|
|
|
|
10.09.2007, 21:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
если ограничить n, то появится прекрасный генератор случайных чисел
|
|
|
|
11.09.2007, 00:36
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Ну как делать-то?, вернее, где я неправ?
Покажите. а я буду делать по образу и подобию...
Код:
|
Ну сколько раз повторять ..
Выкладываете код используйте соответствующую кнопку... dosikus |
Ладно, ладно. Я не думал что это так важно. Впредь буду делать.
|
|
|
|
11.09.2007, 00:43
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
если ограничить n, то появится прекрасный генератор случайных чисел
|
Ваша правда дяденька!
Когда я нажимал на кнопку. то появлялись знаки, а то и цифры - все разные! (во кошмар!). Я так понимаю, что надо это как то застопорить. Только как? С дребезгом контактов это имеет отношение?
|
|
|
|
11.09.2007, 03:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Веди задержку между отображениями например одну секунду и будет легче смотреть что к чему.И поставь чтоб зацикливалась ожидая второе нажатие кнопки,но задержку надо,ведь есть дребезг контактов и програма то выполняется моментально.
|
|
|
|
11.09.2007, 05:09
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Дребезг здесь ни причем, тут в принципе неправильная обработка кнопки. Во первых, обрабатывать надо не единицу на порте, а именно перепад с 1 на 0. Во вторых, нужно устранять дребезг. Я уже не первый проект это делаю в прерываниях по таймеру. Благо он всегда у меня использовался. Особенно удобно, если есть динамическая индикация. К ней привязать опрос порта кнопки на каждом цикле - не проблема. Затем счетчик. Если кнопка нажата увеличиваем на 1, если нет, обнуляем. Как только счетчик достиг определенного значения, то значит дребезг завершился, и можно выставлять флаг "Кнопка нажата". Все это делается в циклическом прерывании. А затем уже в основной программе идет спокойная обработка события по нажатию, и сброс флага "Кнопка нажата". Немного доработав этот алгоритм, запросто можно различать короткие и длинные нажатия. У меня есть такой пример на асме для пика. И есть еще пример на С для пика, но там отрабатывается не короткие-длинные, а одинарные, двойные и тройные нажатия. Одна кнопка - три функции. Если интересно могу выслать.
|
|
|
|
11.09.2007, 06:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Выложи тут же,для пика хочу посмотреть,можно и на си.
|
|
|
|
11.09.2007, 09:59
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Что именно выложить ?
|
|
|
|
11.09.2007, 21:51
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
2 CERGEI1982
ну, например, так :
Код:
|
ScanKbd
clrf PORTB
.
.
. Дабы не занимать место на странице - убито
. см. на следующей стр. откомменти-
. рованную версию
.
goto SK.NC.Loop
return |
описать переменные и константы, думаю, не составит труда. А функции BtnPress...BtnHold выглядят как таблицы:
Код:
|
BtnPress
andlw 0x0F
movwf Tbl_Tmp
movlw high(Font)
movwf PCLATH
movfw Tbl_Tmp
addwf PCL,F
return
return
return
return
return
return
goto Key1P
goto Key2P
goto Key3P |
Только, боюсь, утонет вопрошающий, потому
2 retcom
упрощенный вариант в этом случае (без подавления дребезга):
Код:
|
char pressed;
if(PIND.6==0)
{
if (0==pressed)
n=n+1;
pressed = 1;
} else {
pressed = 0;
}; |
|
|
|
|
12.09.2007, 01:51
|
|
Вид на жительство
Регистрация: 27.07.2006
Сообщений: 308
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Веди задержку между отображениями например одну секунду и будет легче смотреть что к чему.И поставь чтоб зацикливалась ожидая второе нажатие кнопки,но задержку надо,ведь есть дребезг контактов и програма то выполняется моментально.
|
Ты прав в абсолюте. Я это и сам понимаю. Как это в кодировке отобразить?
Цитата:
|
Дребезг здесь ни причем, тут в принципе неправильная обработка кнопки. Во первых, обрабатывать надо не единицу на порте, а именно перепад с 1 на 0. Во вторых, нужно устранять дребезг. Я уже не первый проект это делаю в прерываниях по таймеру. Благо он всегда у меня использовался. Особенно удобно, если есть динамическая индикация. К ней привязать опрос порта кнопки на каждом цикле - не проблема. Затем счетчик. Если кнопка нажата увеличиваем на 1, если нет, обнуляем. Как только счетчик достиг определенного значения, то значит дребезг завершился, и можно выставлять флаг "Кнопка нажата". Все это делается в циклическом прерывании. А затем уже в основной программе идет спокойная обработка события по нажатию, и сброс флага "Кнопка нажата". Немного доработав этот алгоритм, запросто можно различать короткие и длинные нажатия. У меня есть такой пример на асме для пика. И есть еще пример на С для пика, но там отрабатывается не короткие-длинные, а одинарные, двойные и тройные нажатия. Одна кнопка - три функции. Если интересно могу выслать.
|
Да я знаю
Ты можешь помочь мне это в коде отабразить? Уточню:
Имеем три строки. Первое нажатие на кнопку - строка один, ... , ... - строка три.
DDRD=0x00;
PORTD=0x00; Это правильно у меня?
PIND.6 -----КНОПКА------ "-"
Так?
rremix: Не сработало (сишный код, Азмовский не пробовал).
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Задержка нажатой кнопки
|
yostaf |
Электроника - это просто |
31 |
15.04.2008 13:37 |
Опрос кнопки
|
Electric111 |
Микроконтроллеры, АЦП, память и т.д |
15 |
18.12.2007 22:48 |
Снова кнопки....
|
dosikus |
Микроконтроллеры, АЦП, память и т.д |
34 |
10.08.2007 20:46 |
Часовой пояс GMT +4, время: 06:22.
|
|