реклама на сайте
подробности

 
 
> mega8, mega+8сегментный индикатор+две кнопки
skyfoxx
сообщение Oct 16 2012, 07:01
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 12-05-09
Пользователь №: 48 956



Всем привет , подскажите как лучше организовать условие ?
К микроконтроллеру подключен 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[i];
while (1)
{
delay_ms(100);

if (PINB.0==0) {i++; goto start;} // "+"
if (PINB.1==0) {i--; goto start;} // "-"

};
}

в моем случае все доходит до первого оператора if и возвращается к метки "start:"
как сделать так чтоб была реакция на кнопки?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
kovigor
сообщение Oct 16 2012, 07:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(skyfoxx @ Oct 16 2012, 10:01) *
как сделать так чтоб была реакция на кнопки?

Я вам прежде всего предлагаю почитать, как принято делать подавление дребезга от кнопки, как обрабатывать прерывания, и вообще, как все-таки следует писать программу. Выход из цикла по GOTO в данном случае - это нечто ... Литературы по AVR - масса. Вы, похоже, пытаетесь начать с нуля, а напрасно.
P.S. Вот книги, там есть куча примеров, как раз в помощь начинающему:
http://lord-n.narod.ru/walla.html
Go to the top of the page
 
+Quote Post
Artemrxtx
сообщение Jan 16 2013, 21:26
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 16-01-13
Пользователь №: 75 215



Упрощенно можно сделать задержку и повторное чтение пина.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 17 2013, 06:12
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(skyfoxx @ Oct 16 2012, 11:01) *
в моем случае все доходит до первого оператора if и возвращается к метки "start:"
как сделать так чтоб была реакция на кнопки?

Проверить PINB.0 на кз с землей. laughing.gif
Go to the top of the page
 
+Quote Post
Marto
сообщение Jan 17 2013, 06:19
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 17-05-09
Из: Ижевск
Пользователь №: 49 190



Код
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


--------------------
Шизоидный холерик
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jan 20 2013, 10:49
Сообщение #6


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(skyfoxx @ Oct 16 2012, 07:01) *
в моем случае все доходит до первого оператора 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[i];
}


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01359 секунд с 7
ELECTRONIX ©2004-2016