uuu000

AT8 HP INDICAT

Nov 18th, 2021
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.02 KB | None | 0 0
  1.  
  2. #define F_CPU 8000000UL
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6. unsigned char led = 1;
  7. unsigned char led2 = 1;
  8. volatile unsigned char old,now,btn,old1,now1,btn1;
  9.  
  10. //***************************************************************
  11. unsigned char st(){ // проверяет нажатие кнопки PC0 Там ничего сложного.
  12. //Сначала нужно снять флаг нажатия : btn=0;
  13. //Затем берется текущее значение кнопки: now=PINC& (1<<PC0);
  14. //и проверяется это текущее состояние now и состояние, которое было в прошлый раз old:
  15. //если текущее состояние - ноль, а в прошлый раз состояние было не равно нулю (т.е. единица), то очевидно, что кнопка нажата, т.е. произошел переход из единицы в ноль - отрицательный фронт. Значит, ставим флаг нажатия btn=1, который можно проверить в дальнейшем коде.
  16. //И в заключение нужно перезаписать переменную old значением переменной now. Т.е. текущее нынешнее состояние кнопки становится предыдущим для следующей проверки.
  17. //Вот и все.
  18.  
  19. btn=0;
  20. now=PINC& (1<<PC0); // текущее состояние кнопки PC0
  21. if ((now==0) && (old!=0))
  22. btn=1; // если кнопка нажата
  23. old=now;
  24. return btn;
  25. }
  26. //***************************************************************
  27. unsigned char st2()
  28. {
  29.  
  30. btn1=0;
  31. now1=PINC& (1<<PC1); // текущее состояние кнопки PC1
  32. if ((now1==0) && (old1!=0)) btn1=1; // если кнопка нажата
  33. old1=now1;
  34. return btn1;
  35. }//***************************************************************
  36. // Процедура прерывания по переполнению таймера 0
  37. #define OVF 8 // периодичность выполнения процедуры прерывания, mS
  38.  
  39.  
  40. ISR(TIMER0_OVF_vect)
  41. {
  42. static unsigned char fToggle,cCount;
  43. static unsigned int uiCount;
  44.  
  45. //******************************//
  46. //*** МИГАНИЕ СВЕТОДИОДА PC2 ***//
  47. //******************************//
  48. if (fToggle==1){ // если установлен флаг мигания
  49. if (uiCount<375/OVF){ // в течение первого полупериода 2 Гц
  50. PORTC |= (1<<PC2); // светодиод PD0 включен
  51. }
  52. else if (uiCount<750/OVF){ // в течение второго полупериода 2 Гц
  53. PORTC &= ~(1<<PC2); // светодиод PD0 выключен
  54. }
  55. else uiCount=0;
  56. uiCount++;
  57. }
  58.  
  59. //***********************************//
  60. //*** ПРОВЕРКА НАЖАТИЯ КНОПКИ PC0 ***//
  61. //***********************************//
  62. if (cCount>(15/OVF)){ // выполняется с периодичностью 25 mS
  63. if (st()){
  64. // если кнопка PC0 нажата
  65. switch(led)
  66. {
  67. case 1:
  68. PORTB=0;
  69. PORTC |= (1<<PC2); // включить светодиод PC2
  70. fToggle=0;
  71. PORTB|= 0x06; // снять флаг мигания
  72. break;
  73.  
  74. case 2:
  75. PORTB=0;
  76. PORTB|= 0x5B;
  77. fToggle=1; // установить флаг мигания
  78. break;
  79.  
  80. case 3:
  81. PORTB=0;
  82. PORTB|= 0x4F;
  83. PORTC &= ~(1<<PC2); // светодиод PB0 выключен
  84. fToggle=0; // снять флаг мигания
  85. led=0;
  86. break;
  87.  
  88. case 4:
  89. PORTB=0;
  90. //PORTB|= 0x4F;
  91. //PORTC &= ~(1<<PC2); // светодиод PB0 выключен
  92. //fToggle=0; // снять флаг мигания
  93. //led=0;
  94. break;
  95. }
  96. led++;
  97. }
  98. cCount=0;
  99. }
  100. else cCount++;
  101. }
  102.  
  103.  
  104. ISR(TIMER1_OVF_vect)
  105.  
  106. {}
  107. //***************************************************************
  108. int main (void){
  109.  
  110. DDRC|=(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5);
  111. DDRC&=~((1<<PC0)|(1<<PC1));
  112. PORTC|=(1<<PC0)|(1<<PC1);
  113. PORTC&= ~ ((1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC4)|(1<<PC5));
  114. DDRD=0b11111111;
  115. DDRB=0b11111111;
  116. PORTD=0x00;
  117. PORTB=0x00;
  118.  
  119. TCCR0 = 0b00000100;
  120. TCCR1A = 0b00000000;
  121. TCCR1B|=1<<CS11;
  122. TIMSK|=(1<<TOIE0)|(1<<TOIE1);
  123.  
  124. //asm("sei");
  125. sei();
  126. while (1)
  127. {
  128.  
  129.  
  130.  
  131. if (st2())
  132. {
  133.  
  134. switch(led2)
  135. {
  136. case 1:
  137. PORTD=0;
  138. PORTD|= 0x06;
  139. PORTC |= (1<<PC3);
  140. break;
  141. case 2:
  142. PORTD=0;
  143. PORTD|=0x5B;
  144. PORTC &= ~(1<<PC3);
  145. PORTC |= (1<<PC4);
  146. break;
  147. case 3:
  148. PORTD=0;
  149. PORTD|= 0x4F;
  150. PORTC &= ~(1<<PC4);
  151. PORTC|= (1<<PC5);
  152. break;
  153. case 4:
  154. //PORTD=0;
  155. //PORTD|= 0x4F;
  156. PORTC &= ~(1<<PC5);
  157. PORTD=0;
  158. //PORTB &= ~(1<<PB0);
  159. // if(fToggle=1){
  160. // PORTB &= ~(1<<PB0);}
  161. led2=0;
  162. break;
  163.  
  164.  
  165. }
  166. led2++;
  167. _delay_ms(200);
  168.  
  169. }
  170.  
  171. }
  172. return (0);
  173. }
  174. //***************************************************************
  175.  
Advertisement
Add Comment
Please, Sign In to add comment