Счетчик нажатий на кнопку
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Добрый вечер. Подскажите как сделать счетчик нажатий на кнопку(без вывода на дисплей и т.п.). А то я не представляю даже как это сделать.Желательно с кодом.
- Реклама
На чем сделать? Микроконтроллер, логика? Тоже контрольная?
Все будет только лучше, в крайнем случае - хуже.
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
А куда выводить это количество нажатий, что вообще менятся должно значение в регистре, состояние порта ввода-вывода?
подсказываю:
1) подключить кнопку, замыкающуюся на землю к ножке микроконтроллера
2) настроить ножку в качестве входа с подтяжкой к +
3) подключить параллельно кнопке конденсатор 0,1 - 1,0 мкФ
4) завести переменную в программе, которая будет выступать в качестве счетчика
5) в бесконечном цикле проверять нажата ли кнопка (проверять логический уровень на выводе кнопки)
подсказка: т.к. кнопка замыкает ножку на землю, то при нажатой кнопке на выводе микроконтроллера будет логический ноль. После детектирования нажатия прибавлять к переменной (Вашему счетчику) единицу.
Будут вопросы - пишите.
1) подключить кнопку, замыкающуюся на землю к ножке микроконтроллера
2) настроить ножку в качестве входа с подтяжкой к +
3) подключить параллельно кнопке конденсатор 0,1 - 1,0 мкФ
4) завести переменную в программе, которая будет выступать в качестве счетчика
5) в бесконечном цикле проверять нажата ли кнопка (проверять логический уровень на выводе кнопки)
подсказка: т.к. кнопка замыкает ножку на землю, то при нажатой кнопке на выводе микроконтроллера будет логический ноль. После детектирования нажатия прибавлять к переменной (Вашему счетчику) единицу.
Будут вопросы - пишите.
Ставим плюсы: )
- Реклама
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Код: Выделить всё
void main(void)
{
int i=0;
PORTB=0x00; //устанавливаем высокий уровень
DDRB=0xFF; //устанавливаем порт для вывода
DDRD = 0;
PORTD = 0xFF;
while(1)
{
if (PORTD.2==0){
i=i+1;
}
if (i==1){
PORTB.0=0;
delay_ms(100);
PORTB.0=1;
delay_ms(100);
break;
}
if (i==2){
PORTB.0=0;
delay_ms(10);
PORTB.0=1;
delay_ms(10);
break;
}
if (i>3){
i=0;
}
}
}- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Должна изменяться частота мигания светодиода, но при таком раскладе ничего не происходит.
Провепил все по отдельности. Условия выполняются, счетчик нажатий кнопки не работает.
Провепил все по отдельности. Условия выполняются, счетчик нажатий кнопки не работает.
Чтобы прочитать логический уровень на порте ввода нужно использовать регистр PIND.
Замените на
Работающий код для AVR-GCC (WinAVR, AtmelStudio):
Замените
Код: Выделить всё
if (PORTD.2==0)Код: Выделить всё
if (PIND.2==0)Спойлер
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
PORTB=0x00;
DDRB=0xFF;
DDRD = 0x00;
PORTD = 0xFF;
int i=0;
while(1)
{
if (bit_is_clear(PIND, 2)) //проверяем нажата ли кнопка
{
i++; //увеличиваем счетчик
_delay_ms(500); //задержка для подавления дребезга
}
while(bit_is_clear(PIND, 2)) //ждем пока кнопка будет отпущена
{}
switch(i)
{
case 0: //i=0
{
PORTB=0;
break;
}
case 1: //i=1
{
PORTB=0;
_delay_ms(100);
PORTB=1;
_delay_ms(100);
break;
}
case 2: //i=2
{
PORTB=0;
_delay_ms(10);
PORTB=1;
_delay_ms(10);
break;
}
default: //если i не равно 0, 1, 2 - присваиваем i=0
{
i=0;
}
}
}
}- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Ну как же, с индикатором поинтереснее будетMAndrey90 писал(а):Подскажите как сделать счетчик нажатий на кнопку(без вывода на дисплей и т.п.)
Счетчик импульсов на Atmega16
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Подскажите как исправить. На ножки pb0-pb7 у меня повешены светодиоды. На ножку INTO0-кнопка. Все работает. но кнопка срабатывает только на ножке PB0(вроде когда на ней есть 0), на других ножка не срабатывает.
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Ну что никто не зает что ли? Подскажите пожалуйста.
Может я как-то порты неправильно насторил?
Может я как-то порты неправильно насторил?
Код: Выделить всё
PORTB=0x00;
DDRB=0xFF;
DDRD=0;А где код, на что смотреть?MAndrey90 писал(а):Ну что никто не зает что ли? Подскажите пожалуйста.
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
void main( void )
{
int i=0;
PORTB=0x00;
DDRB=0xFF;
while(1)
{
if (PIND.2==0){
i=i+1;
delay_ms(50);
}
while(PIND.2==0)
{}
switch(i){
case 1:
{
Бла бла бла...
break;
}
case 2:
{
Бла бла бла...
break;
}
case 3:
{
Бла бла бла...
break;
}
default:
i=1;
}
}
}
DDRB=0xFF; //Все пины Порта B на выход
PORTB=0x00; //Все пины в 0
DDRD = 0x00;//Все пины Порта D на ввод
PORTD = 0xFF;//Все пины в 1, при DDRD = 0x00 - получается внутренняя подтяжка
PORTB=0x00; //Все пины в 0
DDRD = 0x00;//Все пины Порта D на ввод
PORTD = 0xFF;//Все пины в 1, при DDRD = 0x00 - получается внутренняя подтяжка
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Я так уже пробовал. Вот у меня бегущий огонек сделан. так кнопка(переключение режима) срабатывает только на PB0.А мне надо, чтобы она срабатывала на любой порт pb.
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Не, ну что никто не знает в чем проблема? Просто я на этом зациклился уже.
Кнопка просто срабатывает с десятого раза..
Кнопка просто срабатывает с десятого раза..
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Разобрался немного. Кнопка срабатывает у меня только на том месте где заканчивается цикл. Возникает вопрос! Как тогда мне сделать чтобы по нажатию кнопки цикл прерывался, а не доходил до конца?
- Сообщения: 43
- Зарегистрирован: Пт мар 29, 2013 13:07:03
Пробовал вешать на них кнопку, читал про регистры, но внятно мало что понял. Можете хоть код примерный сделать?Пытался настроить этот порт, но у меня програ компилилась постоянно с ошибками, поэтому прошу вашей помощи.
Последний раз редактировалось MAndrey90 Сб май 11, 2013 15:19:54, всего редактировалось 1 раз.


