2016-11-24 5 views
0

Я делаю программу для msp430.Проблема с MSP430 с выключенной кнопкой

Инкремент убегает при первом нажатии кнопки. Он не останавливается при отпускании кнопки.

Как можно ограничить инкремент одним приращением для каждой кнопки?

#include <msp430.h> 

int main(void) 
{ 
    int i; //delay variable 
    int dimeRead=0; 
    int desired=1000; 
    volatile int total=0; 

    P1OUT=0;     //Supposed to get rid of it hanging at the top 
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer 

    while(total<desired) 
    { 
     if((P1IN&0x16)!=0x16) // check if switch is pressed or not 
     { 
     dimeRead=dimeRead+1; 
     total=total + 10; 
     } 

     //Goal is to flip an out put on to turn on light when desired number is hit. 
    } 

    return 0; 
} 
+1

Вы уверены, что в '0x16' .... Я думаю, вам нужно' 0x08' или что-то в этом роде. Я имею в виду, что 0x16 является двоичным '10110', и вы, вероятно, захотите протестировать один бит. С '0x08' вы можете проверить только бит 3, например – LPs

+0

Сообщите нам, какую у вас модель MSP430 и как вы подключили к ней кнопку. –

+0

Где сигнал отскока? Работает ли он через RC-фильтр? Если нет, вы никогда не получите этот код для работы. И вы, вероятно, хотели использовать десятичную маску 16, а не шестнадцатеричный 0x16. Не используйте также, используйте константу '#define mask (1 << 4) // pin 4'. – Lundin

ответ

0

Сначала напишите свои кнопки шпильками по маской, как это #define MASK PIN1 | PIN2 (1 и 2 изменения на ваши контакты), это лучше для визуального контроля ошибок. Во втором заявлении для проверки всех нажатых кнопок if ((P1IN&MASK)==MASK).

Теперь ваше заявление if((P1IN&0x16)!=0x16) проверить, что 3 булавки (PIN1, PIN2, PIN4) в Hi состоянии, и когда оно ложно сделать код

{ 
     dimeRead=dimeRead+1; 
     total=total + 10; 
} 

Если вы хотите приращение, когда одна или две кнопки нажаты заявление должно быть например, if((P1IN&MASK)!=0)

Все это верно для кнопок, которые выдвигаются (состояние HI) при нажатии, для снятия (состояние LOW) - if((P1IN&MASK)!=MASK).

Добавьте задержку после приращения для кнопки debounse. Если ваши кнопки подключены с помощью PIN-кода и заземления, вы должны включить подтягивание для этих контактов/

-1

Я не являюсь официальным комментарием, поэтому я пишу в качестве ответа. Если вы не ошибаетесь, вы пытаетесь увеличить значение if, каждый раз, когда вы нажимаете кнопку. Вот почему так должно быть.

if((P1IN&0x16) == 0x16) 

Но я хотел бы отметить следующее также:

if((P1IN&0x16) == 0x16) 

написав это заявление вы ожидаете Р1.1, Р1.2 и Р1.4 быть высокой.

0
if((P1IN&0x16)!=0x16) , 

Когда кнопки arent подталкивают это утверждение, это правда. Вы должны изменить его с равным знаком.

Также я не уверен, откуда пришел 0x16, я думаю, вы также должны взглянуть на него вторым.