Nagyrészében ugyan azt kell csinálni, mint az előzőnél, az RB0/INT esetén.
LIST P=16F877
#INCLUDE "P16F877.INC"
ERRORLEVEL 0, -302 ; suppress bank selection messages
__CONFIG _XT_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF
CBLOCK 0x70 ;A Minden BANK-ból látható GPR kezdőcím
W_SAVE
STATUS_SAVE
ENDC
#include "m_bank.asm"
ORG 0
GOTO MAIN ;Beugrunk a MAIN loopba
ORG 4
; Elmentjük a Work és Status regisztereket
MOVWF W_SAVE ;Először a Work regisztert
MOVFW STATUS ;STATUS-t bele a már lementett Workbe
MOVWF STATUS_SAVE ;Status_save-be beletölti a Worköt
BCF INTCON,RBIF ;Töröljük az RBIF flag bitet (Jelezzük, kezeltük a megszakítást RB4:7)
MOVLW B'11111111'
XORWF PORTD,F ;XOR PORTD bitjeit
; Visszatöltjük a Work és Status regisztereket
MOVFW STATUS_SAVE
MOVWF STATUS
MOVFW W_SAVE
RETFIE ;Visszajövünk az interruptból
MAIN
BANK1 ;Unit az m_bank.asm-ben
MOVLW B'00000000' ;Betöltjük az akksiba a TRISD-be valót
MOVWF TRISD ;Beletöltjük (mind kimenet a nulla miatt)
MOVLW B'11110000' ;Betöltjük az akksiba a TRISB-be valót
MOVWF TRISB ;Felső 4 bemenet (RB4-RB7)
BANK0 ;BANK0-ba visszalépünk
MOVLW B'01010101' ;Betöltjük az akksiba a PORTD-be valót
MOVWF PORTD ;Beletöltjük a PORTD-be
;Beállítjuk az RB4:7 interruptot
BSF INTCON,RBIE ;Engedélyezzük az interruptot az RB4:7-re
BSF INTCON,GIE ;General Interrupt Enable bitet 1-re állítva bekapcsolunk mindent
LOOP
NOP
GOTO LOOP ;Vissza a végtelen ciklusba
END ;Teljes program végét jelentő END
Ugyan azt csinálja mint az előző program, de gombnyomás hatására itt egyfolytában fog "változni", így csak azt látjuk, hogy nagyon gyorsan villognak a LED-ek, és annak ellenére, hogy csak minden második világít, folyamatos teljes soros világítást láthatunk. Ennek oka a szem tehetetlensége, így egybemosódik a kép.
Az egész program forráskód, segéd rutinok és fordított hex: rb47_asm.zip
Ugyan ezt nézzük C nyelven...
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!