Button.ob07 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. (*
  2. Пример для LaunchPad MSP-EXP430G2 Rev1.5
  3. Мигает зеленый светодиод.
  4. При нажатии на кнопку P1.3, включается/выключается красный светодиод.
  5. *)
  6. MODULE Button;
  7. IMPORT SYSTEM, MSP430;
  8. CONST
  9. REDLED = {0};
  10. GREENLED = {6};
  11. BUTTON = {3};
  12. (* регистры порта P1 *)
  13. P1OUT = 21H;
  14. P1DIR = 22H;
  15. P1IFG = 23H;
  16. P1IE = 25H;
  17. P1REN = 27H;
  18. PROCEDURE test_bits (mem: INTEGER; bits: SET): SET;
  19. VAR
  20. b: BYTE;
  21. BEGIN
  22. SYSTEM.GET(mem, b)
  23. RETURN bits * BITS(b)
  24. END test_bits;
  25. PROCEDURE set_bits (mem: INTEGER; bits: SET);
  26. VAR
  27. b: BYTE;
  28. BEGIN
  29. SYSTEM.GET(mem, b);
  30. SYSTEM.PUT8(mem, BITS(b) + bits)
  31. END set_bits;
  32. PROCEDURE clr_bits (mem: INTEGER; bits: SET);
  33. VAR
  34. b: BYTE;
  35. BEGIN
  36. SYSTEM.GET(mem, b);
  37. SYSTEM.PUT8(mem, BITS(b) - bits)
  38. END clr_bits;
  39. PROCEDURE inv_bits (mem: INTEGER; bits: SET);
  40. VAR
  41. b: BYTE;
  42. BEGIN
  43. SYSTEM.GET(mem, b);
  44. SYSTEM.PUT8(mem, BITS(b) / bits)
  45. END inv_bits;
  46. (* обработчик прерываний *)
  47. PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
  48. BEGIN
  49. IF priority = 18 THEN (* прерывание от порта P1 *)
  50. IF test_bits(P1IFG, BUTTON) = BUTTON THEN (* нажата кнопка *)
  51. inv_bits(P1OUT, REDLED); (* изменить состояние светодиода *)
  52. MSP430.Delay(500); (* задержка для отпускания кнопки *)
  53. clr_bits(P1IFG, BUTTON) (* сбросить флаг прерывания *)
  54. END
  55. END
  56. END int;
  57. PROCEDURE main;
  58. BEGIN
  59. (* инициализация регистров порта P1 *)
  60. SYSTEM.PUT8(P1DIR, REDLED + GREENLED); (* выход *)
  61. set_bits(P1REN, BUTTON); (* включить подтягивающий резистор *)
  62. set_bits(P1OUT, BUTTON); (* подтяжка к питанию *)
  63. set_bits(P1IE, BUTTON); (* разрешить прерывания от кнопки *)
  64. MSP430.SetIntProc(int); (* назначить обработчик прерываний *)
  65. MSP430.EInt; (* разрешить прерывания *)
  66. (* бесконечный цикл *)
  67. WHILE TRUE DO
  68. inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *)
  69. MSP430.Delay(800) (* задержка *)
  70. END
  71. END main;
  72. BEGIN
  73. main
  74. END Button.