; Kodi Hildebrandt 6/24/09 ;TSA 2009 Electronic research and Experimentation project: PIC CHRONO2 ; PIC16F877 ; THIS IS A SMALL DISPLAY PROGRAM TO PRESENT THE PROJECT AT THE TSA 2008 STATE COMPETITION. ; NECESSARY FILES: PIC16F877.INC ; NOTE: RA4 AND RE0 ARE OPEN DRAIN OUTPUTS. THEY MUST BE SET AS INPUTS IN THE DEVICE!!!!! ;NOTE, DECIMAL POINTS ARE ON WHEN THEIR RESPECTED OUTPUTS ARE SET AS "0" ;FOR THE 7 SEGMENT DISPLAY OUTPUTS 7=D.P. 6=A 5=B 4=C 3=D 2=E 1=F 0=G ;FOR THE GATES, RA1 RA2 =GATE 1 RA0 RA3 =GATE 2 ;PORTC =THIRD DIGIT, PORTD=SECOND DIGIT, PORTB=FIRST DIGIT ;--------------------------------------------------------------------------------------------------------------------------- list P=16f877 #include __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _WDT_OFF & _BODEN_OFF & _WRT_ENABLE_ON & _PWRTE_ON & _XT_OSC & _LVP_OFF ;--------------------------------------------------------------------------------------------------------------------------- ; VARIABLE DEFINITION -------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------------------------------- TIMER EQU H'0020' COUNT1 EQU H'0021' COUNT2 EQU H'0022' COUNT3 EQU H'0023' COUNT4 EQU H'0024' COUNT5 EQU H'0025' QPLACE_0.01 EQU H'0026' QPLACE_0.1 EQU H'0027' QPLACE_1 EQU H'0028' QPLACE_10 EQU H'0029' QPLACE_100 EQU H'002A' QPLACE_1000 EQU H'002B' QPLACE_10000 EQU H'002C' XPLACE_1 EQU H'002D' XPLACE_0.1 EQU H'002E' XPLACE_0.01 EQU H'002F' XPLACE_0.001 EQU H'0030' XPLACE_0.0001 EQU H'0031' XSPLACE_1 EQU H'0032' XSPLACE_0.1 EQU H'0033' XSPLACE_0.01 EQU H'0034' XSPLACE_0.001 EQU H'0035' XSPLACE_0.0001 EQU H'0036' XSPLACE_0.00001 EQU H'0037' XSPLACE_0.000001 EQU H'0038' ZPLACE_1 EQU H'0039' ZPLACE_0.1 EQU H'003A' ZPLACE_0.01 EQU H'003B' ZPLACE_0.001 EQU H'003C' ZPLACE_0.0001 EQU H'003D' ZPLACE_0.00001 EQU H'003E' ZPLACE_0.000001 EQU H'003F' DPLACE_0.0001 EQU H'0040' DPLACE_0.001 EQU H'0041' DPLACE_0.01 EQU H'0042' DPLACE_0.1 EQU H'0043' DPLACE_1 EQU H'0044' DPLACE_10 EQU H'0045' DPLACE_100 EQU H'0046' DPLACE_1000 EQU H'0047' DPLACE_10000 EQU H'0048' ;--------------------------------------------------------------------------------------------------------------------------- ; PROGRAM ---------------------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------------------------------- ORG 0 ;reset vector address CALL INIT BEGIN CLRF PORTA CLRF PORTB CLRF PORTC CLRF PORTD CLRF PORTE CLRF COUNT1 CLRF COUNT2 CLRF COUNT3 CLRF COUNT3 CLRF COUNT5 BSEQ CALL DSP MOVWF PORTB ;START OF DISPLAY SEQUENCE CALL DELAY.25S CALL DSP MOVWF PORTD ;BEGIN SCHROLLING "PIC CHRONO-2 ON THE SCREEN CALL DSI MOVWF PORTB CALL DELAY.25S CALL DSP MOVWF PORTC CALL DSI MOVWF PORTD CALL DSC MOVWF PORTB CALL DELAY.25S CALL DSI MOVWF PORTC CALL DSC MOVWF PORTD CALL DSPACE MOVWF PORTB CALL DELAY.25S CALL DSC MOVWF PORTC CALL DSPACE MOVWF PORTD CALL DSC MOVWF PORTB CALL DELAY.25S CALL DSPACE MOVWF PORTC CALL DSC MOVWF PORTD CALL DSH MOVWF PORTB CALL DELAY.25S CALL DSC MOVWF PORTC CALL DSH MOVWF PORTD CALL DSR MOVWF PORTB CALL DELAY.25S CALL DSH MOVWF PORTC CALL DSR MOVWF PORTD CALL DSO MOVWF PORTB CALL DELAY.25S CALL DSR MOVWF PORTC CALL DSO MOVWF PORTD CALL DSN MOVWF PORTB CALL DELAY.25S CALL DSO MOVWF PORTC CALL DSN MOVWF PORTD CALL DSO MOVWF PORTB CALL DELAY.25S CALL DSN MOVWF PORTC CALL DSO MOVWF PORTD CALL DLINE MOVWF PORTB CALL DELAY.25S CALL DSO MOVWF PORTC CALL DLINE MOVWF PORTD CALL DS2 MOVWF PORTB CALL DELAY.25S CALL DLINE MOVWF PORTC CALL DS2 MOVWF PORTD CALL DSPACE MOVWF PORTB CALL DELAY.25S CALL DS2 MOVWF PORTC CALL DSPACE MOVWF PORTD CALL DSPACE MOVWF PORTB CALL DELAY.25S CALL DSPACE MOVWF PORTC CALL DSPACE MOVWF PORTD CALL DSPACE MOVWF PORTB CALL DELAY.5S BDIS1 BTFSS PORTE, 0 GOTO BDIS1 BTFSS PORTE, 2 GOTO BDIS1 CALL DELAY.07S CALL DSF ;OFFER CHOICE FOR SPEED F/S MOVWF PORTC CALL DSP MOVWF PORTD CALL DSS MOVWF PORTB BDISS1 BTFSS PORTE, 2 ;DOES THE USER WISH TO CYCLE OPTIONS? GOTO BDIS2 BTFSS PORTE, 1 ;DOES THE USER WISH TO CHOOSE SPEED? GOTO SPEED ;YES BTFSS PORTE, 0 ;DOES THE USER WISH TO CYCLE OPTIONS? GOTO BDIS2 GOTO BDISS1 BDIS2 BTFSS PORTE, 0 GOTO BDIS2 BTFSS PORTE, 2 GOTO BDIS2 CALL DELAY.07S CALL DSS ;OFFER CHOICE FOR TIME SEC. MOVWF PORTC CALL DSE MOVWF PORTD CALL DSC MOVWF PORTB BDISS2 BTFSS PORTE, 2 ;DOES THE USER WISH TO CYCLE OPTIONS? GOTO BDIS1 BTFSS PORTE, 1 ;DOES THE USER WISH TO CHOOSE TIME? GOTO TIME ;YES BTFSS PORTE, 0 ;DOES THE USER WISH TO CYCLE OPTIONS? GOTO BDIS1 GOTO BDISS2 TIME MOVLW D'1' MOVWF COUNT5 ;---------------------------------------------------------------------------------------------------------- SPEED CLRF PORTB CLRF PORTC CLRF PORTD CLRF XPLACE_1 ;CLEAR THE COUNT REGISTERS CLRF XPLACE_0.1 CLRF XPLACE_0.01 CLRF XPLACE_0.001 CLRF XPLACE_0.0001 BSF PORTA, 0 ;TURN ON GATE OPTOCOUPLERS BSF PORTA, 1 BSF PORTB, 3 ;A SPACE IN THE FIRST DIGIT IS DISPLAYED TELLING THE USER THE GATES ARE TURNING ON CALL DELAY.25S ;ALLOW THE OPTOCOUPLERS TO TURN ON AND TIME FOR THE PHOTOTRANSISTORS TO AJUST-TIME IS GREATER THAN IS NECESSARY, ;BUT IT GIVES THE USER AN EFFECT CLRF PORTB CLRF PORTC CLRF PORTD BSF PORTB, 7 ;TURN OFF THE DECIMAL POINTS BSF PORTC, 7 BSF PORTD, 7 BSF PORTD, 0 ;TURN ON MIDDLE MINUS SEGMENT SAYING THAT THE GATES ARE READY GATE1 BTFSS PORTA, 2 ;HAS THE FIRSTGATE BEEN BROKEN YET? GOTO GATE1 BSF PORTC, 0 ;TURN ON THE THREE NEGATIVE SIGNS TO SHOW THAT THE FIRST GATE HAS BEEN BROKEN BSF PORTB, 0 ;THESE THREE COMMANDS ALLOW FOR EXACT TIMING COMPENSATION BCF PORTA, 1 ;TURN OFF FIRST GATE LED BANK TO CONSERVE CURRENT BXCOUNT INCF XPLACE_0.0001 ; DELAY =100uS or 1x10^-4S BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO NSHIFT ; YES, BEGIN TO CALCULATE THE SPEED MOVLW D'10' XORWF XPLACE_0.0001, W ;HAS THE .0001 REGISTER REACHED .001? BTFSS STATUS, Z GOTO XCNT1 INCF XPLACE_0.001 CLRF XPLACE_0.0001 GOTO $+1 ;TIMING COMPENSATION XCNT2 NOP BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO NSHIFT ; YES, BEGIN TO CALCULATE THE SPEED MOVLW D'10' XORWF XPLACE_0.001, W ;HAS THE .001 REGISTER REACHED .01? BTFSS STATUS, Z GOTO XCNT3 INCF XPLACE_0.01 CLRF XPLACE_0.001 GOTO $+1 ;TIMING COMPENSATION XCNT4 NOP BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO NSHIFT ; YES, BEGIN TO CALCULATE THE SPEED MOVLW D'10' XORWF XPLACE_0.01 , W ;HAS THE .01 REGISTER REACHED .1? BTFSS STATUS, Z GOTO XCNT5 INCF XPLACE_0.1 CLRF XPLACE_0.01 GOTO $+1 ;TIMING COMPENSATION XCNT6 NOP BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO NSHIFT ; YES, BEGIN TO CALCULATE THE SPEED MOVLW D'10' XORWF XPLACE_0.1, W ;HAS THE .1 REGISTER REACHED 1? BTFSS STATUS, Z GOTO XCNT7 INCF XPLACE_1 CLRF XPLACE_0.1 GOTO $+1 ;TIMING COMPENSATION XCNT8 GOTO $+1 BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO NSHIFT ; YES, BEGIN TO CALCULATE THE SPEED CLRF COUNT2 BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO RNDUP BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO RNDUP BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO RNDUP BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO RNDUP RNDLP BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO RNDUP BTFSC PORTA, 3 ; HAS THE SECOND GATE BEEN BROKEN? GOTO RNDUP INCF COUNT2 MOVLW D'4' XORWF COUNT2, W ;HAS IT REPEATED 5 TIMES BTFSS STATUS, Z GOTO RNDLP ;NO GOTO $+1 ;COMPENSATION GOTO BXCOUNT ;YES, REPEAT COUNTING SEQUENCE XCNT1 NOP ;TIMING COMPENSATION GOTO XCNT2 XCNT3 NOP ;TIMING COMPENSATION GOTO XCNT4 XCNT5 NOP ;TIMING COMPENSATION GOTO XCNT6 XCNT7 NOP ;TIMING COMPENSATION GOTO XCNT8 RNDUP INCF XPLACE_0.0001 ; THIS CODE SEGMENT ROUNDS UP THE TIME BY 1 IF THE COUNT CYCLE WAS CUT OFF AFTER HALF OF THE FULL CYCLE MOVLW D'10' XORWF XPLACE_0.0001, W ;HAS THE .0001 REGISTER REACHED .001? BTFSS STATUS, Z GOTO RNDUP1 INCF XPLACE_0.001 CLRF XPLACE_0.0001 RNDUP1 MOVLW D'10' XORWF XPLACE_0.001, W ;HAS THE .001 REGISTER REACHED .01? BTFSS STATUS, Z GOTO RNDUP2 INCF XPLACE_0.01 CLRF XPLACE_0.001 RNDUP2 MOVLW D'10' XORWF XPLACE_0.01, W ;HAS THE .01 REGISTER REACHED .1? BTFSS STATUS, Z GOTO RNDUP3 INCF XPLACE_0.1 CLRF XPLACE_0.01 RNDUP3 MOVLW D'10' XORWF XPLACE_0.1, W ;HAS THE .1 REGISTER REACHED 1? BTFSS STATUS, Z GOTO NSHIFT ;RETURN TO THE COUNTER INCF XPLACE_1 CLRF XPLACE_0.1 NSHIFT BCF PORTA, 0 ;TURN OFF GATE OPTOCOUPLERS TO REDUCE CURRENT USE DURING CALCULATION BCF PORTA, 1 ;THIS ALLOWS FOR BETTER ACCURACY OF THE ANSWER. BTFSC COUNT5, 1 ; DISPLAY SPEED OR TIME? GOTO DTIME ;TIME ;SPEED MOVF XPLACE_0.0001, 0 ;BEGIN SHIFTING THE TIME NUMBERS----DIVIDE TIME BY 100 MOVWF XSPLACE_0.000001 MOVF XPLACE_0.001, 0 MOVWF XSPLACE_0.00001 MOVF XPLACE_0.01, 0 MOVWF XSPLACE_0.0001 MOVF XPLACE_0.1, 0 MOVWF XSPLACE_0.001 MOVF XPLACE_1, 0 MOVWF XSPLACE_0.01 BCF PORTC, 0 ;TURN OFF THE THREE NEGATIVE SIGNS TO SHOW THAT THE SECOND GATE HAS BEEN BROKEN TO THE USER AND CLACULATING HAS BEGUN BCF PORTD, 0 BCF PORTD, 0 ;DIVISION SEQUENCE CLRF COUNT1 BCALC CLRW MOVF XSPLACE_0.000001, W ; MOVE SELECCTED FILE CONTENTS INTO THE W REGISTER PUT THE FIRST PLACE INTO THE PLACE HOLDER MOVWF COUNT1 ; COPY THE W REGISTER TO COUNT1 ;---------1NS PLACE INCREMENT---------------ADD X ONES PLACE TO Z ONES PLACE BY ONE--NOTE,NUMBERS HAVE BEEN MANUALLY DIVIDED BY 100 TO ALLOW FOR BETTER ACCURACY INC1 BCF PORTC, 7 ;DISPLAY THE THIRD DECIMAL POINT TO SHOW THE USER THAT IT IS CALCULATING--USING A CRUDE FORM OF PWM INCF ZPLACE_0.000001 CALL TESTLP ;CALL THE TEST LOOP DECF COUNT1 BTFSC STATUS, Z GOTO SHIFT1 GOTO INC1 SHIFT1 CLRF COUNT1 CLRW MOVF XSPLACE_0.00001, W ; PUT THE SECOND PLACE INTO THE PLACE HOLDER MOVWF COUNT1 ;ADD X TENS PLACE TO Z TENS PLACE BY ONE INC2 INCF ZPLACE_0.00001 CALL TESTLP DECF COUNT1 BTFSC STATUS, Z GOTO SHIFT2 GOTO INC2 SHIFT2 CLRF COUNT1 CLRW MOVF XSPLACE_0.0001, W ; PUT CONTENTS OF THE DEFINED FILE INTO THE W REGISTER PUT THE THIRD PLACE INTO THE PLACE HOLDER MOVWF COUNT1 ; COPY THE W REGISTER INTO COUNT1 ADD X HUNDREDS PLACE TO Z HUNDREDS PLACE BY ONE INC3 INCF ZPLACE_0.0001 CALL TESTLP DECF COUNT1 BTFSC STATUS, Z GOTO SHIFT3 GOTO INC3 SHIFT3 CLRF COUNT1 CLRW MOVF XSPLACE_0.001, W ; PUT THE FOURTH PLACE INTO THE PLACE HOLDER MOVWF COUNT1 ;ADD X THOUSANDS PLACE TO Z THOUSANDS PLACE BY ONE INC4 INCF ZPLACE_0.001 CALL TESTLP DECF COUNT1 BTFSC STATUS, Z GOTO SHIFT4 GOTO INC4 SHIFT4 BSF PORTC, 7 ;TURN OFF THIRD DECIMAL POINT TO GIVE OFF A CRUDE FORM OF CALCULATING PWM INCF QPLACE_0.01 MOVLW D'0' MOVLW D'10' ;HAS THE 1NS PLACE REACHED 10? XORWF QPLACE_0.01, W BTFSS STATUS, Z GOTO QINSET1 INCF QPLACE_0.1 ; YES, INCREMENT 10NS PLACE CLRF QPLACE_0.01 ;CLEAR THE 1NS PLACE BACK TO 0 QINSET1 MOVLW D'0' MOVLW D'10' ;HAS THE 10NS PLACE REACHED 100? XORWF QPLACE_0.1, W BTFSS STATUS, Z GOTO QINSET2 INCF QPLACE_1 ; YES, INCREMENT 100NS PLACE CLRF QPLACE_0.1 ;CLEAR THE 10NS PLACE BACK TO 0 QINSET2 MOVLW D'0' MOVLW D'10' ;HAS THE 100NS PLACE REACHED 1000? XORWF QPLACE_1, W BTFSS STATUS, Z GOTO QINSET3 INCF QPLACE_10 ; YES, INCREMENT 1000NS PLACE CLRF QPLACE_1 ;CLEAR THE 100NS PLACE BACK TO 0 QINSET3 MOVLW D'0' MOVLW D'10' ;HAS THE 1000NS PLACE REACHED 10000? XORWF QPLACE_10, W BTFSS STATUS, Z GOTO QINSET4 INCF QPLACE_100 ; YES, INCREMENT 10000NS PLACE CLRF QPLACE_10 ;CLEAR THE 1000NS PLACE BACK TO 0 QINSET4 CLRW MOVLW D'10' ;HAS THE 100NS PLACE REACHED 1000? XORWF QPLACE_100, W BTFSS STATUS, Z GOTO QINSET5 INCF QPLACE_1000 ; YES, INCREMENT 1000NS PLACE CLRF QPLACE_100 ;CLEAR THE 100NS PLACE BACK TO 0 QINSET5 CLRW MOVLW D'10' ;HAS THE 1000NS PLACE REACHED 10000? XORWF QPLACE_1000, W BTFSS STATUS, Z GOTO QINSET6 INCF QPLACE_10000 ; YES, INCREMENT 10000NS PLACE CLRF QPLACE_1000 ;CLEAR THE 1000NS PLACE BACK TO 0 QINSET6 CLRW MOVLW D'1' XORWF ZPLACE_1, W BTFSS STATUS, Z GOTO BCALC GOTO NUMBTRANS ;END OF DIVISION SEQUENCE ;THIS CODE SEQUENCE TRANSLATES THE RAW DATA INTO SOMETHING THAT CAN BE DISPLAYED IN A READABLE LANGUAGE ON THE SCREEN NUMBTRANS MOVF QPLACE_0.01, W ;STORE FIRST DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_0.01 MOVF QPLACE_0.1, W ;STORE SECOND DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_0.1 MOVF QPLACE_1, W ;STORE FIRST DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_1 MOVF QPLACE_10, W ;STORE SECOND DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_10 MOVF QPLACE_100, W ;STORE SECOND DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_100 MOVF QPLACE_1000, W ;STORE SECOND DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_1000 MOVF QPLACE_10000, W ;STORE SECOND DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_10000 GOTO NUMBDISP NUMT MOVLW D'0' ;DOES THE SPECIFIED PLACE HOLD A 0 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM1_1 ;NOPE CALL DS0 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM1_1 MOVLW D'1' ;DOES THE SPECIFIED PLACE HOLD A 1 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM2_1 ;NOPE CALL DS1 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM2_1 MOVLW D'2' ;DOES THE SPECIFIED PLACE HOLD A 2 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM3_1 ;NOPE CALL DS2 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM3_1 MOVLW D'3' ;DOES THE SPECIFIED PLACE HOLD A 3 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM4_1 ;NOPE CALL DS3 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM4_1 MOVLW D'4' ;DOES THE SPECIFIED PLACE HOLD A 4 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM5_1 ;NOPE CALL DS4 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM5_1 MOVLW D'5' ;DOES THE SPECIFIED PLACE HOLD A 5 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM6_1 ;NOPE CALL DS5 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM6_1 MOVLW D'6' ;DOES THE SPECIFIED PLACE HOLD A 6 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM7_1 ;NOPE CALL DS6 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM7_1 MOVLW D'7' ;DOES THE SPECIFIED PLACE HOLD A 7 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM8_1 ;NOPE CALL DS7 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM8_1 MOVLW D'8' ;DOES THE SPECIFIED PLACE HOLD A 8 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM9_1 ;NOPE CALL DS8 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM9_1 MOVLW D'9' ;DOES THE SPECIFIED PLACE HOLD A 9 XORWF COUNT2, W BTFSS STATUS, Z GOTO NUM10 ;NOPE CALL DS9 ;YEP, PUT THE NUMBER IN IT'S PLACE MOVWF COUNT3 NUM10 RETURN ;------THIS CODE SEGMENT ALLOWS THE USER TO VIEW THE SPEED STORED IN THE REGISTERS NUMBDISP MOVF DPLACE_10000, W ;DISPLAY THE NUMBERS ON THE SCREEN MOVWF PORTC MOVF DPLACE_1000, W MOVWF PORTD MOVF DPLACE_100, W MOVWF PORTB CALL DELAY.5S MOVF DPLACE_1000, W ;DISPLAY THE NUMBERS ON THE SCREEN MOVWF PORTC MOVF DPLACE_100, W MOVWF PORTD MOVF DPLACE_10, W MOVWF PORTB CALL DELAY.5S MOVF DPLACE_100, W ;DISPLAY THE NUMBERS ON THE SCREEN MOVWF PORTC MOVF DPLACE_10, W MOVWF PORTD MOVF DPLACE_1, W MOVWF PORTB BCF PORTB, 7 ;DECIMAL POINT CALL DELAY.5S MOVF DPLACE_10, W ;DISPLAY THE NUMBERS ON THE SCREEN MOVWF PORTC MOVF DPLACE_1, W MOVWF PORTD MOVF DPLACE_0.1, W MOVWF PORTB BCF PORTD, 7 ;DECIMAL POINT CALL DELAY.5S MOVF DPLACE_1, W ;DISPLAY THE NUMBERS ON THE SCREEN MOVWF PORTC MOVF DPLACE_0.1, W MOVWF PORTD MOVF DPLACE_0.01, W MOVWF PORTB BCF PORTC, 7 ;DECIMAL POINT CALL DELAY.5S GOTO NUMBDISP ;-----Z NUMBER PLACE TEST LOOP--------------------------------------------------- TESTLP MOVLW D'0' MOVLW D'10' ;HAS THE 1NS PLACE REACHED 10? XORWF ZPLACE_0.000001, W BTFSS STATUS, Z GOTO INSET1 INCF ZPLACE_0.00001 ; YES, INCREMENT 10NS PLACE CLRF ZPLACE_0.000001 ;CLEAR THE 1NS PLACE BACK TO 0 INSET1 MOVLW D'0' MOVLW D'10' ;HAS THE 10NS PLACE REACHED 100? XORWF ZPLACE_0.00001, W BTFSS STATUS, Z GOTO INSET2 INCF ZPLACE_0.0001 ; YES, INCREMENT 100NS PLACE CLRF ZPLACE_0.00001 ;CLEAR THE 10NS PLACE BACK TO 0 INSET2 MOVLW D'0' MOVLW D'10' ;HAS THE 100NS PLACE REACHED 1000? XORWF ZPLACE_0.0001, W BTFSS STATUS, Z GOTO INSET3 INCF ZPLACE_0.001 ; YES, INCREMENT 1000NS PLACE CLRF ZPLACE_0.0001 ;CLEAR THE 100NS PLACE BACK TO 0 INSET3 MOVLW D'0' MOVLW D'10' ;HAS THE 1000NS PLACE REACHED 10000? XORWF ZPLACE_0.001, W BTFSS STATUS, Z GOTO INSET4 INCF ZPLACE_0.01 ; YES, INCREMENT 10000NS PLACE --#>OR=1 CLRF ZPLACE_0.001 ;CLEAR THE 10NS PLACE BACK TO 0 INSET4 MOVLW D'0' MOVLW D'10' ;HAS THE 10000NS PLACE REACHED 100000? XORWF ZPLACE_0.01, W BTFSS STATUS, Z GOTO INSET5 INCF ZPLACE_0.1 ; YES, INCREMENT 100000NS PLACE --#>OR=1 CLRF ZPLACE_0.01 ;CLEAR THE 10NS PLACE BACK TO 0 INSET5 MOVLW D'0' MOVLW D'10' ;HAS THE 100000NS PLACE REACHED 1000000? XORWF ZPLACE_0.1, W BTFSS STATUS, Z GOTO INSET6 INCF ZPLACE_1 ; YES, INCREMENT 1000000NS PLACE --#>OR=1 CLRF ZPLACE_0.1 ;CLEAR THE 10NS PLACE BACK TO 0 INSET6 NOP RETURN ;--------------------------------------------------------------- DTIME MOVF XPLACE_0.0001, W ;STORE FIRST DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_0.0001 MOVF XPLACE_0.001, W ;STORE SECOND DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_0.001 MOVF XPLACE_0.01, W ;STORE FIRST DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_0.01 MOVF XPLACE_0.1, W ;STORE SECOND DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_0.1 MOVF XPLACE_1, W ;STORE SECOND DIGIT INTO COUNT SHIFT REGISTER MOVWF COUNT2 CALL NUMT MOVF COUNT3, W ;MOVE TRANSLATED NUMBER INTO THE DISPLAY REGISTER MOVWF DPLACE_1 TNUMBDISP MOVF DPLACE_1, W ;DISPLAY THE NUMBERS ON THE SCREEN MOVWF PORTC MOVF DPLACE_0.1, W MOVWF PORTD MOVF DPLACE_0.01, W MOVWF PORTB BCF PORTC, 0 CALL DELAY.5S MOVF DPLACE_0.1, W ;DISPLAY THE NUMBERS ON THE SCREEN MOVWF PORTC MOVF DPLACE_0.01, W MOVWF PORTD MOVF DPLACE_0.001, W MOVWF PORTB CALL DELAY.5S MOVF DPLACE_0.01, W ;DISPLAY THE NUMBERS ON THE SCREEN MOVWF PORTC MOVF DPLACE_0.001, W MOVWF PORTD MOVF DPLACE_0.0001, W MOVWF PORTB BCF PORTB, 7 ;DECIMAL POINT CALL DELAY.5S GOTO TNUMBDISP ;-----NUMBER AND LETTER TRANSLATION DATA----------------------- DS0 MOVLW B'11111110' RETURN DS1 MOVLW B'10110000' RETURN DS2 MOVLW B'11101101' RETURN DS3 MOVLW B'11111001' RETURN DS4 MOVLW B'10110011' RETURN DS5 MOVLW B'11011011' RETURN DS6 MOVLW B'11011111' RETURN DS7 MOVLW B'11110000' RETURN DS8 MOVLW B'11111111' RETURN DS9 MOVLW B'11111011' RETURN DSA MOVLW B'11110111' RETURN DSB MOVLW B'10011111' RETURN DSC MOVLW B'11001110' RETURN DSD MOVLW B'10111101' RETURN DSE MOVLW B'11001111' RETURN DSF MOVLW B'11000111' RETURN DSG MOVLW B'11011110' RETURN DSH MOVLW B'10110111' RETURN DSI MOVLW B'10000110' RETURN DSJ MOVLW B'10111100' RETURN DSK ;CAN'T BE DISPLAYED DSL MOVLW B'10001110' RETURN DSM ;CAN'T BE DISPLAYED DSN MOVLW B'10010101' RETURN DSO MOVLW B'10011101' RETURN DSP MOVLW B'11100111' RETURN DSQ ;CAN'T BE DISPLAYED DSR MOVLW B'10000101' RETURN DSS MOVLW B'11011011' RETURN DST MOVLW B'11000110' RETURN DSU MOVLW B'10011100' RETURN DSV ;CAN'T BE DISPLAYED DSW ;CAN'T BE DISPLAYED DSX ;CAN'T BE DISPLAYED DSY MOVLW B'10100111' RETURN DSZ ;CAN'T BE DISPLAYED DSPACE MOVLW B'10000000' RETURN DLINE MOVLW B'10000001' RETURN ;INITIALIZATION-CONFIGURES I/O'S------------------------------------------------------------------- INIT BSF STATUS, RP0 ;SHIFT INTO BIT BANK 1 MOVLW B'00001100' ;SET PORTA, 3 AND 3 AS INPUTS, THE REST AS AN OUTPUT MOVWF TRISA MOVLW B'00000000' ;SET ALL OF PORTB-D AS OUTPUTS MOVWF TRISB MOVLW B'00000000' MOVWF TRISC MOVLW B'00000000' MOVWF TRISD MOVLW B'00000111' ;SET ALL OF PORTE AS AN INPUT MOVWF TRISE MOVLW B'00000110' MOVWF ADCON1 ;SET ALL OF PORTE AND PORTA'S OUTPUTS AS DIGITAL OUTPUTS BCF STATUS, RP0 ;RETURN TO BIT BANK 0 CLRF PORTA CLRF PORTB CLRF PORTC CLRF PORTD CLRF PORTE RETURN ;----------------------------------------- ;TIME DELAYS --------------------------- ;----------------------------------------- DELAY1S CALL DELAY.25S ;ACTUAL DELAY IS 1.000016S DELAY.75S CALL DELAY.25S ;ACTUAL DELAY IS .750012S DELAY.5S CALL DELAY.25S ;ACTUAL DELAY IS .500008 DELAY.25S MOVLW D'250' ;CYCLE 250 TIMES DELAY MOVWF TIMER LP997CC CALL DELAY997CC DECFSZ TIMER ;HAS IT REACHED 0? GOTO LP997CC RETURN ;YES. NOTE--ACTUAL TOTAL DELAY IS .250004S DELAY997CC MOVLW D'248' ; STORE 250 INTO W LPS ADDLW D'255' ;DECREMENT W BY 1 BTFSS STATUS, Z ;HAS IT REACHED 0? GOTO LPS ;NOT DONE YET ;996CC RETURN ;DONE--WASTED CLOCK CYCLES AFTER RETURN INCLUDING THE INITIAL CALL STATEMENT=997 DELAY.07S MOVLW D'7' ;USED TO IGNORE INPUT SWITCH VIBRATIONS CALL DELAY RETURN END