Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * avtomat3.c
- *
- * Created: 30.01.2022 23:12:43
- * Author : rockd
- */
- /*
- * avtomat2.c
- *
- * Created: 30.01.2022 22:59:32
- * Author : rockd
- */
- #define F_CPU 1000000UL
- #include <avr/io.h>
- #include <avr/interrupt.h>
- uint8_t clk;// флаг клика
- uint8_t tiki;// глобальные тики
- // обработчик прерывания по переполнению. ~61гц
- ISR(TIMER0_OVF_vect)
- {
- tiki++;
- }
- // инициализация таймера
- void timer_ini(void)
- {
- TCCR0|=(1<<CS01) | (1<<CS00);// запуск таймера 0 с делителем 64
- TIMSK|=(1<<TOIE0);// разрешить прерывание по переполнению
- }
- // получить тики
- uint8_t tikies(void)
- {
- return tiki;
- }
- void button_KA(void)
- {
- static uint8_t status, press;
- uint8_t now=tikies();// получаем текущее время
- switch (status)
- {
- case 0:// опрос кнопки
- if (!(PINC&(1<<PC0))) // если кнопка нажата
- {
- status=1;// уходим в статус 1
- press=now;// запоминаем время нажатия
- }
- break;
- case 1:// учет времени удеражания кнопки
- if (PINC&(1<<PC0))// если кнопка уже отжата
- {
- if ((uint8_t) (now-press)>=3)
- {
- clk=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
- status=0;// уходим в статус 0
- }
- }
- else // иначе, кнопка всё еще удерживается
- {
- if ((uint8_t) (now-press)>=61)
- {
- // если удерживается уже достаточно долго
- clk=10;// поднимаем флаг длинного клика
- status=2;// уходим в статус 2
- }
- }
- break;
- case 2:// ждем пока кнопку отпустят
- if (PINC&(1<<PC0)) status=0;// когда на пине 1 уходим в статус 0
- break;
- }
- }
- uint8_t button_stat(void)
- {
- uint8_t a=clk;
- clk=0;
- return a;
- }
- // инициализация блинк
- void blink_ini(void)
- {
- DDRB|=(1<<PB3);
- }
- void blink_click_KA(void)
- {
- static uint8_t status, change;
- uint8_t now=tikies();// текущее "время"
- uint8_t but=button_stat();// получение событий от кнопки
- switch (status)
- {
- case 0:// светодиод выключен
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=1;
- if (but==10) status=2;
- }
- PORTB&=~(1<<PB3);
- break;
- case 1:// светодиод включен
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=0;
- if (but==10) status=2;
- }
- PORTB|=(1<<PB3);
- break;
- case 2:// светодиод мигает
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=0;
- if (but==10) status=1;
- }
- if ( (uint8_t) (now-change)<10) break;
- PORTB^=(1<<PB3);
- change=now;
- break;
- }
- }
- int main(void)
- {
- blink_ini(); // инициализация блинков
- timer_ini();// инициализация таймера
- sei();// глобально разрешить прерывания
- while (1)
- {
- blink_click_KA();
- button_KA();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment