![]() |
|
|||||||
| Компьютеры Уголок для решения бытовых компьютерных проблем. |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
#11 |
|
Блин. Надо найти время и запилить вам этот проект. Осталось узнать как.
Вы на функции программу не перевели, у Вас остался goto. Это не принципиально, но и не функция. Немного теории (совсем чуть-чуть). Регистры портов в авр делятся на три типа, направление, выход и вход, называються соответственно DDRx, PORTx и PINx. Т.е. чтобы выдать на порт значение используем PORT, чтобы считать - используем PIN. Давайте так. Создайте функцию. Типа char GetEncoder(void); И в ней, вместо этого, вызывайте её: m: if (PORTB3==0) { PORTD=0b00001000; } else if(PORTB3==1 && PORTB0==1 && PORTB1==1) { PORTD=0b00000001; } else if(PORTB3==1 && PORTB0==1 && PORTB1==0) { PORTD=0b01000000; } else if(PORTB3==1 && PORTB0==0 && PORTB1==0) { PORTD=0b00100000; } else if(PORTB3==1 && PORTB0==0 && PORTB1==1 && PORTB2==0) { PORTD=0b00000010; } else if(PORTB3==1 && PORTB0==0 && PORTB1==1 && PORTB2==1) { PORTD=0b00000100; } else { goto com; } } } char GetEncoder(void) { if (PINB & 0x80 == 0) { PORTD=0b00001000; return 1; // выход с флагом 1, что сработал по "if (PINB & 0x80 == 0) " } // иначе там единица, продолжаем switch (PINB & 0x0F) { case 0x0B: PORTD=0b00000001; break; case 0x09: PORTD=0b01000000; break; case 0x08: PORTD=0b00100000; break; case 0x0A: PORTD=0b00000010; break; case 0x0E: PORTD=0b00000100; break; default: // если ничего не совпало - возвращаем 2. return 2; break; } в цикле while(1) { char x; x = GetEncoder(); if (x == 1) знач вернулся вернулся по "if (PINB & 0x80 == 0) " или так while (GetEncoder()) == 2) {} // т.е. вызываем GetEncoder, пока не вернется что-то отличное от двойки. } // скобка конца while() |
|
|
|
|