На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (18) « Первая ... 4 5 [6] 7 8 ...  17 18 все  ( Перейти к последнему сообщению )  
    > Разбираемся с IAR , Обсуждаем небольшие коды на IAR.
      Я так понимаю, что схема включения из CVET.RAR?
      tick() - задержка на некоторый интервал времени?
      Тогда этот код должен моргать некоторое время после нажатия кнопок одним из светодиодов, соответсвующим двоичному коду, образуемому нажатыми клавишами
      ExpandedWrap disabled
        main() {
           volatile unsigned char Keys;
           unsigned char mask;
           unsigned int i;
           TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
           PORTA = 0x1c;
           TRISB = 0;
           while( 1 ) {
              PORTB = 0xff;
              do {
                 tick();  // не будеи опрашивать кнопки слишком часто
                 Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
              } while(Keys == 0);
              Keys >>= 2; // нормализуем(сдвигаем)
              mask = 1<<Keys; // битовая маска инвертируемого вывода порта B
              for( i=1000 ; i != 0 ; i-- ) {
                 // "мигаем" соответствующим светодиодом
                 PORTB ^= mask; // инвертируем бит
                 tick(); // делаем небольшую задержку
              }
           }
        }
      Здесь, правда, неплохо было бы ввести "антидребезг"
        ExpandedWrap disabled
          for( i=1000; i != 0; i-- )


        i=1000, это i = (TRISA = 8)? (В донном случаи i будет TRISA?)

        ExpandedWrap disabled
          mask = 1<<Keys; // битовая маска инвертируемого вывода порта B


        По подробнее объясните.
        У тебя в исходнике где: // "мигаем" соответствующим светодиодом
        Можно указать одну последовательность миганий при нажатии,
        А если я хочу к каждой кнопки различные последовательности мигания?
        Так, на словах, что за "антидребезг".

        ExpandedWrap disabled
          Я так понимаю, что схема включения из CVET.RAR?
          tick() - задержка на некоторый интервал времени?


        Да, да.
        Сообщение отредактировано: bizar -
          Цитата
          bizar, 28.01.04, 17:01
          i=1000, это i = (TRISA = 8)? (В донном случаи i будет TRISA?)
          Это просто цикл из 1000 изменений состояния одного из светодиодов(светит/не светит).

          Цитата
          bizar, 28.01.04, 17:01
          mask = 1<<Keys; // битовая маска инвертируемого вывода порта B

          По подробнее объясните.
          Это формирование битовой маски для инвертирования состояния нужного вывода. Просто в mask в бите, номер которого находится в Keys, будет установлена 1, в остальных битах - 0.

          Цитата
          bizar, 28.01.04, 17:01
          У тебя в исходнике где: // "мигаем" соответствующим светодиодом
          Можно указать одну последовательность миганий при нажатии,
          А если я хочу к каждой кнопки различные последовательности мигания?
          Можно. Программа только немного изменится.

          Цитата
          bizar, 28.01.04, 17:01
          Так, на словах, что за "антидребезг".
          Это несколько считываний состояния с небольшими интервалами между ними. Для устранения дребезга контактов.
            ExpandedWrap disabled
              main()
                      {
                      volatile unsigned char Keys;
                      unsigned char mask;
                      unsigned int i;
                      TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
                      PORTA = 0x1c;
                      TRISB = 0;
                      while(1)
                             {
                             PORTB = 0xff;
                             do
                              {
                              tick(); // не будеи опрашивать кнопки слишком часто
                              Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
                              }
                             while(Keys == 0);
                             Keys >>= 2; // нормализуем(сдвигаем)
                             mask = 1<<Keys; // битовая маска инвертируемого вывода порта B
                             for( i=1000; i != 0; i-- )
                                     {
                                     if (PORTA = 0x1b) PORTB == 0xfd; //Если RA2 вход, зажигаем RB1
                                     if (PORTA = 0x17) PORTB == 0xfb; //Если RA3 вход, зажигаем RB2
                                     else POTRB == 0xf7; //Если RA4 вход, зажигаем RB3
                                     PORTB ^= mask; // инвертируем бит
                                     tick(); // делаем небольшую задержку
                                     }
                              }
                      }
              }


            Для нескольких кнопок.
            Думаю что здесь что то не то. Проверьте?
              ExpandedWrap disabled
                main() {
                   volatile unsigned char Keys;
                   unsigned char mask;
                   unsigned int i;
                   TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
                   PORTA = 0x1c;
                   TRISB = 0;
                   while(1) {
                      PORTB = 0xff;
                      do {
                         tick(); // не будеи опрашивать кнопки слишком часто
                         Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
                      } while(Keys == 0);
                      Keys >>= 2; // нормализуем(сдвигаем). Теперь:
                                  //  бит 0 - RA2,
                                  //  бит 1 - RA3,
                                  //  бит 2 - RA4.
                      mask = Keys;
                      for( i=1000; i != 0; i-- ) {
                         PORTB ^= mask;
                         tick(); // делаем небольшую задержку
                      }
                   }
                }
              Так?
              P.S. Можно кое-что соптимизировать, но нагладность окончательно потеряется.
              Сообщение отредактировано: trainer -
                1)что то я не понял, Trainer же сделал тебе для нескольких кнопок?
                2) нафига , если у тебя есть код нажатой кнопки в переменной mask, ты еще раз пытаешься проверять PORTA???
                3) в твоем коде ошибка
                if (PORTA = 0x1b) PORTB == 0xfd; //Если RA2 вход, зажигаем RB1
                if (PORTA = 0x17) PORTB == 0xfb; //Если RA3 вход, зажигаем RB2
                else POTRB == 0xf7; //Если RA4 вход, зажигаем RB3
                эти строчки лишние:)
                  potor, то есть где у trainer, написано
                  ExpandedWrap disabled
                    // "мигаем" соответствующим светодиодом

                  Можно написать код:
                  Если mask ровен тому-то выполнять те та включения светодиодов,
                  Если равен другому то другие светодиоды будут гореть?
                  ExpandedWrap disabled
                    for( i=1000; i != 0; i-- )

                  trainer, зачем ты :o использовал :o это в программе?
                    Это цикл. Выполнять заданное действие ограниченное количество раз, а значит и ограниченное время.

                    Добавлено в :
                    Цитата
                    bizar, 30.01.04, 09:29
                    Если mask ровен тому-то выполнять те та включения светодиодов,
                    Только лучше не mask, а Keys. Расшифровку см. в сообщении #80
                      ExpandedWrap disabled
                        potor, то есть где у trainer, написано
                        // "мигаем" соответствующим светодиодом
                         
                        Можно написать код:
                        Если mask ровен тому-то выполнять те та включения светодиодов,
                        Если равен другому то другие светодиоды будут гореть?

                      Это будет выглядеть вот так:
                      ExpandedWrap disabled
                        {
                        if (Keys = 0) POTRB == 0xfd; //Если Keys равен 0 горит светодиод на RB1
                        if (Keys = 1) PORTB == 0xfb; //Если Keys равен 1 горит светодиод на RB2
                        if (Keys = 2) PORTB == 0xf7; // Если Keys равен 2 горит светодиод на RB3
                        }

                      ExpandedWrap disabled
                        Это цикл. Выполнять заданное действие ограниченное количество раз, а значит и ограниченное время.

                      Тоесть светодиод мигнёт 1000 раз, и всё?
                      Сообщение отредактировано: bizar -
                        Цитата
                        bizar, 31.01.04, 12:10
                        Тоесть светодиод мигнёт 1000 раз, и всё?
                        Точнее - 500 раз. В цикле одна итерация - зажечь, другая - погасить, т.е. две итерации на одну "вспышку". 1000/2 = 500.
                        Потом снова будет ожидаться нажатие кнопок.

                        Цитата
                        bizar, 31.01.04, 12:10
                        if (Keys = 0) POTRB == 0xfd; //Если Keys равен 0 горит светодиод на RB1
                        Keys внутри цикла for никогда не будет равен 0. Только от 1 до 7 включительно.
                        И этот набор if-ов можно заменить на switch(Keys)
                        P.S. В C и C++ присваивание значения обозначается = , а сравнение на равенство ==
                          ExpandedWrap disabled
                            {
                            switch (Keys == 1) PORTB = 0xfb; //Если Keys равен 1 горит светодиод на RB2
                            switch (Keys == 2) PORTB = 0xf7; // Если Keys равен 2 горит светодиод на RB3
                            else PORTB = 0xf7;
                            }

                          Как ещё можно сделать, Keys = 0?
                          trainer, у тебя в примере, Keys от ноля до 2, можно было сделать от 1 до 3, или нет?
                          Чтобы такого гимара не было как в for не может Keys = 0.
                            Цитата
                            bizar, 1.02.04, 10:59
                            Как ещё можно сделать, Keys = 0?
                            А зачем? Почему именно 0, а не, например, 1?

                            Цитата
                            bizar, 1.02.04, 10:59
                            у тебя в примере, Keys от ноля до 2
                            Не от 0 до 2, а три бита(с №0 по №2) - семь ненулевых значений(1,2,3,4,5,6,7).

                            Добавлено в :
                            ExpandedWrap disabled
                              switch( Keys ) {
                                 case 1:
                                    PORTB = 0xfb; //Если Keys равен 1 горит светодиод на RB2
                                    break;
                                 case 2:
                                    PORTB = 0xf7; // Если Keys равен 2 горит светодиод на RB3
                                    break;
                                 case 3:
                                    // другое действие
                                    break;
                                 case 4:
                                    // другое действие
                                    break;
                                 case 5:
                                    // другое действие
                                    break;
                                 case 6:
                                    // другое действие
                                    break;
                                 case 7:
                                    // другое действие
                              }
                              У нас же 3 кнопки почему case - 7 значений? :mellow:
                                Цитата
                                bizar, 2.02.04, 11:52
                                У нас же 3 кнопки почему case - 7 значений?
                                Потому что каждой кнопке соответствует один бит, три кнопки - три бита. Могут быть нажаты и две и три кнопки одновременно. Всего комбинаций нажатий трех кнопок - 7 штук, в двоичном виде так:
                                001
                                010
                                011
                                100
                                101
                                110
                                111
                                Прим.: 1 - кнопка нажата, 0 - нет.
                                Сообщение отредактировано: trainer -
                                  Можно до 7 кнопок замутить?
                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (18) « Первая ... 4 5 [6] 7 8 ...  17 18 все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0503 ]   [ 14 queries used ]   [ Generated: 18.07.25, 21:38 GMT ]