Система переривань мікроконтролера PIC16F84. Власні оброблювачі переривань, страница 4

0009 2022           00020         call obrob_INT          ;вызов подпрограммы

000A 180B           00021         btfsc INTCON,RBIF       ;ожидание смены сигнала на RB7-RB4

000B 2028           00022         call obrob_RB4          ;вызов подпрограммы

000C 0E0F           00023         swapf T_STATUS,W        ;востановление STATUS

000D 0083           00024         movwf STATUS

000E 080E           00025         movf T_W,0              ;востановление W

000F 178B           00026         bsf INTCON, GIE         ;разрешение прерываний

0010 0009           00027         retfie                  ;возврат из прерывания

                    00028

                    00029

0011 201B           00030 start   call init               ;вызов подпрограммы

0012 3098           00031         movlw b'10011000'       ;запрет ненужных и разрешение

0013 008B           00032         movwf INTCON            ;нужных прерываний

0014 0806           00033         movf PORTB,0            ;чтение состаяния порта В

0015 008D           00034         movwf oldportb          ;сохранение для следубщего сравнения   

0016                00035 loop

0016 0000           00036         nop                     ;пустая команда

0017 0000           00037         nop                     ;пустая команда

0018 0000           00038         nop                     ;пустая команда

0019 0000           00039         nop                     ;пустая команда

001A 2816           00040         goto loop               ;зацикливаем программу

                    00041

                    00042

001B 3040           00043 init    movlw b'01000000'       ;внешнее прерывание на RB0/INT

MPASM 02.20 Released             LAB5.ASM   5-4-2004  21:24:27         PAGE  2

LOC  OBJECT CODE     LINE SOURCE TEXT

  VALUE

001C 0062           00044         OPTION                  ;осуществляется по переднему фронту

001D 30FF           00045         movlw b'11111111'       ;все разряды PORTB

001E 0066           00046         TRIS PORTB              ;на ввод

001F 30FD           00047         movlw b'11111101'       ;все разряды PORTA кроме первого (RA1)

0020 0065           00048         TRIS PORTA              ;на ввод

0021 0008           00049         return

                    00050

0022                00051 obrob_INT                       ;обработчик прерывания INT

0022 0F8C           00052         incfsz counter_l        ;инкремент младшего байта счетчика

0023 2825           00053         goto m1                 ;переход если нет переполнения

0024 0A90           00054         incf counter_h          ;инкремент старшего байта счетчика

0025 080C           00055 m1      movf counter_l,0

0026 108B           00056         bcf INTCON,INTF         ;сброс флага прерывания INT

0027 0008           00057         return

                    00058

0028                00059 obrob_RB4                       ;обработчик прерывания от RB4  

0028 0806           00060         movf PORTB,0            ;чтение состаяния порта В

0029 060D           00061         xorwf oldportb,0      ;сравнение с предыдущем значением порта В

002A 0091           00062         movwf test              ;сохраняем результат сравнения

002B 1E11           00063         btfss test,4            ;проверяем изминилось ли состояние RB4 

002C 2837           00064         goto notRB4             ;если нет переход на конец обработчика

                    00065           ;если изминилось то формируем импульс на выводе RA1 (ti=7*tц)

002D 1085           00066         bcf PORTA,1             ;сброс RA1

002E 1485           00067         bsf PORTA,1             ;установка RA1

002F 0000           00068         nop                     ;пустая команда

0030 0000           00069         nop                     ;пустая команда