// příklad detekce stisku tlačítka s ošetřením zákmitů s pomocí periodického přerušení od timeru // každých 25ms přečte stav tlačítka, porovná s předchozím stavem a reaguje na stisknutí // lze použít i v situaci kdy je v hlavní smyčce nějaký dlouhý blokující proces #include "stm8s.h" #include "milis.h" void scan_buttons(void); void init_timer(void); void main(void){ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // 16MHz z interního RC oscilátoru //init_milis(); init_timer(); // nastavit a spustit timer enableInterrupts(); // povolit přerušení 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){ // dělej nějaké užitečné "procesy" } } // rutina přerušení od timeru (volaná periodicky každých 25ms) INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHandler, 15){ TIM3_ClearFlag(TIM3_FLAG_UPDATE); // vyčistit vlajku přerušení scan_buttons(); // scanovat tlačítka } void init_timer(void){ TIM3_TimeBaseInit(TIM3_PRESCALER_16,25000); // děličeka timeru 16, perioda timeru 25ms TIM3_ITConfig(TIM3_IT_UPDATE,ENABLE); // povolit přerušení od přetečení TIM3_Cmd(ENABLE); // spustit timer } // skenuje stav tlačítka (tlačítek) a reaguje na stisk void scan_buttons(void){ static bool last_button_status=1; // minuly stav tlačítka (0=stisk, 1=uvolněno) // 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;} }