(*

Пример для LaunchPad MSP-EXP430G2 Rev1.5

  Мигает зеленый светодиод.
  При нажатии на кнопку P1.3, включается/выключается красный светодиод.

*)

MODULE Button;

IMPORT SYSTEM, MSP430;


CONST

    REDLED   = {0};
    GREENLED = {6};
    BUTTON   = {3};

    (* регистры порта P1 *)
    P1OUT = 21H;
    P1DIR = 22H;
    P1IFG = 23H;
    P1IE  = 25H;
    P1REN = 27H;


PROCEDURE test_bits (mem: INTEGER; bits: SET): SET;
VAR
    b: BYTE;

BEGIN
    SYSTEM.GET(mem, b)
    RETURN bits * BITS(b)
END test_bits;


PROCEDURE set_bits (mem: INTEGER; bits: SET);
VAR
    b: BYTE;

BEGIN
    SYSTEM.GET(mem, b);
    SYSTEM.PUT8(mem, BITS(b) + bits)
END set_bits;


PROCEDURE clr_bits (mem: INTEGER; bits: SET);
VAR
    b: BYTE;

BEGIN
    SYSTEM.GET(mem, b);
    SYSTEM.PUT8(mem, BITS(b) - bits)
END clr_bits;


PROCEDURE inv_bits (mem: INTEGER; bits: SET);
VAR
    b: BYTE;

BEGIN
    SYSTEM.GET(mem, b);
    SYSTEM.PUT8(mem, BITS(b) / bits)
END inv_bits;


(* обработчик прерываний *)
PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt);
BEGIN
    IF priority = 18 THEN                          (* прерывание от порта P1 *)
        IF test_bits(P1IFG, BUTTON) = BUTTON THEN  (* нажата кнопка *)
            inv_bits(P1OUT, REDLED);               (* изменить состояние светодиода *)
            MSP430.Delay(500);                     (* задержка для отпускания кнопки *)
            clr_bits(P1IFG, BUTTON)                (* сбросить флаг прерывания *)
        END
    END
END int;


PROCEDURE main;
BEGIN
    (* инициализация регистров порта P1 *)
    SYSTEM.PUT8(P1DIR, REDLED + GREENLED);  (* выход *)
    set_bits(P1REN, BUTTON);                (* включить подтягивающий резистор *)
    set_bits(P1OUT, BUTTON);                (* подтяжка к питанию *)
    set_bits(P1IE,  BUTTON);                (* разрешить прерывания от кнопки *)

    MSP430.SetIntProc(int);  (* назначить обработчик прерываний *)
    MSP430.EInt;             (* разрешить прерывания *)

    (* бесконечный цикл *)
    WHILE TRUE DO
        inv_bits(P1OUT, GREENLED); (* изменить состояние светодиода *)
        MSP430.Delay(800)          (* задержка *)
    END
END main;


BEGIN
    main
END Button.