На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (18) « Первая ... 5 6 [7] 8 9 ...  17 18 все  ( Перейти к последнему сообщению )  
    > Разбираемся с IAR , Обсуждаем небольшие коды на IAR.
      Цитата
      bizar, 2.02.04, 13:42
      Можно до 7 кнопок замутить?
      Можно сколько угодно. Лишь бы портов хватило. В существующем варианте 3 кнопки, для которых существует 7 комбинаций нажатий.
        нет, 3-входа=7 возможных состояний

        Добавлено в :
        ссори, уже ответили:)
          Типа этого?
          Прикреплённый файлПрикреплённый файл____2.rar (5.18 Кбайт, скачиваний: 434)
            Прошу прощения за оффтопик, но тут вообще про что? А то интересно стало!
              Цитата
              NadZ, 2.02.04, 22:31
              Прошу прощения за оффтопик, но тут вообще про что? А то интересно стало!
              Да тут bizar пытается осваивать программирование микроконтроллеров на примере создания "мигалки" на МК семейства PIC16

              Добавлено в :
              Цитата
              bizar, 2.02.04, 20:23
              Типа этого?
              Нет. :)
              У тебя три бита(три входа: RA2,RA3,RA4, три кнопки). Сколько у трех бит возможных ненулевых состояний?
              Ответ: 7
              Хочешь больше - добавь еще используемых входов(портов) микроконтроллера. Только придется взять микроконтроллер побольше или совмещать функции выводов в существующем.
                Если нельзя сделать на трёх выводах семь кнопок,
                зачем нужны :huh: 7 :huh: ненулевых состояний?
                  тебе же говорят, ты можешь отслеживать одновременное нажатие кнопок:)
                    Цитата
                    bizar, 3.02.04, 12:26
                    зачем нужны 7 ненулевых состояний?
                    Они не нужны. Они есть. Элементарная двоичная арифметика - слово размером в три двоичных разряда имеет семь состояний, когда хотя бы один бит ненулевой. Не хочешь отслеживать все возможные состояния - не отслеживай. :)
                      Нажимаю на кнопку выполняется зажигание светодиодов,
                      потом нажимаю другую, в исходнике trainer, не должны выполняться
                      другие зажигания, а будет выполняться до конца нажатие первой кнопки????

                      Добавлено в :
                      potor, я смогу нажать две кнопки одновременно и что из этого выйдит?
                        :)
                        Программа опрашивает состояние всех кнопок и ждет пока не будет нажата хотя бы одна из них. Затем в соответствии с их состоянием выполняет некое действие в течение некоторого времени, затем снова опрашивает состояние и т.д..
                        Цитата
                        bizar, 3.02.04, 15:43
                        я смогу нажать две кнопки одновременно и что из этого выйдит?
                        Что напишешь в соответствующем case, то и выйдет.
                          trainer, почему та сказал "нет" :rolleyes: , про схему
                          #93 там-же есть одновременное нажатие 2 кнопок, только в одной кнопки?
                            Потому, что это не решение. В схеме из #93 можно все равно нажать несколько кнопок. Так зачем такой огород городить? Если 3 кнопки обеспечивают то же самое.
                              В #include, нужно указать библиотеку, у меня IAR (PIC), (potor у тебя есть IAR для пик (ты его скачал или нет)) я не знаю какие библиотеки для чего служат, укажите какие/для чего?
                              Фрагменты выделенные :unsure: с двух сторон :unsure: :
                              Можно ли описывать так или нужно ставить break, мне надо одновременно чтобы порты RA и RB гасли светодиоды?
                              ExpandedWrap disabled
                                #include<имя файла, где описан твой пресловутый порт RB, RA>
                                main()
                                     {
                                     volatile unsigned char Keys;
                                     unsigned char mask;
                                     unsigned int i;
                                     TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
                                     PORTA = 0xff;
                                     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-- )
                                                                      {
                                                                       switch( Keys )
                                                                                    {
                                                                                    case 1:
                                                       PORTA = 0x1d; //Если Keys равен 1 горит светодиод на RA1
                                                       break;
                                                       PORTA = 0x1c; //горит RA1 и RA0
                                                       break;
                                                       PORTB = 0x7f; // горит RB7 с RA1 и RA0
                                                       break;
                                                       PORTB = 0x3f; // горит RB7, RB6 (RA1 - 0)
                                                       break;
                                                       PORTB = 0x1f; // горит RB7 - RB5 (RA1 - 0)
                                                       break;
                                                       PORTB = 0xf; // горит RB7 - RB4 (RA1 - 0)
                                                       break;
                                                       PORTB = 0x7; // горит RB7 - RB3 (RA1 - 0)
                                                       break;
                                                       PORTB = 0x3; // горит RB7 - RB2 (RA1 - 0)
                                                       break;
                                                       PORTB = 0x1; // горит RB7 - RB1 (RA1 - 0)
                                                       break;
                                                       PORTB = 0x0; // горит RB7 - RB0 (RA1 - 0)
                                                       //горят все светодиоды
                                                       break;
                                :unsure:               PORTB = 0xff; // гасим светодиоды на RB
                                                       PORTA = 0xff; // гасим светодиоды на RA
                                :unsure:               break;  
                                                       PORTB = 0xfe; // горит RB0
                                                       break;
                                                       PORTB = 0xfc; // горит RB0, RB1
                                                       break;
                                                       PORTB = 0xf8; // горит RB0 - RB2
                                                       break;
                                                       PORTB = 0xf0; // горит RB0 - RB3
                                                       break;
                                                       PORTB = 0xe0; // горит RB0 - RB4
                                                       break;
                                                       PORTB = 0xco; // горит RB0 - RB5
                                                       break;
                                                       PORTB = 0x80; // горит RB0 - RB6
                                                       break;
                                                       PORTB = 0x0; // горит весь RB порт
                                                       break;
                                                       PORTA = 0x1d; // горит RA1 (RB0 - 7)
                                                       break;
                                                       PORTA = 0x1c; // горит RA0, RA1 (RB0 - 7)
                                                       break;
                                :unsure:               PORTA = 0xff; // гасим RA
                                                       POTRB = 0xff; // гасим RB
                                :unsure:               break;
                                                      
                                                                                 case 2: // делаю в виде бегущей туда сюда точки
                                                       PORTA = 0x1d; // Если Keys равен 2 горит светодиод на RA1
                                                       break;
                                                       PORTA = 0x1e; //горит светодиод на RA0                      
                                                       break;
                                :unsure:               PORTA = 0xff; // гасим RA порт
                                                       PORTB = 0x7f; //горит светодиод на RB7
                                :unsure:               break;  
                                                       PORTB = 0xbf; //горит светодиод на RB6
                                                       break;
                                                       PORTB = 0xdf; //горит светодиод на RB5
                                                       break;
                                                       PORTB = 0xef; //горит светодиод на RB4
                                                       break;
                                                       PORTB = 0xf7; //горит светодиод на RB3
                                                       break;
                                                       PORTB = 0xfb; //горит светодиод на RB2
                                                       break;
                                                       PORTB = 0xfd; //горит светодиод на RB1
                                                       break;
                                                       PORTB = 0xfe; //горит светодиод на RB0
                                                       break;
                                                       PORTB = 0xfd; //горит светодиод на RB1
                                                       break;
                                                       PORTB = 0xfb; //горит светодиод на RB2
                                                       break;
                                                       PORTB = 0xf7; //горит светодиод на RB3
                                                       break;
                                                       PORTB = 0xef; //горит светодиод на RB4
                                                       break;
                                                       PORTB = 0xdf; //горит светодиод на RB5
                                                       break;
                                                       PORTB = 0xbf; //горит светодиод на RB6
                                                       break;
                                                       PORTB = 0x7f; //горит светодиод на RB7
                                                       break;
                                :unsure:               PORTB = 0xff; // гасим RB порт
                                                       PORTA = 0x1e; //горит светодиод на RA0
                                :unsure:               break;
                                                       PORTA = 0x1d; //горит светодиод на RA1
                                                       break;
                                                                               }
                                                                     PORTB ^= mask; // инвертируем бит
                                                                     tick(); // делаем небольшую задержку
                                                                    }
                                                    }
                                           }
                                tick() // делаем задержку времени
                                     {
                                      for (unsigned int i = 0xffff; i!=0; i--);
                                      for (unsigned int i = 0xffff; i!=0; i--);
                                      for (unsigned int i = 0xffff; i!=0; i--);
                                      for (unsigned int i = 0xffff; i!=0; i--);
                                     }
                              Сообщение отредактировано: bizar -
                                Слишком уж много у тебя строчек в switch. :)
                                то есть хочется сделать бегущий огонь?
                                ExpandedWrap disabled
                                  #include <pic16f84.h>
                                  /* подпрограмма временной задержки */
                                  void tick(void) {
                                     unsigned int i;
                                     for ( i = 0xffff; i!=0; i--);
                                     for ( i = 0xffff; i!=0; i--);
                                     for ( i = 0xffff; i!=0; i--);
                                     for ( i = 0xffff; i!=0; i--);
                                  }
                                  /* Эта подпрограмма зажигает нулем светодиод на определенном выводе */
                                  void FlashPin(unsigned char pin_code){
                                     switch(pin_code) {
                                        case 0:
                                        case 1:
                                        case 2:
                                        case 3:
                                        case 4:
                                        case 5:
                                        case 6:
                                        case 7:
                                           /* 0-7 - выводы порта B */
                                           PORTB &= 0xfe<<pin_code;
                                           break;
                                        case 8:
                                        case 9:
                                           /* 8,9 - выводы порта A(RA0,RA1) */
                                           PORTA &= 0xfe<<(pin_code-8);
                                     }
                                  }
                                  /* Эта подпрограмма гасит все светодиоды */
                                  void TurnOffPins(void) {
                                     PORTB = 0xff;
                                     PORTA |= 3;
                                  }
                                  /* основная программа */
                                  main() {
                                     volatile unsigned char Keys;
                                     unsigned char counter;
                                     unsigned char i;
                                     unsigned char direction;
                                     TRISA = 4 | 8 | 16; // RA2,RA3,RA4 настраиваем на вход
                                     PORTA = 0x1c;
                                     TRISB = 0;
                                     while(1) {
                                        TurnOffPins();   /* гасим все светодиоды */
                                        do {
                                           tick(); // не будем опрашивать кнопки слишком часто
                                           Keys = (~PORTA) & (4|8|16); // состояние кнопок на RA2-RA4. 1-нажата
                                        } while(Keys == 0);
                                        Keys >>= 2; // нормализуем(сдвигаем). Теперь:
                                                    //  бит 0 - RA2,
                                                    //  бит 1 - RA3,
                                                    //  бит 2 - RA4.
                                        counter = Keys;
                                        direction = -1;   /* направление "движения" */
                                        for( i=1000 ; i != 0 ; i-- ) {
                                           if( counter == Keys ) {
                                              // прошли круг - начанаем двигаться в другую сторону
                                              direction = -direction;
                                           }
                                           TurnOffPins();        /* гасим все светодиоды */
                                           FlashPin(counter);    /* зажигаем определенный */
                                           counter += direction; /* в следующий раз будем зажигать другой */
                                           if( counter == 0xff ) {
                                              /* закольцовываем "снизу" */
                                              counter = 9;
                                           }
                                           if( counter == 10 ) {
                                              /* закольцовываем "сверху" */
                                              counter = 0;
                                           }
                                           tick();  /* пауза - чтобы светодиод погорел немного */
                                        }
                                     }
                                  }
                                Работоспособность не проверял - у меня нет ни IAR EW PIC, ни PIC16F84
                                Что будет не понятно - отвечу.
                                Сообщение отредактировано: trainer -
                                  Цитата

                                  potor у тебя есть IAR для пик (ты его скачал или нет)

                                  скачать то я его скачал, два раза пытался, не проходит у меня его установка, причем на обоих домашних машинах:((
                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (18) « Первая ... 5 6 [7] 8 9 ...  17 18 все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0687 ]   [ 14 queries used ]   [ Generated: 20.05.24, 06:50 GMT ]