както ви бях обещал, ето и сорс кода за примера с инкреметирането на променлива при натискане на бутон от предния пример. другите файлове във проекта са същите. тук е само main.c файла със кода за подаване на командата от бутона и промяната на стойността на номера на програмата. разгледайте внимателно кода, като отбележите че за да промените ефекта със следващия ще трябва да задържите бутона докато свърши текущия ефект. това е така защото по време на изпълнение на текущия ефект не се прави проверка дали е натиснат бутона.

за това докато не свърши даден ефект във текущата подпрограма IF основната програма MAIN не прави проверка дали е натиснат бутона.

ако във вашите програми се налага да се променят подпрограмите дори и по време на изпълнение на текущата подпрограма, ще се наложи да използвате хардуерно прекъсване на бутона, или така наречените ПРЕКЪСВАНЕ ПРИ ПРОМЯНА НА СЪСТОЯНИЕТО / INTERRUPT OF CHANGE - IOC/. тази хардуерна функция я имат повечето нови процесори на почти всички пинове, като това е важно за приложения при бързи управления на механики, възли и многопоточни линии от машинни възли.

как се работи със хардуерните прекъдвания ще разгледаме във следващите уроци за програмирането на процесорите.



--------------  main.c   --------------------------
#include <xc.h>
#include "main.h"
#include "fuse.h"
#include "initcpu.h"

unsigned char program = 1; //number of start efect

void main(void) // start main function
{    init_cpu(); // hardware initialization
                // of cpu modules
    
 while(1) // start loop when 1=1 is always true
 {    if(button1 == 1) // chek button if is pressed
     { __delay_ms(200); // wait for prove button
      program = program + 1;} // increment program value
    
    if(program > 5) // check value for max edge
    {program = 1;} // if is max set to start count
    
    if(program == 1) // if value is 1 play efect 1
    {
        led8 = 1;__delay_ms(200);
        led8 = 0;__delay_ms(200);
        led9 = 1;__delay_ms(200);
        led9 = 0;__delay_ms(200);
        led10 = 1;__delay_ms(200);
        led10 = 0;__delay_ms(200);
        led11 = 1;__delay_ms(200);
        led11 = 0;__delay_ms(200);
        led12 = 1;__delay_ms(200);
        led12 = 0;__delay_ms(200);
        led13 = 1;__delay_ms(200);
        led13 = 0;__delay_ms(200);
        led14 = 1;__delay_ms(200);
        led14 = 0;__delay_ms(200);
        led15 = 1;__delay_ms(200);
        led15 = 0;__delay_ms(200);
    }
        
    if(program == 2) // if value is 2 play efect 2
    {
        led8 = 1;led9 = 1;led10 = 1;led11 = 1;
        led12 = 1;led13 = 1;led14 = 1;led15 = 1;
        __delay_ms(200);
        led8 = 0;led9 = 0;led10 = 0;led11 = 0;
        led12 = 0;led13 = 0;led14 = 0;led15 = 0;
        __delay_ms(200);
    }

    if(program == 3) // if value is 3 play efect 3
    {
        led8 = 1;__delay_ms(200);
        led9 = 1;__delay_ms(200);
        led10 = 1;__delay_ms(200);
        led11 = 1;__delay_ms(200);
        led12 = 1;__delay_ms(200);
        led13 = 1;__delay_ms(200);
        led14 = 1;__delay_ms(200);
        led15 = 1;__delay_ms(200);
        led8 = 0;__delay_ms(200);
        led9 = 0;__delay_ms(200);
        led10 = 0;__delay_ms(200);
        led11 = 0;__delay_ms(200);
        led12 = 0;__delay_ms(200);
        led13 = 0;__delay_ms(200);
        led14 = 0;__delay_ms(200);
        led15 = 0;__delay_ms(200);
    }
        
        if(program == 4)
    {
        led8 = 1;__delay_ms(200);
        led15 = 1;__delay_ms(200);
        led9 = 1;__delay_ms(200);
        led14 = 1;__delay_ms(200);
        led10 = 1;__delay_ms(200);
        led13 = 1;__delay_ms(200);
        led11 = 1;__delay_ms(200);
        led12 = 1;__delay_ms(200);
        led8 = 0;__delay_ms(200);
        led15 = 0;__delay_ms(200);
        led9 = 0;__delay_ms(200);
        led14 = 0;__delay_ms(200);
        led10 = 0;__delay_ms(200);
        led13 = 0;__delay_ms(200);
        led11 = 0;__delay_ms(200);
        led12 = 0;__delay_ms(200);
    }
    
    if(program == 5)
    {
        led15 = 1;__delay_ms(200);
        led14 = 1;__delay_ms(200);
        led13 = 1;__delay_ms(200);
        led12 = 1;__delay_ms(200);
        led11 = 1;__delay_ms(200);
        led10 = 1;__delay_ms(200);
        led9 = 1;__delay_ms(200);
        led8 = 1;__delay_ms(200);
        led15 = 0;__delay_ms(200);
        led14 = 0;__delay_ms(200);
        led13 = 0;__delay_ms(200);
        led12 = 0;__delay_ms(200);
        led11 = 0;__delay_ms(200);
        led10 = 0;__delay_ms(200);
        led9 = 0;__delay_ms(200);
        led8 = 0;__delay_ms(200);
    }    
        
    } // end while
    return;
} //end main