uuu000

HANDPIECE 328

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