Advertisement
Guest User

Код

a guest
Apr 28th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. /*
  2. * keypad_01.c
  3. *
  4. * Created: 28.12.2016 7:55:33
  5. * Author: Писанец Александр Николаевич
  6. */
  7. #include <avr/io.h>
  8. #include <avr/interrupt.h>
  9. #define LED1 0
  10. #define LED2 1
  11. volatile unsigned char action_int = 11,temporary_data_keyboard,parity_bit_keyboard;
  12. volatile unsigned char keyboard_data,bit_action;
  13. ISR(INT0_vect)
  14. {
  15. keypad_input (); //принимаем данные с клавиатуры
  16. }
  17. //********************************//
  18. //********************************//
  19. int main(void)
  20. {
  21. DDRD &=~(1«2);
  22. DDRD &=~(1«6);
  23. PORTD |=(1«6)|(1«2);
  24. DDRB |=(1«LED1);
  25. DDRB |=(1«LED2);
  26. //****************//
  27. GICR |=(1«6);
  28. MCUCR |=(1«ISC01);
  29. MCUCR &=~(1«ISC00);
  30. asm("sei");
  31. //*****************//
  32. while(1)
  33. {
  34. switch (keyboard_data ) // находится принятый код кнопки
  35. {
  36. case 0xAA://тест при подключении клавиатуры
  37. PORTB |=(1«LED1);
  38. keyboard_data = 0;
  39. break;
  40. case 0x29: // пробел
  41. if ( bit_action & (1«0))
  42. PORTB &=~(1«LED1);
  43. else
  44. PORTB |=(1«LED1);
  45. bit_action &=~(1«0);
  46. bit_action &=~(1«2);
  47. keyboard_data = 0;
  48. break;
  49. case 0x41: // "<"
  50. if (bit_action & (1«1))
  51. {
  52. if ( bit_action & (1«2))
  53. bit_action &=~(1«2);
  54. else
  55. break;
  56. }
  57. if ( PINB & (1«1))
  58. PORTB &=~(1«LED2);
  59. else
  60. PORTB |=(1«LED2);
  61. bit_action |=(1«1);
  62. bit_action &=~(1«0);
  63. keyboard_data = 0;
  64. break;
  65. case 0xf0: // кнопка отжата
  66. bit_action |= (1«0)|(1«2);
  67. keyboard_data = 0;
  68. break;
  69. default:
  70. break;
  71. }
  72. }
  73. }
  74. //****************************//
  75. //****************************//
  76. // принимаем данные с клавиатуры
  77. //****************************//
  78. //****************************//
  79. void keypad_input (void)
  80. {
  81. switch ( action_int )
  82. {
  83. case 11:
  84. if (!(PIND & (1«6))) // определение стартового бита
  85. action_int = 0;
  86. break;
  87. case 0 ... 7: // принимаем 8 бит данных
  88. if (PIND & (1«6))
  89. {
  90. temporary_data_keyboard |=(1«action_int);
  91. parity_bit_keyboard ++; // данные для проверки чётности
  92. }
  93. else
  94. {
  95. temporary_data_keyboard &=~(1«action_int);
  96. }
  97. action_int++; // счёт принятых бит
  98. break;
  99. case 8: // проверяем на правильность принятых данных исходя от бита чётности
  100. if (PIND & (1«6)) // принимаем бит чётности от клавиатуры
  101. {
  102. if (parity_bit_keyboard & (1«0)) // проверяем четное или не четное число
  103. action_int = 11; // бит четности не одинаковый
  104. else
  105. action_int = 9;
  106. }
  107. else
  108. {
  109. if (parity_bit_keyboard & (1«0)) // проверяем четное или не четное число
  110. action_int = 9;
  111. else
  112. action_int = 11; // бит четности не одинаковый
  113. }
  114. parity_bit_keyboard = 0;
  115. break;
  116. case 9:
  117. if (PIND & (1«6)) // стоповый бит (всегда высокий уровень)
  118. {
  119. keyboard_data = temporary_data_keyboard; // сохраняем полученное значение
  120. }
  121. action_int = 11;
  122. break;
  123. }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement