list p=16f877
#include <p16f877.inc>
radix dec
; Begin
R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
W_TEMP EQU 0x7F
STATUS_TEMP EQU 0x7E
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0002
ORG 0x0004
MOVWF W_TEMP
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
CALL L0003
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
L0002:
; 1: 'Prog for 16F877 with 74C922 connected to PORTA lower nibble,
; 2: 'RA4 is used as Intr from 'data available' triggering T0 Timer cntr
; 3: 'test output is PORTB
; 4:
; 5: AllDigital
BSF STATUS,RP0
MOVLW 0x06
MOVWF 0x1F
; 6:
BCF STATUS,RP0
; 7: Dim key As Byte
; The address of 'key' is 0x2C
key EQU 0x2C
; 8: Dim keycode As Byte
; The address of 'keycode' is 0x2D
keycode EQU 0x2D
; 9:
; 10: TRISA = 0xff
BSF STATUS,RP0
MOVLW 0xFF
MOVWF 0x05
; 11: TRISB = 0x00
CLRF 0x06
; 12:
; 13: OPTION_REG.T0CS = 1 'selects RA4 as the T0 CLK input
BSF 0x01,5
; 14: OPTION_REG.T0SE = 0 'intr on press,,, =1 intr on release
BCF 0x01,4
; 15: INTCON.T0IE = 1 'enables the T0 timer to Interrupt
BCF STATUS,RP0
BSF 0x0B,5
; 16: TMR0 = 255
MOVLW 0xFF
MOVWF 0x01
; 17:
; 18: Enable 'this enables the Interrrupts
BSF INTCON,GIE
; 19:
; 20: loop:
L0001:
; 21:
; 22: Goto loop
GOTO L0001
; 23:
; 24:
; 25: End
L0004: GOTO L0004
; 26:
; 27: On Interrupt
L0003:
; 28:
; 29:
; 30: INTCON.T0IF = 0 'clears the Interrupt flag, set by T0 timer
BCF 0x0B,2
; 31:
; 32: key = PORTA And 0x0f
MOVF 0x05,W
MOVWF R0L
MOVLW 0x0F
ANDWF R0L,W
MOVWF 0x2C
; 33:
; 34: 'replace the 0 to 15, with a byte that represents the encryption
; 35: 'example: keycode = LookUp(7, 4, 3, 0, 2, 1, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15), key
; 36: keycode = LookUp(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), key
MOVF 0x2C,W
SUBLW 0x0F
BTFSS STATUS,C
GOTO L0005
CALL L0006
MOVWF 0x2D
GOTO L0005
L0006:
MOVLW 0x00
MOVWF PCLATH
MOVF 0x2C,W
ADDWF PCL,F
RETLW 0x00
RETLW 0x01
RETLW 0x02
RETLW 0x03
RETLW 0x04
RETLW 0x05
RETLW 0x06
RETLW 0x07
RETLW 0x08
RETLW 0x09
RETLW 0x0A
RETLW 0x0B
RETLW 0x0C
RETLW 0x0D
RETLW 0x0E
RETLW 0x0F
L0005:
; 37:
; 38: PORTB = keycode
MOVF 0x2D,W
MOVWF 0x06
; 39:
; 40: TMR0 = 255
MOVLW 0xFF
MOVWF 0x01
; 41:
; 42: Resume
RETURN
; End of program
L0007: GOTO L0007
; End of listing
END