| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- (*
- Пример для 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.
|