uuu000

avtomat2

Jan 30th, 2022
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. /*
  2. * avtomat2.c
  3. *
  4. * Created: 30.01.2022 22:59:32
  5. * Author : rockd
  6. */
  7.  
  8.  
  9. #include <avr/io.h>
  10. #include <avr/interrupt.h>
  11.  
  12. #define BLINK_DDR DDRB
  13. #define BLINK_PORT PORTB
  14. #define BLINK_PIN PINB
  15. #define BLINK1 PB0
  16. #define BLINK2 PB1
  17. #define BLINK3 PB2
  18. #define BLINK4 PB3
  19. #define BUTTON_PIN PINC
  20. #define BUTTON PC0
  21.  
  22.  
  23. uint8_t clk;// флаг клика
  24. uint8_t tiki;// глобальные тики
  25.  
  26. // обработчик прерывания по переполнению. ~61гц
  27. ISR(TIMER0_OVF_vect)
  28. {
  29. tiki++;
  30. }
  31.  
  32. // инициализация таймера
  33. void timer_ini(void)
  34. {
  35. TCCR0|=(1<<CS01) | (1<<CS00);// запуск таймера 0 с делителем 64
  36. TIMSK|=(1<<TOIE0);// разрешить прерывание по переполнению
  37. }
  38.  
  39. // получить тики
  40. uint8_t tikies(void)
  41. {
  42. return tiki;
  43. }
  44.  
  45. void button_KA(void)
  46. {
  47. static uint8_t status, press;
  48. uint8_t now=tikies();// получаем текущее время
  49.  
  50. switch (status)
  51. {
  52. case 0:// опрос кнопки
  53. if (!(BUTTON_PIN&(1<<BUTTON))) // если кнопка нажата
  54. {
  55. status=1;// уходим в статус 1
  56. press=now;// запоминаем время нажатия
  57. }
  58. break;
  59.  
  60. case 1:// учет времени удеражания кнопки
  61. if (BUTTON_PIN&(1<<BUTTON))// если кнопка уже отжата
  62. {
  63. if ((uint8_t) (now-press)>=3) clk=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
  64. status=0;// уходим в статус 0
  65. }
  66. else// иначе, кнопка всё еще удерживается
  67. {
  68. if ((uint8_t) (now-press)>=61) {// если удерживается уже достаточно долго
  69. clk=10;// поднимаем флаг длинного клика
  70. status=2;// уходим в статус 2
  71. }
  72. }
  73. break;
  74.  
  75. case 2:// ждем пока кнопку отпустят
  76. if (BUTTON_PIN&(1<<BUTTON)) status=0;// когда на пине 1 уходим в статус 0
  77. break;
  78.  
  79. }
  80. }
  81.  
  82. uint8_t button_stat(void)
  83. {
  84. uint8_t a=clk;
  85. clk=0;
  86. return a;
  87. }
  88.  
  89.  
  90.  
  91.  
  92. // инициализация блинков
  93. void blink_ini(void){
  94. BLINK_DDR|=(1<<BLINK1) | (1<<BLINK2) | (1<<BLINK3) | (1<<BLINK4);
  95. }
  96.  
  97.  
  98. void blink_click_KA(void){
  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. BLINK_PORT&=~(1<<BLINK4);
  112. break;
  113.  
  114. case 1:// светодиод включен
  115. if (but)// если было нажатие меняем статус.
  116. {
  117. if (but==1) status=0;
  118. if (but==10) status=2;
  119. }
  120. BLINK_PORT|=(1<<BLINK4);
  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. BLINK_PORT^=(1<<BLINK4);
  131. change=now;
  132. break;
  133. }
  134. }
  135.  
  136. void blink_KA3(uint8_t on_time, uint8_t off_time){
  137. static uint8_t status, change;
  138. uint8_t now=tikies();
  139.  
  140. switch (status)
  141. {
  142. case 0:
  143. BLINK_PORT^=(1<<BLINK3);// переключаем состояние пина светодиода
  144. change=now;//запоминаем время переключения
  145. if (BLINK_PIN&(1<<BLINK3)) status=1;// если на пине 1 уходим в статус 1
  146. else status=2;//иначе уходим в статус 2
  147. break;
  148.  
  149. case 1:// ждем когда кончится время включения
  150. if ( (uint8_t) (now-change)>=on_time) status=0;
  151. break;
  152.  
  153. case 2:// ждем когда кончится время выключения
  154. if ( (uint8_t) (now-change)>=off_time) status=0;
  155. break;
  156. }
  157. }
  158.  
  159.  
  160.  
  161. void blink_KA2(uint8_t on_time, uint8_t off_time){
  162. static uint8_t status, change;
  163. uint8_t now=tikies();
  164.  
  165. switch (status)
  166. {
  167. case 0:
  168. BLINK_PORT&=~(1<<BLINK2);// выключить светодиод
  169. change=now;//запомнить время выключения
  170. status=1;//уходим в статус 1
  171. break;
  172.  
  173. case 1:// ждем пока кончится время выключения и уходим в статус 2
  174. if ( (uint8_t) (now-change)>=off_time) status=2;
  175. break;
  176.  
  177. case 2:
  178. BLINK_PORT|=(1<<BLINK2);// включить свеиодиод
  179. change=now;//запомнить время включения
  180. status=3;//уходим в статус 3
  181. break;
  182.  
  183. case 3:// ждем пока кончится время включения и уходим в статус 0
  184. if ( (uint8_t) (now-change)>=on_time) status=0;
  185. break;
  186. }
  187. }
  188.  
  189. void blink_KA(void){
  190. static uint8_t status, change;
  191. uint8_t now=tikies();
  192.  
  193. switch (status)
  194. {
  195. case 0:
  196. if ( (uint8_t) (now-change)<30) break; // если время не вышло - выход
  197. BLINK_PORT|=(1<<BLINK1);// иначе включить светодиод
  198. change=now;// запомнить время включения
  199. status=1;// уходим в статус 1
  200. break;
  201.  
  202. case 1:
  203. if ( (uint8_t) (now-change)<30) break; // если время не вышло - выход
  204. BLINK_PORT&=~(1<<BLINK1);// иначе выключить светодиод
  205. change=now;// запомнить время выключения
  206. status=0;// уходим в статус 0
  207. break;
  208. }
  209. }
  210.  
  211.  
  212.  
  213.  
  214. int main(void)
  215. {
  216. blink_ini(); // инициализация блинков
  217. timer_ini();// инициализация таймера
  218. sei();// глобально разрешить прерывания
  219.  
  220. while (1)
  221. {
  222. blink_KA();
  223. blink_KA2(10,30);
  224. blink_KA3(10,10);
  225. blink_click_KA();
  226. button_KA();
  227. }
  228. }
  229.  
  230.  
Advertisement
Add Comment
Please, Sign In to add comment