(* Пример для LaunchPad MSP-EXP430G2 Rev1.5 При нажатии на кнопку P1.3, инкрементируется переменная-счетчик перезапусков и программа перезапускается. В зависимости от четности счетчика перезапусков, включается зеленый или красный светодиод. *) MODULE Restart; IMPORT SYSTEM, MSP430; CONST REDLED = {0}; GREENLED = {6}; BUTTON = {3}; (* регистры порта P1 *) P1OUT = 21H; P1DIR = 22H; P1IFG = 23H; P1IE = 25H; P1REN = 27H; VAR count: INTEGER; (* счетчик перезапусков *) 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 test_bits (mem: INTEGER; bits: SET): SET; VAR b: BYTE; BEGIN SYSTEM.GET(mem, b) RETURN bits * BITS(b) END test_bits; (* обработчик прерываний *) PROCEDURE int (priority: INTEGER; interrupt: MSP430.TInterrupt); BEGIN IF priority = 18 THEN (* прерывание от порта P1 *) IF test_bits(P1IFG, BUTTON) = BUTTON THEN (* нажата кнопка *) INC(count); (* увеличить счетчик *) MSP430.Delay(500); (* задержка для отпускания кнопки *) clr_bits(P1IFG, BUTTON); (* сбросить флаг прерывания *) MSP430.Restart (* перезапустить программу *) 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); (* разрешить прерывания от кнопки *) (* выключить светодиоды *) clr_bits(P1OUT, REDLED + GREENLED); MSP430.SetIntProc(int); (* назначить обработчик прерываний *) MSP430.EInt; (* разрешить прерывания *) IF ODD(count) THEN set_bits(P1OUT, GREENLED) (* нечетное - вкл. зеленый *) ELSE set_bits(P1OUT, REDLED) (* четное - вкл. красный *) END END main; BEGIN main END Restart.