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
Bookmarks