Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 13:20   #1
hungry
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 30
Лампочка С++ Обработчик событий

Собственно есть контроллер, на нем находится кнопка и 2 диода.
Хочу сделать, чтобы при четном нажатии кнопки светился 1 диод(0x01), при нечетном нажатии 2 диод(0x40);
Кнопку назвал 0x08.
Собственно немного в условиях запутался, что в коде не так, подскажите. Не могу нормально последовательно расположить условия, чтобы он вначале проверял какой раз я нажал кнопку и включал определенный диод.

Код:
void main(void)
{
float i=0;
float n=0;
while ((0x08 & P1IN))                                 
  {
i=i+1;
n=i%2;
    }
if (n == 0)
P1OUT = 0x01;                                           
else
P1OUT = 0x40;                                           
}

Последний раз редактировалось hungry; 11.05.2011 в 15:16.
hungry вне форума Ответить с цитированием
Старый 11.05.2011, 15:17   #2
hungry
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 30
По умолчанию

Ругается постоянно на эту строчку
Код:
n=i%2;
hungry вне форума Ответить с цитированием
Старый 11.05.2011, 15:25   #3
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Зачем счетчикам тип float?
Попробуй заменить на int...

И вот это:
Код:
while ((0x08 & P1IN))                                 
  {
i=i+1;
n=i%2;
    }
if (n == 0)
...
можно записать немного компактнее
Код:
while ((0x08 & P1IN))                                 
     n = i++ / 2;
if (!n)
...
Да! И main должна быть int, а не void...
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 11.05.2011, 15:34   #4
hungry
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
...
Считывание происходит 1 раз, далее он не считает количество раз, сколько нажал, попробовал сделать
Код:
for(;;) // бесконечный цикл
после пробовал и перед while, не помогло тоже(

Код:
main(int)
{
int i=0;
int n=0;
for(;;)
if ((0x08 & P1IN))  
     n = i++ / 2;
if (!n)
P1OUT = 0x01;                                           
else
P1OUT = 0x40; 
}
Вот код через if попробовал, не получается постоянной проверки, сколько раз нажато, просто при 1 нажатии начинает гореть 1 диод и не идет далее изменений

Последний раз редактировалось hungry; 11.05.2011 в 15:56.
hungry вне форума Ответить с цитированием
Старый 11.05.2011, 16:15   #5
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Если я правильно понял смысл задачи, то у тебя не там стоит закрывающая операторная скобка цикла while.
Передвинь ее _за_ проверки на четность количества нажатий.
Как-то так...
Код:
int main(void)
{
    int i=0;
    while (0x08 & P1IN)                                 
    {
        if (i++ % 2)
            P1OUT = 0x40;                                           
        else
            P1OUT = 0x01;                                           
    }
}
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062

Последний раз редактировалось Mandrivnyk; 11.05.2011 в 16:20.
Mandrivnyk вне форума Ответить с цитированием
Старый 11.05.2011, 16:46   #6
hungry
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
...
Получается в любом случае одноразовая проверка нажатия( потом программа прекращает работу, а мне нужно постоянную проверку, нажимали ли кнопку или нет, если да, то всегда должна идти прибавка к i и проверка четности, если не нажимали, ожидание нажатия

Собственно подогнал код
Код:
#include <msp430g2231.h>
int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 
    P1DIR |= 0x41;
    int i=0;
    for(;;)
    while (0x08 & P1IN)     
    {
        if (i++ % 2)
            P1OUT = 0x40;                                           
        else
            P1OUT = 0x01;                                           
    }
}
Все почти хорошо, не правильно считает в итоге сколько нажал кнопку, получается 1 нажатие = 1 диод, 2 нажатие = 2 диод, 3 нажатие = 1 диод, 4 нажатие = 1 диод, 5 нажатие = 2 диод, 6 нажатие = 2 диод и так далее, 3 1д, 3 2д..

Последний раз редактировалось hungry; 11.05.2011 в 16:55.
hungry вне форума Ответить с цитированием
Старый 11.05.2011, 16:52   #7
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Давай сначала.
Как ты проверяешь нажатие кнопки? Поподробнее...
С объявлениями кнопки, диодов и прочего, если есть.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 11.05.2011, 17:00   #8
hungry
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 30
По умолчанию

Есть микросхема и ее библиотека в ней уже все объявлено, какая кнопка, какие диоды и тд.
А проверка кнопки очень проста, есть микроконтроллер с 8 ножками, кнопка располагается на его 3 ножке, т.е. 0x08, если поступает сигнал на эту ножку, значит кнопка нажата, вот и все. Так же и с диодами, если поступил сигнал на ножки 0 и 6, то контроллер дает сигнал, чтобы диод загорелся.
Вроде логически понимаю все как должно быть, но С++ проходил года 3 назад, подзабыл немного.

Последний раз редактировалось hungry; 11.05.2011 в 17:05.
hungry вне форума Ответить с цитированием
Старый 11.05.2011, 17:05   #9
hungry
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 30
По умолчанию

Насчет объявления
Есть такое понятие как P1DIR, т.е. дословно это указать какие ножки микросхемы будут принимать сигнал, при настройке диодов мы задаем сигналы в 16ном коде, что будут на прием работать ножки 0x01(0ножка) и 0x40(6ножка) на которых весят диоды, далее путем присвоения команде P1OUT = 0x01 к примеру (происходит что на 0ножку микроконтроллера поступает сигнал, т.к. указана 0 ножка в этом 16ном коде)
hungry вне форума Ответить с цитированием
Старый 11.05.2011, 17:08   #10
hungry
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 30
По умолчанию

Выглядит все это так, полный код с описанием принимающих ножек и тд

Код:
#include <msp430g2231.h>                                         //подключение библиотеки
int main(void)
{          
    P1DIR |= 0x41;                                                      //0 и 6 ножку на выходы
    int i=0;
    for(;;)
    while (0x08 & P1IN)
//P1IN входной порт, проверка есть ли на входе сигнал от кнопки, 3 ножка мк
    {
        if (i++ % 2)
            P1OUT = 0x01;  //если четное сигнал на ножку 0
        else   
            P1OUT = 0x40;  //если нечетное сигнал на ножку 6        
    }
}

Последний раз редактировалось hungry; 11.05.2011 в 17:12.
hungry вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик событий Borland C++ Jasper92 Помощь студентам 1 24.10.2010 09:57
Обработчик событий в DBLookupListBox MixanMM БД в Delphi 7 29.07.2010 13:08
обработчик событий кнопки Dmitriy.Ch Общие вопросы C/C++ 0 04.07.2009 09:35
обработчик событий ben95 Помощь студентам 5 28.01.2008 17:46