НЕ клавиатуру я опрашиваю так:
Код
/*****************************************************************************
Рабочие переменные
******************************************************************************/
/* описатель состояния датчика */
typedef struct
{
BOOL State: 1; /* текущее состояние линии */
BOOL Changed: 1; /* флаг изменения состояния */
UINT32 Time; /* время для гашения дребезга контактов */
}
Discrete_Status_t;
Discrete_Status_t Cover; /* состояние датчика крышки прибора */
Discrete_Status_t Ignit; /* состояние линии зажигания */
/*****************************************************************************
Прототипы функций
******************************************************************************/
/* Возвращает состояние на линии */
BOOL DISCRETE_SENS_GetState(UCHAR state, Discrete_Status_t *status, UCHAR delay);
/*****************************************************************************
Инициализация модуля
******************************************************************************/
void DISCRETE_SENS_Init(void)
{
/* Настраиваем порты датчика крышки прибора */
COVER_SENSOR_DDR &= ~(1 << COVER_SENSOR); /* настраиваем как вход */
#ifdef COVER_SENSOR_PULLUP_INC
COVER_SENSOR_PORT |= (1 << COVER_SENSOR); /* подключаем pull-up */
#endif /* #ifdef COVER_SENSOR_PULLUP_INC */
/* Настраиваем порты датчика включения зажигания */
IGNIT_SENSOR_DDR &= ~(1 << IGNIT_SENSOR); /* настраиваем как вход */
#ifdef IGNIT_SENSOR_PULLUP_INC
IGNIT_SENSOR_PORT |= (1 << IGNIT_SENSOR); /* подключаем pull-up */
#endif /* #ifdef IGNIT_SENSOR_PULLUP_INC */
/* инициализируем датчики */
Cover.State = FALSE;
Cover.Changed = FALSE;
Ignit.State = FALSE;
Ignit.Changed = FALSE;
}
/*****************************************************************************
возвращает состояние на линии
******************************************************************************/
BOOL DISCRETE_SENS_GetState(UCHAR state, Discrete_Status_t *status, UCHAR delay)
{
/* проверяем, измеряем ли время дребезга */
if(TRUE == status->Changed) /* да */
{ if(delay < (g_SysTIME_ms - status->Time))
{
status->State = state; /* запоминаем новое состояние */
status->Changed = FALSE; /* снимаем флаг измерения времени */
}
}
else /* нет */
{ /* проверяем, изменилось ли состояние линии */
if(state != status->State) /* если да, то начинаем цикл задержки */
{
status->Time = g_SysTIME_ms; /* запоминаем время события, для задержки на временя дребезга */
status->Changed = TRUE; /* фиксируем изменение состояния линии */
}
}
return status->State;
}
/*****************************************************************************
Возвращает состояние на линии датчика крышки прибора
******************************************************************************/
BOOL COVER_SENS_GetState(void)
{
return DISCRETE_SENS_GetState(
(COVER_SENSOR_PIN & (1 << COVER_SENSOR))? TRUE: FALSE,
&Cover,
COVER_SENSOR_SWITCH_TIME);
}
/*****************************************************************************
возвращает состояние на линии зажигания
******************************************************************************/
BOOL IGNIT_SENS_GetState(void)
{
return DISCRETE_SENS_GetState(
(IGNIT_SENSOR_PIN & (1 << IGNIT_SENSOR))? TRUE: FALSE,
&Ignit,
IGNIT_SENSOR_SWITCH_TIME);
}
g_SysTIME_ms - системное время в милисекундах
COVER_SENSOR_SWITCH_TIME и IGNIT_SENSOR_PULLUP_INC - промежуток времени, определяющий дребезг контакта
COVER_SENS_GetState и IGNIT_SENS_GetState вызываются в главном цикле программы