skyfoxx 0 16 октября, 2012 Опубликовано 16 октября, 2012 · Жалоба Всем привет , подскажите как лучше организовать условие ? К микроконтроллеру подключен 8ми сегментные индикатор и две кнопки. по нажатию на кнопку "+" цифра на индикаторе меняется с 0 на 1 , при повторном нажатии с 1 на 2 в общем инкримент , при нажатиии на кнопку "-" дикримент (уменьшает на 1) код: #include <mega8.h> #include <delay.h> unsigned char i; flash unsigned char led[11]={ 0b10111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111, 0b00111111}; void main(void) { i=0; PORTB.0=1; PORTB.1=1; DDRB.0=0; DDRB.1=0; PORTD=0b11111111; DDRD=0b11111111; start: PORTD=led; while (1) { delay_ms(100); if (PINB.0==0) {i++; goto start;} // "+" if (PINB.1==0) {i--; goto start;} // "-" }; } в моем случае все доходит до первого оператора if и возвращается к метки "start:" как сделать так чтоб была реакция на кнопки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 16 октября, 2012 Опубликовано 16 октября, 2012 · Жалоба как сделать так чтоб была реакция на кнопки? Я вам прежде всего предлагаю почитать, как принято делать подавление дребезга от кнопки, как обрабатывать прерывания, и вообще, как все-таки следует писать программу. Выход из цикла по GOTO в данном случае - это нечто ... Литературы по AVR - масса. Вы, похоже, пытаетесь начать с нуля, а напрасно. P.S. Вот книги, там есть куча примеров, как раз в помощь начинающему: http://lord-n.narod.ru/walla.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemrxtx 0 16 января, 2013 Опубликовано 16 января, 2013 · Жалоба Упрощенно можно сделать задержку и повторное чтение пина. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 17 января, 2013 Опубликовано 17 января, 2013 · Жалоба в моем случае все доходит до первого оператора if и возвращается к метки "start:" как сделать так чтоб была реакция на кнопки? Проверить PINB.0 на кз с землей. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Marto 0 17 января, 2013 Опубликовано 17 января, 2013 · Жалоба if (PINB.0 == 0) { _delay_ms(100); if(PINB.0 == 0) {i++;goto start;} } if (PINB.1 == 0) { _delay_ms(100); if(PINB.1 == 0) {i++;goto start;} } ЗЫ. Codevision выбросьте ф топку. и все-таки последуйте совету ув. товарисча __Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 20 января, 2013 Опубликовано 20 января, 2013 · Жалоба в моем случае все доходит до первого оператора if и возвращается к метки "start:" как сделать так чтоб была реакция на кнопки? У вас переменная i выходит за пределы массива. Ну и метку старт выбросить, она не нужна. Надо переделать код как-то так char i; while(1) { delay_ms(100); if(PINB.0==0) i++; //+button if(PINB.1==0) i--; //-button if(i>10) i=0; if(i<0) i=10; PORTD=led; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться