Powtarzanie kodu tylko raz w event(podprogram)

W tym miejscu zadajemy pytania na temat języka C++, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
foreste
User
User
Posty: 113
Rejestracja: niedziela 06 wrz 2015, 19:53
Kontaktowanie:

Powtarzanie kodu tylko raz w event(podprogram)

Postautor: foreste » piątek 14 paź 2016, 09:10

Napotkałem mały problem przy pisaniu programu, problem polega na tym ze nie przychodzi mi do głowy ,jak powtarzać kod

Kod: Zaznacz cały

void clean_state_pin()
{
led[0] = led[1] = led[2] = led[3] = led[4] = led[5] = led[6] = led[7] =1;
}

tylko 1 raz za każdym wybraniem opcji z stąd

Kod: Zaznacz cały

switch(user_input) {
           
       
            case '1':
           
            knight.start();
            clean_state_pin();
                led_knight();
                break;
            case '2':
                clean_state_pin();
                knight.start();
                led_knight2();
                break;

            case '3':
                knight.start();
                knight3();
                break;
           
            case '4':
                knight.start();
                police_light();
                break;
               
            case '5':
                knight.start();
                police_light2();
                break;
           
        }

wyjaśnienie;
Potrzebuje zgasić wszystkie ledy po wybraniu nowej opcji ale tylko 1 raz przed właściwym zadaniem , jeśli jest wygaszane cały czas diody słabiej o polowe emitują światło
dodam ze myślałem o while i do while ale nie wychodziło jak bym tego chciał
Morze ktoś ma lepsze rozwiązanie tego
tutaj zamieszczam czały kod

Kod: Zaznacz cały

#include "mbed.h"

Serial rs232(USBTX, USBRX);

DigitalOut led[8] {PC_3, PC_2, PA_1, PA_0, PA_15, PC_12, PC_13, PB_7};
Timer knight, tree;
char user_input = 0;
int licznik = 0;
void ledintilize()
{
    for(int x=0; x<8; x++) {
        led[x] = 1;
    }
}
void led_knight()
{
    switch(knight.read_ms()) {
        case 500:
            led[0] = 0;
            break;
        case 1000:
            led[0] = 1;
            led[1] = 0;
            break;
        case 1500:
            led[1] = 1;
            led[2] = 0;
            break;
        case 2000:
            led[2] = 1;
            led[3] = 0;
            break;
        case 2500:
            led[3] = 1;
            led[4] = 0;
            break;
        case 3000:
            led[4] = 1;
            led[5] = 0;
            break;
        case 3500:
            led[5] = 1;
            led[6] = 0;
            break;
        case 5000:
            led[6] = 1;
            led[7] = 0;
            break;
        case 5200:
            led[7] = 1;
            knight.reset();
            break;
    }
}

void led_knight2()
{
    switch(knight.read_ms()) {
        case 500:
            led[0] = 0;
            break;
        case 1000:
            led[0] = 1;
            led[1] = 0;
            break;
        case 1500:
            led[1] = 1;
            led[2] = 0;
            break;
        case 2000:
            led[2] = 1;
            led[3] = 0;
            break;
        case 2500:
            led[3] = 1;
            led[4] = 0;
            break;
        case 3000:
            led[4] = 1;
            led[5] = 0;
            break;
        case 3500:
            led[5] = 1;
            led[6] = 0;
            break;
        case 4000:
            led[6] = 1;
            led[7] = 0;
            break;
        case 4500:
            led[7] = 1;
            break;

        case 5000:
            led[7] = 1;
            led[6] = 0;
            break;
        case 5500:
            led[6] = 1;
            led[5] = 0;
            break;
        case 6000:
            led[5] = 1;
            led[4] = 0;
            break;
        case 6500:
            led[4] = 1;
            led[3] = 0;
            break;
        case 7000:
            led[3] = 1;
            led[2] = 0;
            break;
        case 7500:
            led[2] = 1;
            led[1] = 0;
            break;
        case 8000:
            led[1] = 1;
            led[0] = 0;
            break;
        case 8500:
            led[0] = 1;
            knight.reset();
            break;
    }

}
void  knight3()
{
    switch(knight.read_ms()) {
        case 5000:
            led[7] = 1;
            led[6] = 0;
            break;
        case 5500:
            led[6] = 1;
            led[5] = 0;
            break;
        case 6000:
            led[5] = 1;
            led[4] = 0;
            break;
        case 6500:
            led[4] = 1;
            led[3] = 0;
            break;
        case 7000:
            led[3] = 1;
            led[2] = 0;
            break;
        case 7500:
            led[2] = 1;
            led[1] = 0;
            break;
        case 8000:
            led[1] = 1;
            led[0] = 0;
            break;
        case 8500:
            led[0] = 1;
            knight.reset();
            break;
    }
}

