Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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