Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * avtomat2.c
- *
- * Created: 30.01.2022 22:59:32
- * Author : rockd
- */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #define BLINK_DDR DDRB
- #define BLINK_PORT PORTB
- #define BLINK_PIN PINB
- #define BLINK1 PB0
- #define BLINK2 PB1
- #define BLINK3 PB2
- #define BLINK4 PB3
- #define BUTTON_PIN PINC
- #define BUTTON PC0
- 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 (!(BUTTON_PIN&(1<<BUTTON))) // если кнопка нажата
- {
- status=1;// уходим в статус 1
- press=now;// запоминаем время нажатия
- }
- break;
- case 1:// учет времени удеражания кнопки
- if (BUTTON_PIN&(1<<BUTTON))// если кнопка уже отжата
- {
- 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 (BUTTON_PIN&(1<<BUTTON)) status=0;// когда на пине 1 уходим в статус 0
- break;
- }
- }
- uint8_t button_stat(void)
- {
- uint8_t a=clk;
- clk=0;
- return a;
- }
- // инициализация блинков
- void blink_ini(void){
- BLINK_DDR|=(1<<BLINK1) | (1<<BLINK2) | (1<<BLINK3) | (1<<BLINK4);
- }
- 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;
- }
- BLINK_PORT&=~(1<<BLINK4);
- break;
- case 1:// светодиод включен
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=0;
- if (but==10) status=2;
- }
- BLINK_PORT|=(1<<BLINK4);
- break;
- case 2:// светодиод мигает
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=0;
- if (but==10) status=1;
- }
- if ( (uint8_t) (now-change)<10) break;
- BLINK_PORT^=(1<<BLINK4);
- change=now;
- break;
- }
- }
- void blink_KA3(uint8_t on_time, uint8_t off_time){
- static uint8_t status, change;
- uint8_t now=tikies();
- switch (status)
- {
- case 0:
- BLINK_PORT^=(1<<BLINK3);// переключаем состояние пина светодиода
- change=now;//запоминаем время переключения
- if (BLINK_PIN&(1<<BLINK3)) status=1;// если на пине 1 уходим в статус 1
- else status=2;//иначе уходим в статус 2
- break;
- case 1:// ждем когда кончится время включения
- if ( (uint8_t) (now-change)>=on_time) status=0;
- break;
- case 2:// ждем когда кончится время выключения
- if ( (uint8_t) (now-change)>=off_time) status=0;
- break;
- }
- }
- void blink_KA2(uint8_t on_time, uint8_t off_time){
- static uint8_t status, change;
- uint8_t now=tikies();
- switch (status)
- {
- case 0:
- BLINK_PORT&=~(1<<BLINK2);// выключить светодиод
- change=now;//запомнить время выключения
- status=1;//уходим в статус 1
- break;
- case 1:// ждем пока кончится время выключения и уходим в статус 2
- if ( (uint8_t) (now-change)>=off_time) status=2;
- break;
- case 2:
- BLINK_PORT|=(1<<BLINK2);// включить свеиодиод
- change=now;//запомнить время включения
- status=3;//уходим в статус 3
- break;
- case 3:// ждем пока кончится время включения и уходим в статус 0
- if ( (uint8_t) (now-change)>=on_time) status=0;
- break;
- }
- }
- void blink_KA(void){
- static uint8_t status, change;
- uint8_t now=tikies();
- switch (status)
- {
- case 0:
- if ( (uint8_t) (now-change)<30) break; // если время не вышло - выход
- BLINK_PORT|=(1<<BLINK1);// иначе включить светодиод
- change=now;// запомнить время включения
- status=1;// уходим в статус 1
- break;
- case 1:
- if ( (uint8_t) (now-change)<30) break; // если время не вышло - выход
- BLINK_PORT&=~(1<<BLINK1);// иначе выключить светодиод
- change=now;// запомнить время выключения
- status=0;// уходим в статус 0
- break;
- }
- }
- int main(void)
- {
- blink_ini(); // инициализация блинков
- timer_ini();// инициализация таймера
- sei();// глобально разрешить прерывания
- while (1)
- {
- blink_KA();
- blink_KA2(10,30);
- blink_KA3(10,10);
- blink_click_KA();
- button_KA();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment