uuu000

avtomat3

Jan 30th, 2022
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. /*
  2. * avtomat3.c
  3. *
  4. * Created: 30.01.2022 23:12:43
  5. * Author : rockd
  6. */
  7.  
  8. /*
  9. * avtomat2.c
  10. *
  11. * Created: 30.01.2022 22:59:32
  12. * Author : rockd
  13. */
  14. #define F_CPU 1000000UL
  15. #include <avr/io.h>
  16. #include <avr/interrupt.h>
  17.  
  18. uint8_t clk;// флаг клика
  19. uint8_t tiki;// глобальные тики
  20.  
  21. // обработчик прерывания по переполнению. ~61гц
  22. ISR(TIMER0_OVF_vect)
  23. {
  24. tiki++;
  25. }
  26.  
  27. // инициализация таймера
  28. void timer_ini(void)
  29. {
  30. TCCR0|=(1<<CS01) | (1<<CS00);// запуск таймера 0 с делителем 64
  31. TIMSK|=(1<<TOIE0);// разрешить прерывание по переполнению
  32. }
  33.  
  34. // получить тики
  35. uint8_t tikies(void)
  36. {
  37. return tiki;
  38. }
  39.  
  40. void button_KA(void)
  41. {
  42. static uint8_t status, press;
  43. uint8_t now=tikies();// получаем текущее время
  44.  
  45. switch (status)
  46. {
  47. case 0:// опрос кнопки
  48. if (!(PINC&(1<<PC0))) // если кнопка нажата
  49. {
  50. status=1;// уходим в статус 1
  51. press=now;// запоминаем время нажатия
  52. }
  53. break;
  54.  
  55.  
  56. case 1:// учет времени удеражания кнопки
  57. if (PINC&(1<<PC0))// если кнопка уже отжата
  58. {
  59. if ((uint8_t) (now-press)>=3)
  60. {
  61. clk=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
  62. status=0;// уходим в статус 0
  63. }
  64.  
  65. }
  66. else // иначе, кнопка всё еще удерживается
  67. {
  68. if ((uint8_t) (now-press)>=61)
  69. {
  70. // если удерживается уже достаточно долго
  71. clk=10;// поднимаем флаг длинного клика
  72. status=2;// уходим в статус 2
  73. }
  74. }
  75. break;
  76.  
  77.  
  78. case 2:// ждем пока кнопку отпустят
  79. if (PINC&(1<<PC0)) status=0;// когда на пине 1 уходим в статус 0
  80. break;
  81. }
  82. }
  83.  
  84. uint8_t button_stat(void)
  85. {
  86. uint8_t a=clk;
  87. clk=0;
  88. return a;
  89. }
  90.  
  91. // инициализация блинк
  92. void blink_ini(void)
  93. {
  94. DDRB|=(1<<PB3);
  95. }
  96.  
  97. void blink_click_KA(void)
  98. {
  99. static uint8_t status, change;
  100. uint8_t now=tikies();// текущее "время"
  101. uint8_t but=button_stat();// получение событий от кнопки
  102.  
  103. switch (status)
  104. {
  105. case 0:// светодиод выключен
  106. if (but)// если было нажатие меняем статус.
  107. {
  108. if (but==1) status=1;
  109. if (but==10) status=2;
  110. }
  111. PORTB&=~(1<<PB3);
  112. break;
  113.  
  114. case 1:// светодиод включен
  115. if (but)// если было нажатие меняем статус.
  116. {
  117. if (but==1) status=0;
  118. if (but==10) status=2;
  119. }
  120. PORTB|=(1<<PB3);
  121. break;
  122.  
  123. case 2:// светодиод мигает
  124. if (but)// если было нажатие меняем статус.
  125. {
  126. if (but==1) status=0;
  127. if (but==10) status=1;
  128. }
  129. if ( (uint8_t) (now-change)<10) break;
  130. PORTB^=(1<<PB3);
  131. change=now;
  132. break;
  133. }
  134. }
  135.  
  136. int main(void)
  137. {
  138. blink_ini(); // инициализация блинков
  139. timer_ini();// инициализация таймера
  140. sei();// глобально разрешить прерывания
  141.  
  142. while (1)
  143. {
  144. blink_click_KA();
  145. button_KA();
  146. }
  147. }
  148.  
  149.  
  150.  
Advertisement
Add Comment
Please, Sign In to add comment