Code:
;********************************************************************************************** 
  
; RESET		
; Set ports A & B

MAIN	clrf	FLAG_1		; clear flag memory
	clrf	ERR_FLG		; clear error flag used in calibration
	clrf	TIME_CNT1	; clear time period counter for speed pulse update
	clrf	TIME_CNT2	; clear time period counter
	clrf	PULSE_CNT	; clear speed pulse counter
	clrf	SPEED1		; clear speedometer display1 
	clrf	SPEED2		; clear speedometer display2 
	clrf	SPEED3		; clear speedometer display3 
	bsf	STATUS,RP0	; select memory bank 1
	movlw	B'00000001'	; w = 00000001 binary (RB0 input, RB1-RB7 output)
	movwf	TRISB		; port B data direction register
	movlw	B'10000000'	; w = 10000000 binary
	movwf	OPTION_REG	; TMRO prescaler no division, PORTB pullups disabled
	movlw   B'00010000'	; w = 10000 binary (RA0-RA2, RA3 outputs, RA4 input)
	movwf   TRISA		; A port data direction register
	bcf	STATUS,RP0	; select memory bank 0
	movlw	B'11111110'	; w is all 1's for RB7-RB1, 0 for RB0
	movwf	PORTB		; portB outputs high
	movlw	B'00001111'
	movwf	PORTA		; portA RA0 high, RA1,RA2 outputs high, RA3 high 
	
; get memory in EEPROM1, EEPROM2 & EEPROM3 for speed setting, place in DISP1, DISP2, DISP3
	
	movlw	EEPROM1		; address for EEPROM1
	call	EEREAD		; read EEPROM storage
	sublw	0x09		; compare with 9
	btfss	STATUS,C	; skip if positive therefore a 9 or less
	goto	CLR1		; greater than 9 then clear to 0
	movf	EEDATA,w	; restore w
	movwf	DISP1		; EEPROM1 to DISP1
	goto	EEPRM2
CLR1	clrf	DISP1		; Disp1 = 0 as disp1 was more than 9 (illegal value)
	
EEPRM2	movlw	EEPROM2		; address for EEPROM2
	call	EEREAD
	sublw	0x09		; compare with 9
	btfss	STATUS,C	; skip if positive therefore a 9 or less
	goto	CLR2
	movf	EEDATA,w	; restore w
	movwf	DISP2		; EEPROM2 to DISP2
	goto	EEPRM3
CLR2	clrf	DISP2		; disp2 = 0 as disp2 was more than 9 (illegal value)

EEPRM3	movlw	EEPROM3		; address for EEPROM3
	call	EEREAD
	sublw	0x01		; compare with 1
	btfss	STATUS,C	; skip if positive therefore a 1 or less
	goto	CLR3
	movf	EEDATA,w	; restore w
	movwf	DISP3		; EEPROM3 to DISP3
	goto	EEPRM5
CLR3	clrf	DISP3		; disp3 = 0 as disp3 was more than 1 (illegal value)

; get EEPROM5 and EEPROM6 calibration values and place in TIME_CNT3 and TIME_CNT4

EEPRM5	movlw	EEPROM5		; address for EEPROM5
	call	EEREAD
	movwf	TIME_CNT3	; store in LS byte calibration register
	movlw	EEPROM6		; address for EEPROM6
	call	EEREAD
	movwf	TIME_CNT4	; store in MS byte calibration register

; get memory EEPROM4 and place in REPEAT. This is the indicator for
; repeat alarm on or off, bit 0. ON/OFF flag, bit 1, bit 2 is speedo, bit 3 is speedo on/off 
; bit 4 is alarm threshold high or low
	
EEPRM4	movlw	EEPROM4		; address for EEPROM4
	call	EEREAD
	movwf	REPEAT		; store in repeat register

; check for pressed up switch
	
	bcf	PORTA,2		; clear RA2 to check if up switch pressed
	nop
	nop			; allow time for levels to settle
	btfsc	PORTA,4		; is up switch pressed
	goto	CHK_DN		; switch open so check down switch
	btfsc	REPEAT,0	; test for repeat flag bit 0	
	goto	CLRREP		; clear repeat off alarm
	bsf	REPEAT,0	; set repeat for alarm
	movlw	B'10000110'	; 'r' on display for repeat alarm
	goto	SWOPEN
CLRREP	bcf	REPEAT,0	; clear repeat
	movlw	B'01111110'	; '-' on display for no repeat alarm
SWOPEN	movwf	TEMP_1
SWCLSD	bsf	PORTA,0		; display off
	bsf	PORTB,5		; clear a segment
	bsf	PORTB,6		; clear b segment
	bsf	PORTB,3		; e segment
	bsf	PORTB,4		; f segment
	bsf	PORTB,7		; g segment
	bsf	PORTB,2		; clear display at RB	
	bcf	PORTA,2		; clear RA2 to check if up switch pressed
	call	DELMO
	btfsc	PORTA,4		; wait for switch to open
	goto	MODESTO		; store repeat setting when switch opens

; multiplex display until switch opens

	bsf	PORTA,2		; RA2 high
	nop
	nop
	nop
	bcf	PORTA,0		; RA0 low so display 1 lit
	movf	TEMP_1,w	; retrieve temp storage value
	movwf	PORTB		; port B a-g segments on again
	call	DELMO		; more delay time 
	goto 	SWCLSD		; check for pressed switch

; check for pressed down switch
	
CHK_DN	bsf	PORTA,2		; RA2 high so Disp3 will be off
	bsf	PORTA,0		; RA0 high so disp1 off
	nop
	nop
	bcf	PORTA,1		; clear RA1 to check if down switch pressed
	nop
	nop			; allow time for levels to settle
	btfsc	PORTA,4		; is down switch pressed
	goto	CHK_MDE		; switch open so check mode switch
	btfsc	REPEAT,4	; test for threshold flag bit 4	
	goto	CLRTRS		; clear threshold flag bit
	bsf	REPEAT,4	; set threshold high
	movlw	B'00100100'	; 'H' on display for high threshold
	goto	DNOPEN
CLRTRS	bcf	REPEAT,4	; clear threshold flag
	movlw	B'11100010'	; 'L' on display for low threshold
DNOPEN	movwf	TEMP_1
DNCLSD  bsf	PORTB,6		; clear b segment
	bsf	PORTB,1		; clear c segment
	bsf	PORTB,3		; e segment
	bsf	PORTB,4		; f segment
	bsf	PORTB,7		; g segment
	bsf	PORTB,2		; d segment	
	bcf	PORTA,1		; clear RA1 to check if down switch pressed
	call	DELMO		; more delay time (multiplex)
	call	DELMO		; more delay time 
	btfsc	PORTA,4		; wait for switch to open
	goto	MODESTO		; store repeat setting when switch open
	
; multiplex display until switch opens

	movf	TEMP_1,w
	movwf	PORTB		; port B a-g segments on again
	call	DELMO		; more delay time 
	goto 	DNCLSD		; check for pressed switch