Логотип

Подключение кнопки к микроконтроллеру.

Подключение кнопки к микроконтроллеру

Первое что подключают к микроконтроллеру, когда начинают его изучение - это конечно же кнопку и светодиод. Нет. Наверное, светодиод самый первый, а потом, после того как светодиод начнет моргать, появляется желание управлять этим процессом и вот тогда на сцене появляется кнопка.

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

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

Начнем со схемы подключения.

подключение кнопки к МК

подключение кнопки к МК

Кнопку можно подключать двумя способами, и они изображены на рисунках 1 и 2. И конечно, в программе надо учитывать то, что при первом подключении на линии МК будет единица, а при нажатии ноль. В то же время при втором подключении на линии МК будет ноль, а при нажатии единица.

А вот и программа.


unsigned char bat_pusch_one (void){

//Настроечные параметры и псевдонимы
	#define PAUSA_BAT   	22 			//параметры проверки нажатия char
	#define PORT        	PIND.3			//порт и пин кнопки

//Внутренние псевдонимы
	#define BAT_ON		1			//Передоваемый параметр кнопки
	#define BAT_OFF		0			//Передоваемый параметр кнопки

//Переменные
	unsigned char   bat_numer       = BAT_OFF;  	//передаваемые данные
	static  unsigned char   c_bat_on        = ZERO;	//счетчик 

//Тело программы
	if (PORT){					//если кнопка нажата
		if ((++c_bat_on) >= PAUSA_BAT){		//задержка нажатия кнопки
		c_bat_on = ZERO;			//обнуление счетчика по нажатию
		bat_numer = BAT_ON;			//выставить флаг нажатия кнопки
		}
	}
	else c_bat_on = ZERO;				//обнуления счетчика по недожиму
	return (bat_numer);
} //END Тело программы

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

Если при нажатии на кнопку на линии порта появляется единица, то строку

if (PORT)

надо оставить как есть. Если при нажатии на линии ноль, то строку надо модифицировать

if (!(PORT))

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

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

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


Вот как-то так. Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.


27.04.17


Приложение:
Скачать подпрограмму обработчика нажатия конопки