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

Logo

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


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

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

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

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

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

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 Тело программы

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

Если при нажатии на кнопку на линии порта появляется ноль (рис.1), то строку

if (!(PORT))

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

if (PORT)

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

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

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

А на сегодня всё. Удачи.

27.04.17



Еще пара подпрограмм обработчиков нажатия кнопки.

В файле «lib_batt_one_fix.c» подпрограмма обработчик, которая выдает сигнал кнопки, только после того как кнопка отпущена. А в файле «lib_batt_one_fix_long.c» находится обработчик, который выдает сигналы, как по короткому нажатию (также, после того как кнопка отпущена), так и по долгому (когда кнопку нажали и держат какое-то время). К тому же при долгом нажатии после выдачи сигнала обработчик блокируется, не давая сигналу повторяться.

При использовании подпрограмм необходимо обратить внимание на то, что, во-первых, программы написаны под CV_Avr. Поэтому ели вы используете AVR_Studio, то придется изменить псевдоним обращения к выводу порта, во-вторых, обе программы настроены под высокий (1) входной сигнал покоя. Т.е. когда кнопка не нажата, на входе МК должен быть высокий уровень.

В фале «lib_macro_1.7.c» собраны псевдонимы, которые используют обработчики.

А на сегодня всё. Удачи.

03.11.20


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

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