// příklad detekce stisku tlačítka s ošetřením zákmitů pomocí milis // každých 25ms přečte stav tlačítka, porovná s předchozím stavem a reaguje na stisknutí // lze použít pokud v hlavní smyčce není žádný proces který by dlouhodobě (víc jak cca 25ms) blokoval vlákno. #include "stm8s.h" #include "milis.h" #define SCAN_PERIOD 25 // čas mezi skenováním stavů tlačítek (v ms) void scan_buttons(void); void main(void){ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // 16MHz z interního RC oscilátoru init_milis(); GPIO_Init(GPIOE,GPIO_PIN_4,GPIO_MODE_IN_PU_NO_IT); // inicializovat pin tlačítka //GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_SLOW); // LEDka pro modelový příklad "nějaké akce" while (1){ scan_buttons(); // obsluhuj skenování tlačítek // dělej další "procesy" } } // po uplynutí každých SCAN_PERIOD skenuje stav tlačítka (tlačítek) a reaguje na stisk void scan_buttons(void){ static uint16_t last_time=0; // kdy naposled jsme stav tlačítek skenovali static bool last_button_status=1; // minuly stav tlačítka (0=stisk, 1=uvolněno) if((milis() - last_time) > SCAN_PERIOD){ // pokud uplynul požadovaný čas, tak skenujeme stav tlačítek last_time = milis(); // zapamatuj si kdy jsi skenoval stav tlačítek // bylo tlačítko minule uvolněné a teď je stisknuté ? if(GPIO_ReadInputPin(GPIOE,GPIO_PIN_4)==RESET && last_button_status==1){ last_button_status = 0; // zapamatuj si že teď je tlačítko stisknuté // udělej nějakou akci // GPIO_WriteReverse(GPIOC,GPIO_PIN_5); // nějaká akce - přepnutí LED } // pokud je tlačítko uvolněné, zapamatuj si to if(GPIO_ReadInputPin(GPIOE,GPIO_PIN_4)!=RESET){last_button_status=1;} } }