Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. #include <hidef.h> /* for EnableInterrupts macro */
  2. #include "derivative.h" /* include peripheral declarations */
  3. //світлодіоди
  4. #define LED1 PTDD_PTDD4
  5. #define LED2 PTDD_PTDD5
  6. #define LED3 PTDD_PTDD6
  7. #define LED4 PTDD_PTDD7
  8. //кнопки
  9. #define btn_1 !PTAD_PTAD2
  10. #define btn_2 !PTAD_PTAD3
  11. #define btn_3 !PTAD_PTAD4
  12. #define btn_4 !PTAD_PTAD5
  13.  
  14. // обробник переривань «тіків» каналу 0 таймера
  15. interrupt VectorNumber_Vtpm1ch0 void TimerStep(void)
  16. {
  17. //скидання прапору переривання
  18. if(TPM1C0SC_CH0F)
  19. {
  20. TPM1C0SC_CH0F = 0;
  21. }
  22. //блимання світлодіодів
  23. LED1 = !LED1;
  24. LED2 = !LED2;
  25. LED3 = !LED3;
  26. LED4 = !LED4;
  27. //скидання флагу переповненння таймера
  28. TPM1SC_TOF = 0;
  29. }
  30.  
  31. //обробник переривання: ввід з клавіатури
  32. interrupt VectorNumber_Vkeyboard1 void BTN_Click(void)
  33. {
  34. // підтвердження переривання (KBF скидається)
  35. KBISC_KBACK = 1;
  36.  
  37. if(btn_1) //натискання кнопки
  38. {
  39. //запускати канал 0 таймеру 1 в режимі вихідного порівняння з дозволенним перериванням каналу
  40. // максимальний дільник частоти (1:1:1)
  41. TPM1SC_PS2 = 1;
  42. TPM1SC_PS1 = 1;
  43. TPM1SC_PS0 = 1;
  44. //зануляємо регістр
  45. TPM1C0SC = 0;
  46. TPM1C0SC_CH0IE = 1;
  47. TPM1C0SC_MS0A = 1;
  48. // обираємо системну шину для кроку таймера - 1.
  49. TPM1SC_CLKSA = 1;
  50. // дозвіл на переривання
  51. TPM1SC_TOIE = 1;
  52. }
  53. else if(btn_2)
  54. {
  55. //зупинка таймера при натиску на 2 кнопку
  56. //очищення налаштувань шини + вимкнення світлодіодів
  57. TPM1SC_CLKSA = 0;
  58. TPM1C0SC = 0;
  59. LED1 = 1;
  60. LED2 = 1;
  61. LED3 = 1;
  62. LED4 = 1;
  63. }
  64. else if (btn_3)
  65. {
  66. // збільшення періоду блимання світлодіодів вдвічі
  67. // зчитуємо біти дільника частоти
  68. int fd = TPM1SC & 0b00000111;
  69. if(fd != 0b00000111)
  70. {
  71. fd += 1;
  72. }
  73. // біти дільника частоти зсуваємо в регістрi
  74. TPM1SC_PS0 = fd & 1;
  75. TPM1SC_PS1 = (fd >> 1) & 1;
  76. TPM1SC_PS2 = (fd >> 2) & 1;
  77. }
  78. else if (btn_4)
  79. {
  80. // збільшення періоду блимання світлодіодів вдвічі
  81. // зчитуємо біти дільника частоти
  82. int fd = TPM1SC & 0b00000111;
  83. if(fd) fd -= 1;
  84. TPM1SC_PS0 = fd & 1;
  85. TPM1SC_PS1 = (fd >> 1) & 1;
  86. TPM1SC_PS2 = (fd >> 2) & 1;
  87. }
  88. }
  89.  
  90. void main(void)
  91. {
  92. EnableInterrupts;
  93. /* include your code here */
  94. PTDDD = 0b11110000;//початковий стан діодів
  95. PTDD = 1;//
  96. //PTDD = 0b00001111; /* далі ми вмикаємо усі червоні діоди і звукогенератор (де 0 – вімкнути, а 1 – вимкнути. При чому для звукогенератора - навпаки)*/
  97. //so, if all 1s --> on all diods and off buzz
  98. PTAPE_PTAPE2 = 1;//enable pullup for kb2
  99. PTAPE_PTAPE3 = 1; //enable pullup for kb3
  100. PTAPE_PTAPE4 = 1;//enable pullup for kb4
  101. PTAPE_PTAPE5 = 1;//enable pullup for kb5
  102. /*Каждая линия ввода/вывода настраивается на исполнение альтернативной
  103. функции входа модуля KBI установкой в 1 соответствующего бита регистра */
  104. KBIPE_KBIPE5 = 1;
  105. KBIPE_KBIPE4 = 1;
  106. KBIPE_KBIPE3 = 1;
  107. KBIPE_KBIPE2 = 1;
  108. KBISC_KBIE = 1;// // enable Keyboard Interrupts
  109. KBISC_KBF = 1;//триггер флага запроса
  110. TPM1SC = 0; //8-бітний регістр стану та керування
  111. TPM1C0V = 0; //Регістр значень каналу
  112. TPM1MOD = 50000; //значення модуля регістра - число, до якого рахуватиме таймер
  113. TPM1CNTH = 0; //Канали модулів TPM. номер модуля -1
  114. __RESET_WATCHDOG(); /* feeds the dog */
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement