silver (28.07.2011 14:56, просмотров: 79) ответил Леонид Иванович на Не просто в одинаковом, а когда оба контакта замкнуты.
в общем, с учетом всех советов, получилось у меня вот что
void Timer4_ISR(void) interrupt 16
{
SFRPAGE=CONFIG_PAGE;
encoder=P5&17;//получаю данные с порта
if (encoder!=encoderprev)//если два соседних состояния не равны
{
if (encoderprev==0)//если в предыдущем состоянии контакты были разомкнуты
{
if (prevprev==encoder||prevprev==17)//и если предпредыдущее состояние было
//начало вращения либо "покой"(оба контакта замкнуты)
{
if (encoder==1){temp++;}// увеличиваю либо уменьшаю величину
if (encoder==16){temp--;}
}}
if (encoderprev==17)// если предыдущее состояние было "покой"
{
if (prevprev==encoder||prevprev==17)
{
if (encoder==16){temp++;}
if (encoder==1){temp--;}
}}
prevprev=encoderprev;
encoderprev=encoder;
encoder=0;
}
работает, относительно предыдущего кода нормально, но не всегда срабатывает, иногда чтобы значение увеличилось на единицу нужно провернуть рукоятку несколько раз, а иногда наоборот, чуть провернул и сразу идет увеличение значения на несколько единиц. В обшем не совсем стабильно.