#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
// Функция-фильтр дребезга контактов. Фильтрует дребезг контактов,
// дожидается устойчивого состояния порта и возвращает 1 или 0.
int btn_press (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
unsigned char buffer = 0x55; // буфер со значением 01010101
int timeout = 200; // количество циклов проверки
if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == 0) //если кнопка сработала, запускаем цикл проверки
{
while (timeout-- > 0)
{
buffer = buffer << GPIO_ReadInputDataBit(GPIOx, GPIO_Pin); // записываем в буфер значение порта со сдвигом
if (buffer == 0x00) // проверяем буфер на наличие нулей
{
return 0;
}
if (buffer == 0xFF) // проверяем буфер на наличие единиц
{
return 1;
}
uint32_t i;
for (i=0;i<0x1000;i++); // задержка между проверками в 1 мс
}
}
return 1;
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Включаем тактирование порта A
GPIO_InitTypeDef led; // светодиод
led.GPIO_Speed = GPIO_Speed_50MHz;
led.GPIO_Mode = GPIO_Mode_Out_PP;
led.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA, &led);
GPIO_InitTypeDef button; // кнопка
button.GPIO_Speed = GPIO_Speed_50MHz;
button.GPIO_Mode = GPIO_Mode_IPU; //вход в режиме pull-up (подтягивающий резистор к питанию)
button.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOA, &button);
//GPIO_ResetBits(GPIOA, GPIO_Pin_0);
while(1)
{
if (btn_press(GPIOA, GPIO_Pin_1) == 0)
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) // проверяем состояние светодиода
{
GPIO_SetBits(GPIOA, GPIO_Pin_0); // зажигаем светодиод
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // тушим светодиод
}
}
}
}
Теперь состояние кнопки детектируется устойчиво. Надо бы проверить как это работает если проверять состояние кнопки по таймеру.
Комментариев нет:
Отправить комментарий