void police_light()
{
if(knight.read_ms() >= 200)
{
    led[4] = led[5] = led[6] = led[7] = 1;
    led[0] = led[1] = led[2] = led[3] = 0;
if(knight.read_ms() >= 400)
{
    led[0] = led[1] = led[2] = led[3] = 1;
    led[4] = led[5] = led[6] = led[7] = 0;
    knight.reset();
}
}
}

void police_light2()
{
if(knight.read_ms() >= 200)
{
    led[1] = led[3] = led[5] = led[7] = 1;
    led[0] = led[2] = led[4] = led[6] = 0;
if(knight.read_ms() >= 400)
{
    led[0] = led[2] = led[4] = led[6] = 1;
   led[1] = led[3] = led[5] = led[7] = 0;
    knight.reset();
}
}
}

void clean_state_pin()
{


led[0] = led[1] = led[2] = led[3] = led[4] = led[5] = led[6] = led[7] =1;
}




void rs232in()
{
    if(rs232.readable()) {
        user_input = rs232.getc();
    }
}
int main()
{
    ledintilize();
    rs232.attach(&rs232in);

    while(1) {



        switch(user_input) {
           
       
            case '1':
           
            knight.start();
            clean_state_pin();
                led_knight();
                break;
            case '2':
                clean_state_pin();
                knight.start();
                led_knight2();
                break;

            case '3':
                knight.start();
                knight3();
                break;
           
            case '4':
                knight.start();
                police_light();
                break;
               
            case '5':
                knight.start();
                police_light2();
                break;
           
        }
    }
}
♫,♫.¨♫

jerrylu
Posty: 27
Rejestracja: wtorek 12 sty 2016, 17:33

Re: Powtarzanie kodu tylko raz w event(podprogram)

Postautor: jerrylu » piątek 14 paź 2016, 15:14

Do tego ocelu służą flagi.
Np. dajesz zmienną w funkcji clean_state_pin(): static uint8_t cleaned = 0;
Dajesz warunek:

Kod: Zaznacz cały

if (cleaned) return;
else cleaned = 1;
led[0] = led[1] = led[2] = led[3] = led[4] = led[5] = led[6] = led[7] =1;

Awatar użytkownika
foreste
User
User
Posty: 113
Rejestracja: niedziela 06 wrz 2015, 19:53
Kontaktowanie:

Re: Powtarzanie kodu tylko raz w event(podprogram)

Postautor: foreste » sobota 15 paź 2016, 19:22

Problem rozwiązałem dodajac do bloków case na poczatku

Kod: Zaznacz cały

led[0] = led[1] = led[2] = led[3] = led[4] = led[5] = led[6] = led[7] =1;


Kod: Zaznacz cały

#include "mbed.h"

Serial rs232(USBTX, USBRX);

DigitalOut led[8] {PC_3, PC_2, PA_1, PA_0, PA_15, PC_12, PC_13, PB_7};
Timer knight, tree;
char user_input = 0;
void ledintilize()
{
    for(int x=0; x<8; x++) {
        led[x] = 1;
    }
}
void pin_clear_state()
{
 led[0] = led[1] = led[2] = led[3] = led[4] = led[5] = led[6] = led[7] = 1;
}
void led_knight()
{
    switch(knight.read_ms()) {
        case 500:
        pin_clear_state();
            led[0] = 0;
            break;
        case 1000:
            led[0] = 1;
            led[1] = 0;
            break;
        case 1500:
            led[1] = 1;
            led[2] = 0;
            break;
        case 2000:
            led[2] = 1;
            led[3] = 0;
            break;
        case 2500:
            led[3] = 1;
            led[4] = 0;
            break;
        case 3000:
            led[4] = 1;
            led[5] = 0;
            break;
        case 3500:
            led[5] = 1;
            led[6] = 0;
            break;
        case 4000:
            led[6] = 1;
            led[7] = 0;
            break;
        case 4500:
            led[7] = 1;
            knight.reset();
            break;
    }
}

