uuu000

2313 2*a

Oct 13th, 2021
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. #define F_CPU 8000000UL
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5. unsigned char led = 1;
  6. unsigned char led2 = 1;
  7. volatile unsigned char old,now,btn,old1,now1,btn1;
  8.  
  9.  
  10. //***************************************************************
  11. unsigned char st(){ // проверяет нажатие кнопки PB5 POL
  12.  
  13. btn=0;
  14. now=PINB& (1<<PB5); // текущее состояние кнопки PD1
  15. if ((now==0) && (old!=0)) btn=1; // если кнопка нажата
  16. old=now;
  17. return btn;
  18. }
  19. //***************************************************************
  20. unsigned char st2()// проверяет нажатие кнопки PB0 LEVEL
  21. {
  22.  
  23. btn1=0;
  24. now1=PINB& (1<<PB0); // текущее состояние кнопки PB0
  25. if ((now1==0) && (old1!=0)) btn1=1; // если кнопка нажата
  26. old1=now1;
  27. return btn1;
  28. }//***************************************************************
  29. // Процедура прерывания по переполнению таймера 0
  30. #define OVF 8 // периодичность выполнения процедуры прерывания, mS
  31. ISR (TIMER0_OVF_vect){
  32. static unsigned char fToggle,cCount;
  33. static unsigned int uiCount,a;
  34.  
  35. //******************************//
  36. //*** МИГАНИЕ СВЕТОДИОДА PD0 ***//
  37. //******************************//
  38. if (fToggle==1){ // если установлен флаг мигания
  39. if (uiCount<a){ // в течение первого полупериода 1 Гц 250*8
  40. PORTD |= (1<<PD0); // светодиод PD0 включен
  41. }
  42. else if (uiCount<2*a){ // в течение второго полупериода 1 Гц
  43. PORTD &= ~(1<<PD0); // светодиод PD0 выключен
  44. }
  45. else uiCount=0;
  46. uiCount++;
  47. }
  48.  
  49. //***********************************//
  50. //*** ПРОВЕРКА НАЖАТИЯ КНОПКИ PA0 ***//
  51. //***********************************//
  52. if (cCount>(25/OVF)){ // выполняется с периодичностью 25 mS
  53. if (st()){ // если кнопка PA0 нажата
  54. switch(led){
  55. case 1:
  56. PORTD |= (1<<PD0); // включить светодиод PD0
  57. fToggle=0; // снять флаг мигания
  58. break;
  59.  
  60. case 2:
  61. a=2;
  62. fToggle=1; // установить флаг мигания
  63. break;
  64.  
  65. case 3:
  66. a=6;
  67. fToggle=1; // установить флаг мигания
  68. break;
  69. case 4:
  70. a=8;
  71. fToggle=1; // установить флаг мигания
  72. break;
  73.  
  74. case 5:
  75. a=12;
  76. fToggle=1; // установить флаг мигания
  77. break;
  78.  
  79. case 6:
  80. PORTD &= ~(1<<PD0); // светодиод PD0 выключен
  81. fToggle=0; // снять флаг мигания
  82. led=0;
  83. break;
  84. }
  85. led++;
  86. }
  87. cCount=0;
  88. }
  89. else cCount++;
  90. }
  91. //***************************************************************
  92. int main (void){
  93.  
  94.  
  95. DDRB=0b11011110;
  96. PORTB=0b00100001;
  97.  
  98. DDRD=0b1111111;
  99. PORTD=0b0000000;
  100.  
  101. TCCR0A = 0b00000000;// нормальный режим WGM00=0; WGM01=0; WGM02=0(TCCR0B);
  102. TCCR0B = 0b00000100;//делитель на 256;CS02=1;CS01=0;CS00=0;
  103. TIMSK = 0b00000010;//TOIE0 =1 разрешение прерывания по переполнению T0
  104.  
  105. sei();
  106.  
  107. while (1)
  108. {
  109.  
  110.  
  111.  
  112. if (st2())
  113. {
  114.  
  115. switch(led2)
  116. {
  117. case 1:
  118. PORTD |=(1<<PD1);PORTB |=(1<<PB1);
  119.  
  120. break;
  121. case 2:
  122. PORTD&=~(1<<PD1);PORTB&=~(1<<PB1);
  123. PORTD |=(1<<PD2);PORTB |=(1<<PB2);
  124.  
  125. break;
  126. case 3:
  127. PORTD&=~(1<<PD2);PORTB&=~(1<<PB2);
  128. PORTD |=(1<<PD3);PORTB |=(1<<PB3);
  129. break;
  130. case 4:
  131. PORTD&=~(1<<PD3);PORTB&=~(1<<PB3);
  132.  
  133. led2=0;
  134. break;
  135.  
  136. }
  137. led2++;
  138. _delay_ms(200);
  139.  
  140. }
  141.  
  142. }
  143. return (0);
  144. }
  145. //***************************************************************
  146.  
  147.  
Advertisement
Add Comment
Please, Sign In to add comment