}
}
int GetEncState()
{
int state = 0;
ENCA_cur = (FIO0PIN & 0x00000800) >> 11; //Чтение текущего состояния контакта А энкодера (P0.11)
ENCB_cur = (FIO0PIN & 0x00200000) >> 21; //Чтение текущего состояния контакта B энкодера (P0.21)
if( (ENCA_cur != ENCA_prev) ) //Если состояние контакта А энкодера изменилось
{
if( !ENCA_cur ) //Если текущее состояние контакта А энкодера - 0 (переход из 1)
{
if( !ENCB_cur ) //Если текущее контакта B энкодера - 0
state = 1; //Переменная состояния означает, что вращение по часовой
else
state = -1; //Переменная состояния означает, что вращение против часовой
}
else //Если текущее состояние контакта А энкодера - 1 (переход из 0)
{
if( ENCB_cur ) //Если текущее контакта B энкодера - 1
state = 1; //Переменная состояния означает, что вращение по часовой
else
state = -1; //Переменная состояния означает, что вращение против часовой
}
}
ENCA_prev = ENCA_cur;//Текущее состояние сохраняется в переменных,
//которые будут предыдущими в следующем цикле проверки
ENCB_prev = ENCB_cur;
return state; //Возвращаем состояние 0 если энкодер не вращается,
//1 если вращается по часовой и -1 если против часовой
}
В данном примере проверяется только изменение состояния контакта А энкодера. Таким образом, половина изменений состояний будет пропущена. Необходимо модифицировать программу следующим образом:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.