void led_knight2()
{
    switch(knight.read_ms()) {
        case 500:
         pin_clear_state();
            led[0] = 0;
            break;
        case 1000:
            led[0] = 1;
            led[1] = 0;
            break;
        case 1500:
            led[1] = 1;
            led[2] = 0;
            break;
        case 2000:
            led[2] = 1;
            led[3] = 0;
            break;
        case 2500:
            led[3] = 1;
            led[4] = 0;
            break;
        case 3000:
            led[4] = 1;
            led[5] = 0;
            break;
        case 3500:
            led[5] = 1;
            led[6] = 0;
            break;
        case 4000:
            led[6] = 1;
            led[7] = 0;
            break;
        case 4500:
            led[7] = 1;
            break;

        case 5000:
            led[7] = 1;
            led[6] = 0;
            break;
        case 5500:
            led[6] = 1;
            led[5] = 0;
            break;
        case 6000:
            led[5] = 1;
            led[4] = 0;
            break;
        case 6500:
            led[4] = 1;
            led[3] = 0;
            break;
        case 7000:
            led[3] = 1;
            led[2] = 0;
            break;
        case 7500:
            led[2] = 1;
            led[1] = 0;
            break;
        case 8000:
            led[1] = 1;
            led[0] = 0;
            break;
        case 8500:
            led[0] = 1;
            knight.reset();
            break;
    }

}
void  knight3()
{
    switch(knight.read_ms()) {
        case 500:
         pin_clear_state();
           // led[7] = 1;
            led[6] = 0;
            break;
        case 1000:
            led[6] = 1;
            led[5] = 0;
            break;
        case 1500:
            led[5] = 1;
            led[4] = 0;
            break;
        case 2000:
            led[4] = 1;
            led[3] = 0;
            break;
        case 25000:
            led[3] = 1;
            led[2] = 0;
            break;
        case 3000:
            led[2] = 1;
            led[1] = 0;
            break;
        case 35000:
            led[1] = 1;
            led[0] = 0;
            break;
        case 4000:
            led[0] = 1;
            knight.reset();
            break;
    }
}

void police_light()
{
if(knight.read_ms() >= 200)
{
 pin_clear_state();
    //led[4] = led[5] = led[6] = led[7] = 1;
    led[0] = led[1] = led[2] = led[3] = 0;
if(knight.read_ms() >= 400)
{
    led[0] = led[1] = led[2] = led[3] = 1;
    led[4] = led[5] = led[6] = led[7] = 0;
    knight.reset();
}
}
}

void police_light2()
{
if(knight.read_ms() >= 200)
{
 pin_clear_state();
    //led[1] = led[3] = led[5] = led[7] = 1;
    led[0] = led[2] = led[4] = led[6] = 0;
if(knight.read_ms() >= 400)
{
    led[0] = led[2] = led[4] = led[6] = 1;
   led[1] = led[3] = led[5] = led[7] = 0;
    knight.reset();
}
}
}



void rs232in()
{
    if(rs232.readable()) {
        user_input = rs232.getc();
    }
}
int main()
{
    ledintilize();
    rs232.attach(&rs232in);

    while(1) {



        switch(user_input) {
           
       
            case '1':
           
            knight.start();
                led_knight();
                break;
            case '2':
               
                knight.start();
                led_knight2();
                break;

            case '3':
                knight.start();
                knight3();
                break;
           
            case '4':
                knight.start();
                police_light();
                break;
               
            case '5':
                knight.start();
                police_light2();
                break;
           
        }
    }
}
♫,♫.¨♫


Wróć do „Pisanie programów w C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości