Перейти к содержанию
    

Как сократить код на C++

Ув. электронщики. в данный момент изучая AVR столкнулся с проблемой, значится так. Если условие выполняется то выполняется код

PORTC.0=1;

wait1();

PORTC.1=1;

wait1();

PORTC.2=1;

wait1();

PORTC.3=1;

wait1();

PORTC.4=1;

wait1();

PORTC.5=1;

wait1();

PORTC.6=1;

wait1();

PORTC.7=1;

wait1();

{

 

Подскажите как можно сократить данный код, смысл в том чтоб все лампы зажигались по очереди, затем гасли, спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смысл в том чтоб все лампы зажигались по очереди, затем гасли, спасибо

 

uint8_t Tmp = 0;
for(;;)
{
   if(Tmp & (1<<7))
       Tmp = Tmp << 1;
   else
       Tmp = (Tmp << 1) | 1;
   PORTC = Tmp;
   delay_1s();
}

 

Но при чем тут С++?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

извините, зря дописал ++

 

Теперь ругается missing ( в этой строчке uint8_t Tmp = 0;

 

 

unsigned char mask;
for (mask = 0x01; mask; mask <<= 1)
{
    PORTC=mask;
    wait1();
}

Так то работает но смысл в том чтоб загорелся первый, затем второй но первый продолжал гореть и.т.д . а вконце задержка и в обратном порядке потух первый остальные горят, за ним второй, остальные горят ....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так то работает но смысл в том чтоб загорелся первый, затем второй но первый продолжал гореть и.т.д . а вконце задержка и в обратном порядке потух первый остальные горят, за ним второй, остальные горят ....

 

unsigned char mask;
for(;;)  // бесконечный цикл
{
    // сначала зажигаем все
    for (mask = 0x01; mask; mask <<= 1)
    {
        PORTC |= mask;
        wait1();
    }

    // задержка
    wait1();
    wait1();
    wait1();

    // теперь гасим (в том же направлении)
    for (mask = 0xF7; mask; mask <<= 1)
// этот вариант для противоположного направления
//    for (mask = 0x7F; mask; mask >>= 1)
    {
        PORTC &= mask;
        wait1();
    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может вам сразу весь курсовик написать? Своими мозгами не пошевелить?

к сожалению универ уже закончил ) + это не курсовик, на досуге увидел у друга как подсветка на машине поочередно включается, сначала, стрелки, затем в кнопочках свет, затем приборы и решил повторить

 

unsigned char mask;
for(;;)  // бесконечный цикл
{
    // сначала зажигаем все
    for (mask = 0x01; mask; mask <<= 1)
    {
        PORTC |= mask;
        wait1();
    }

    // задержка
    wait1();
    wait1();
    wait1();

    // теперь гасим (в том же направлении)
    for (mask = 0xF7; mask; mask <<= 1)
// этот вариант для противоположного направления
//    for (mask = 0x7F; mask; mask >>= 1)
    {
        PORTC &= mask;
        wait1();
    }
}

 

 

Вам огромное спасибо, теперь есть от чего оттолкнутся в дальнейшем. Спасибо

 

Моделирую в протеусе ) теперь столкнулся с проблемой for (mask = 0xF7; mask; mask <<= 1) светодиоды тухнут не поочередно а как попало, если сделать for (mask = 0xFF; mask; mask <<= 1) то тухнут поочередно но последний остается гореть ) в чем может быть подвох

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Моделирую в протеусе ) теперь столкнулся с проблемой for (mask = 0xF7; mask; mask <<= 1) светодиоды тухнут не поочередно а как попало, если сделать for (mask = 0xFF; mask; mask <<= 1) то тухнут поочередно но последний остается гореть ) в чем может быть подвох

Да, поторопился.

Вот так правильно:

    // теперь гасим (в том же направлении)
    for (mask = 0x01; mask; mask <<= 1)
//   для противоположного направления:
    //for (mask = 0x80; mask; mask >>= 1)
    {
        PORTC &= ~mask;
        wait1();
    }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А - так?

for(uint16_t mask = 0x00ff; mask; mask <<= 1) {
  PORTC = (uint8_t)(mask>>8);
  wait1();
}

upd. Здесь есть ошибочка, остается единица в старшем бите порта.

Тогда так:

  uint16_t mask = 0x01fe;
  do {
    PORTC = (uint8_t)(mask >> 8);
    wait1();
  } while (mask <<= 1);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для Xenia

Красивенько, только вот так правильнее будет:

PORTC = 1; do wait1(); while ((PORTC += PORTC + 1) < 0xff);

И это еще полдела.

И в книжках-даташитах пугают, что при чтении из порта можно прочитать совсем не то, что записали. :)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И в книжках-даташитах пугают, что при чтении из порта можно прочитать совсем не то, что записали. :)
Врут:) В примере Ксении считывается PORTC а не PINC, так что всё ок!

 

PORTC = 0;
do // on loop
{
    wait1();
}
while ((PORTC = (PORTC<<1)^1) < 0xff);

do // off loop
{
    wait1();
} while ((PORTC >>= 1) > 0x00);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь ругается missing ( в этой строчке uint8_t Tmp = 0;
missing что? Вам тяжело скопировать все сообщение целиком а мы тут должны телепатировать - что же там написано после missing?

замените uint8_t на unsigned char или впишите в начале файла

#include <stdint.h>

 

 

Врут:) В примере Ксении считывается PORTC а не PINC, так что всё ок!
Но считывается он дважды, что в общем случае - источник граблей. В конкретно этом случае, когда используется весь порт целиком - да, безопасно. Но чревато предупреждением компилятора о неопределенном порядке доступа к volatile - переменным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но считывается он дважды, что в общем случае - источник граблей
С этим согласен. Поэтому и привёл свой пример без граблей (в надежде что порт будет не 6-ти битный:)).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...