uuu000

HANDPIECE 328 A

Jul 30th, 2022
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.41 KB | None | 0 0
  1.  
  2. #define F_CPU 8000000UL// тактовая частота мк
  3. #include <avr/io.h>
  4. #include <avr/interrupt.h>
  5. #include <util/delay.h>
  6.  
  7. #include "oled_ssd1306.h"
  8. uint8_t tiki;// глобальные тики
  9. uint8_t clk;// флаг клика
  10. uint8_t clk1;// флаг клика
  11. uint16_t i;
  12.  
  13. void adc_ini (void)
  14. {
  15. /*** Настройка АЦП ***/
  16. ADCSRA |= (1 << ADEN) // Включение АЦП
  17. |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
  18. ADMUX |= (0 << REFS1)|(1 << REFS0) // внешний ИОН
  19. |(1 << MUX0)|(1 << MUX1); // вход PC3
  20. }
  21.  
  22. void adc (void)
  23. {
  24. ADCSRA |= (1 << ADSC); // Начинаем преобразование
  25. while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
  26. i = (ADCL|ADCH << 8); // Считываем ADC
  27.  
  28. if (i > 680)
  29. {
  30. PORTD |= (1<<PD0);
  31. PORTD &= ~(1<<PD1);
  32. }
  33. else
  34. {
  35. PORTD |= (1<<PD1);
  36. PORTD &= ~(1<<PD0);
  37. }
  38.  
  39. }
  40.  
  41. // обработчик прерывания по переполнению. ~61гц
  42. ISR(TIMER0_OVF_vect)
  43. {
  44. tiki++;//инкрементируем с каждым прерыванием
  45. }
  46.  
  47.  
  48. // инициализация таймера
  49. void timer_ini(void)
  50. {
  51. TCCR0B|=(1<<CS02);// запуск таймера 0 с делителем 256
  52. TIMSK0|=(1<<TOIE0);// разрешить прерывание по переполнению
  53. }
  54.  
  55. uint8_t tikies(void)
  56. {
  57. return tiki;
  58. }
  59. // инициализация блинков
  60. void blink_ini(void)
  61. {
  62. DDRB|=(1<<PB2);
  63. DDRC|=(1<<PC0)|(1<<PC1) |(1<<PC2);
  64. }
  65.  
  66. void button_KA(void)
  67. {
  68. static uint8_t status, press;
  69. uint8_t now=tikies();// получаем текущее время
  70.  
  71. switch (status)
  72. {
  73. case 0:// опрос кнопки
  74. if (!(PINB&(1<<PB0))) // если кнопка нажата
  75. {
  76. status=1;// уходим в статус 1
  77. press=now;// запоминаем время нажатия
  78. }
  79. break;
  80.  
  81. case 1:// учет времени удеражания кнопки
  82. if (PINB&(1<<PB0))// если кнопка уже отжата
  83. {
  84. if ((uint8_t) (now-press)>=3) clk=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
  85. status=0;// уходим в статус 0
  86.  
  87.  
  88. }
  89. break;
  90.  
  91.  
  92. }
  93. }
  94.  
  95.  
  96. void button_KA1(void)
  97. {
  98. static uint8_t status, press1;
  99. uint8_t now1=tikies();// получаем текущее время
  100.  
  101. switch (status)
  102. {
  103. case 0:// опрос кнопки
  104. if (!(PINB&(1<<PB1))) // если кнопка нажата
  105. {
  106. status=1;// уходим в статус 1
  107. press1=now1;// запоминаем время нажатия
  108. }
  109. break;
  110.  
  111. case 1:// учет времени удеражания кнопки
  112. if (PINB&(1<<PB1))// если кнопка уже отжата
  113. {
  114. if ((uint8_t) (now1-press1)>=3) clk1=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
  115. status=0;// уходим в статус 0
  116. }
  117. else// иначе, кнопка всё еще удерживается
  118. {
  119. if ((uint8_t) (now1-press1)>=61) {// если удерживается уже достаточно долго
  120. clk1=10;// поднимаем флаг длинного клика
  121. status=2;// уходим в статус 2
  122. }
  123. }
  124. break;
  125.  
  126. case 2:// ждем пока кнопку отпустят
  127. if (PINB&(1<<PB1)) status=0;// когда на пине 1 уходим в статус 0
  128. break;
  129.  
  130. }
  131. }
  132.  
  133. uint8_t button_stat(void)
  134. {
  135. uint8_t a=clk;
  136. clk=0;
  137. return a;
  138. }
  139. uint8_t button_stat1(void)
  140. {
  141. uint8_t a=clk1;
  142. clk1=0;
  143. return a;
  144. }
  145.  
  146.  
  147.  
  148. void blink_click_KA(void){
  149. static uint8_t status, change;
  150. uint8_t now=tikies();// текущее "время"
  151. uint8_t but=button_stat();// получение событий от кнопки
  152.  
  153. switch (status)
  154. {
  155. case 0:// светодиод выключен
  156.  
  157. oled_gotoxy(0,5);
  158. oled_write(" POSITIV");
  159. if (but)// если было нажатие меняем статус.
  160. {
  161. if (but==1) status=1;
  162.  
  163. }
  164. PORTB&=~(1<<PB2);
  165. break;
  166.  
  167. case 1:// светодиод включен
  168. if (but)// если было нажатие меняем статус.
  169. {
  170. if (but==1) status=2;
  171.  
  172. }
  173. PORTB|=(1<<PB2);
  174.  
  175. oled_gotoxy(0,5);
  176. oled_write(" NEGATIV");
  177. break;
  178.  
  179. case 2:// светодиод мигает
  180. if (but)// если было нажатие меняем статус.
  181. {
  182. if (but==1) status=3;
  183.  
  184. }
  185. if ( (uint8_t) (now-change)<30) break;
  186. PORTB^=(1<<PB2);
  187.  
  188. oled_gotoxy(0,5);
  189. oled_write(" 10 Hz ");
  190. change=now;
  191. break;
  192.  
  193. case 3:// светодиод мигает
  194. if (but)// если было нажатие меняем статус.
  195. {
  196. if (but==1) status=4;
  197.  
  198. }
  199. if ( (uint8_t) (now-change)<10) break;
  200. PORTB^=(1<<PB2);
  201.  
  202. oled_gotoxy(0,5);
  203. oled_write(" 50 Hz ");
  204. change=now;
  205. break;
  206. case 4:// светодиод мигает
  207. if (but)// если было нажатие меняем статус.
  208. {
  209. if (but==1) status=0;
  210.  
  211. }
  212. if ( (uint8_t) (now-change)<2) break;
  213. PORTB^=(1<<PB2);
  214.  
  215. oled_gotoxy(0,5);
  216. oled_write(" 100 Hz ");
  217. change=now;
  218. break;
  219. }
  220. }
  221.  
  222.  
  223. void blink_click_KA1(void){
  224. static uint8_t status, change1;
  225. uint8_t now1=tikies();// текущее "время"
  226. uint8_t but1=button_stat1();// получение событий от кнопки
  227.  
  228. switch (status)
  229. {
  230. case 0:
  231. if (but1)// если было нажатие меняем статус.
  232. {
  233. if (but1==1) status=1;
  234.  
  235. }
  236. PORTC&=~(1<<PC0);
  237. oled_gotoxy(0,0);
  238. oled_write(" OFF ");
  239. break;
  240.  
  241. case 1:
  242. if (but1)// если было нажатие меняем статус.
  243. {
  244. if (but1==1) status=2;
  245.  
  246. }
  247. PORTC|=(1<<PC0);
  248.  
  249.  
  250.  
  251. oled_gotoxy(0,0);
  252. oled_write(" LOW");
  253.  
  254. break;
  255. case 2:
  256. if (but1)// если было нажатие меняем статус.
  257. {
  258. if (but1==1) status=3;
  259.  
  260. }
  261. PORTC&=~(1<<PC0);
  262. PORTC|=(1<<PC1);
  263.  
  264.  
  265.  
  266.  
  267. oled_gotoxy(0,0);
  268. oled_write(" MIDDLE");
  269.  
  270. break;
  271. case 3:
  272. if (but1)// если было нажатие меняем статус.
  273. {
  274. if (but1==1) status=4;
  275.  
  276. }
  277. PORTC&=~(1<<PC1);
  278.  
  279. PORTC|=(1<<PC2);
  280.  
  281.  
  282. oled_gotoxy(0,0);
  283. oled_write(" HIGH ");
  284.  
  285. break;
  286.  
  287. case 4:
  288. if (but1)// если было нажатие меняем статус.
  289. {
  290. if (but1==1) status=1;
  291.  
  292. }
  293. if ( (uint8_t) (now1-change1)<1) break;
  294. PORTC&=~(1<<PC2);
  295.  
  296. oled_gotoxy(0,0);
  297. oled_write(" OFF ");
  298.  
  299.  
  300.  
  301. change1=now1;
  302. break;
  303.  
  304. }
  305. }
  306.  
  307.  
  308. int main(void)
  309. {
  310. DDRD=0xFF;
  311.  
  312. adc_ini ();
  313. blink_ini(); // инициализация блинков
  314. timer_ini();// инициализация таймера
  315. sei();// глобально разрешить прерывания
  316.  
  317. oled_init();
  318. oled_gotoxy(0,0);
  319.  
  320. while(1)
  321. { adc ();
  322. blink_click_KA();
  323. blink_click_KA1();
  324. button_KA();
  325. button_KA1();
  326.  
  327.  
  328.  
  329.  
  330. }
  331. }
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
Advertisement
Add Comment
Please, Sign In to add comment