uuu000

ATT 2313 HP

Sep 27th, 2021
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.55 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(){ // проверяет нажатие кнопки PD1
  12.  
  13. btn=0;
  14. now=PIND& (1<<PD1); // текущее состояние кнопки PD1
  15. if ((now==0) && (old!=0)) btn=1; // если кнопка нажата
  16. old=now;
  17. return btn;
  18. }
  19. //***************************************************************
  20. unsigned char st2()// проверяет нажатие кнопки PD2
  21. {
  22.  
  23. btn1=0;
  24. now1=PIND & (1<<PD2); // текущее состояние кнопки PD2
  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;
  34.  
  35. //******************************//
  36. //*** МИГАНИЕ СВЕТОДИОДА PD0 ***//
  37. //******************************//
  38. if (fToggle==1){ // если установлен флаг мигания
  39. if (uiCount<500/8){ // в течение первого полупериода 1 Гц 250*8
  40. PORTD |= (1<<PD0); // светодиод PD0 включен
  41. }
  42. else if (uiCount<1000/8){ // в течение второго полупериода 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.  
  62. fToggle=1; // установить флаг мигания
  63. break;
  64.  
  65. case 3:
  66. PORTD &= ~(1<<PD0); // светодиод PD0 выключен
  67. fToggle=0; // снять флаг мигания
  68. led=0;
  69. break;
  70. }
  71. led++;
  72. }
  73. cCount=0;
  74. }
  75. else cCount++;
  76. }
  77. //***************************************************************
  78. int main (void){
  79.  
  80. DDRA=0b00;
  81. PORTA=0b11;
  82.  
  83. DDRB=0b11111111;
  84. PORTB=0b00000000;
  85.  
  86. DDRD=0b11111001;
  87. PORTD=0b00000110;
  88.  
  89. TCCR0A = 0b00000000;// нормальный режим WGM00=0; WGM01=0; WGM02=0(TCCR0B);
  90. TCCR0B = 0b00000100;//делитель на 256;CS02=1;CS01=0;CS00=0;
  91. TIMSK = 0b00000010;//TOIE0 =1 разрешение прерывания по переполнению T0
  92.  
  93. sei();
  94.  
  95. while (1)
  96. {
  97.  
  98.  
  99.  
  100. if (st2())
  101. {
  102.  
  103. switch(led2)
  104. {
  105. case 1:
  106. PORTB |= (1<<PB0)|(1<<PB3);
  107. break;
  108. case 2:
  109. PORTB &= ~((1<<PB0)|(1<<PB3));
  110. PORTB |= (1<<PB1)|(1<<PB4);
  111. break;
  112. case 3:
  113. PORTB &= ~((1<<PB1)|(1<<PB4));
  114. PORTB |= (1<<PB2)|(1<<PB5);
  115. break;
  116. case 4:
  117. PORTB &= ~((1<<PB2)|(1<<PB5));
  118. //PORTD &= ~(1<<PD0);
  119. //fToggle=0;
  120. led2=0;
  121. break;
  122.  
  123. }
  124. led2++;
  125. _delay_ms(200);
  126.  
  127. }
  128.  
  129. }
  130. return (0);
  131. }
  132. //***************************************************************
  133.  
  134.  
Advertisement
Add Comment
Please, Sign In to add comment