;****************************************************************************** ; This file is a basic code template for code generation on the * ; PIC16F916. This file contains the basic code building blocks to build * ; upon. * ; * ; Refer to the MPASM User's Guide for additional information on * ; features of the assembler. * ; * ; Refer to the respective data sheet for additional * ; information on the instruction set. * ; * ;****************************************************************************** ; * ; Filename: GRAVIMETER.asm * ; Date: August 26, 2012 * ; File Version: REV 1 * ; * ; Author: Ron Newton * ; Company: * ; * ; * ;****************************************************************************** ; * ; Files Required: P16F916.INC * ; * ;****************************************************************************** ; * ; Notes: * ; * ;****************************************************************************** ; * ; Revision History: * ; * ;****************************************************************************** list p=16f916 ; list directive to define processor #include ; processor specific variable definitions ;------------------------------------------------------------------------------ ; ; CONFIGURATION WORD SETUP ; ; The 'CONFIG' directive is used to embed the configuration word within the ; .asm file. The lables following the directive are located in the respective ; .inc file. See the data sheet for additional information on configuration ; word settings. ; ;------------------------------------------------------------------------------ ;1 MCLR NC ;2 RA0 NC ;3 RA1 CAP + ;4 RA2 NC ;5 RA3 10K GND ;6 RA4 10K GND ;7 RA5 V1 ;8 GND ;9 RA7 NC ;10 RA6 NC ;11 RC0 DAC DATA ;12 RC1 DAC CLOCK ;13 RC2 DAC CS ;14 RC3 PROGRAMING SWITCH ;15 RC4 RS PIN 39 ;16 RC5 CS PIN 38 ;17 RC6 R/W PIN 37 ;18 RC7 E PIN 36 ;19 GND ;20 V POS ;21 RB0 PIN 35 ;22 RB1 PIN 34 ;23 RB2 PIN 33 ;24 RB3 PIN 32 ;25 RB4 PIN 31 ;26 RB5 PIN 30 ;27 RB6 PIN 29 CLK ;28 RB7 PIN 28 DAT __CONFIG _FCMEN_ON & _IESO_ON & _CP_OFF & _WDT_OFF & _BOD_OFF & _MCLRE_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT ;------------------------------------------------------------------------------ ; VARIABLE DEFINITIONS ; ; Available Data Memory divided into Bank 0,1,2, and 3. Each Bank contains ; Special Function Registers, General Purpose Registers, and Access RAM ; ;------------------------------------------------------------------------------ ; Bit Equates ;**************************************************************************** DONE equ 7 ;done measuring flag EMPTY equ 5 ;flag if component is connected V1 equ 5 ;power for C reference ckt msb_bit equ 7 ;define for bit 7 lsb_bit equ 0 ;define for bit 0 time equ 3 sign equ 4 CBLOCK 0x20 ; Define GPR variable register locations ;**************************************************************************** ; User Registers ;**************************************************************************** ; Bank 0 Ttemp ;temporary Time register flags ;flags register count ;RS232 register txreg ;RS232 data register delay ;RS232 delay register offset ;table position register msb ;general delay register lsb ;general delay register TimeLO ;Time registers TimeMID TimeHI BaseHI ;base register BaseMID BaseLO TIMER1 TIMER2 TIMER3 OUT ROTATE DAC_MID DAC_LO MISC ; DOG REGISTERS DATA1 COUNTER0 COUNTER1 ONES TENS HUNDREDS THOUSANDS DIGIT_1 DIGIT_2 DIGIT_3 DIGIT_4 TENK ; Math related registers ACCaHI ;24-Bit accumulator a ACCaMID ACCaLO ACCbHI ;24-Bit accumulator b ACCbMID ACCbLO ACCcHI ;24-Bit accumulator c ACCcMID ACCcLO ACCdHI ;24-Bit accumulator d ACCdMID ACCdLO temp ;temporary storage ENDC W_TEMP EQU 0x7D ; w register for context saving (ACCESS) STATUS_TEMP EQU 0x7E ; status used for context saving (ACCESS) PCLATH_TEMP EQU 0x7F ; context saving of PC (ACCESS) #DEFINE RW PORTC,6 ;RW OUT #DEFINE RS PORTC,4 ;RS OUT #DEFINE E PORTC,7 ;E OUT #DEFINE DAC_CS PORTC,2 #DEFINE CLK PORTC,1 #DEFINE DAC_SI PORTC,0 #DEFINE PROGRAM PORTC,3 ;------------------------------------------------------------------------------ ; EEPROM INITIALIZATION ; ; The 16F916 has 256 bytes of non-volatile EEPROM, starting at address 0x2100 ; ;------------------------------------------------------------------------------ DATAEE ORG 0x2100 ; DE 0x00, 0x01, 0x02, 0x03 ;------------------------------------------------------------------------------ ; RESET VECTOR ;------------------------------------------------------------------------------ ORG 0x0000 ; processor reset vector PAGESEL init goto init ;------------------------------------------------------------------------------ ; INTERRUPT SERVICE ROUTINE ;------------------------------------------------------------------------------ org 4 ; Interrupt context saving BANKSEL PORTA ;change banks MOVWF W_TEMP ; save off current W register contents MOVF STATUS,W ; move status register into W register MOVWF STATUS_TEMP ; save off contents of STATUS register MOVF PCLATH,W ; move pclath register into w register MOVWF PCLATH_TEMP ; save off contents of PCLATH register ;------------------------------------------------------------------------------ movf TMR0,W movwf Ttemp btfsc INTCON,T0IF ;Service Timer 0 overflow call ServiceTimer btfsc PIR2,C2IF ;Stops Timer0, Records Value call ServiceComparator ;------------------------------------------------------------------------------ ; Interrupt context restoring MOVF PCLATH_TEMP,W ; retrieve copy of PCLATH register MOVWF PCLATH ; restore pre-isr PCLATH register contents MOVF STATUS_TEMP,W ; retrieve copy of STATUS register MOVWF STATUS ; restore pre-isr STATUS register contents SWAPF W_TEMP,F SWAPF W_TEMP,W ; restore pre-isr W register contents RETFIE ; return from interrupt ;------------------------------------------------------------------------------ ; MAIN PROGRAM ;------------------------------------------------------------------------------ init Banksel PORTA ;change banks clrf PORTA ;clear PORTA, PORTB and PORTC clrf PORTB clrf PORTC clrf INTCON ;clear interrupt flags and disable interrupts BANKSEL CMCON0 ;change banks movlw 0x07 ;turn off comparators, mode 111 movwf CMCON0 call delay20 ;wait for comparators to settle BANKSEL OPTION_REG ;change banks movlw 0x88 ;WDT prescalar,internal TMR0 increment movwf OPTION_REG BANKSEL TRISA ;change banks clrf TRISA ;PORTA all outputs, discharges RC ckts clrf TRISB ;PORTB all outputs movlw b'00001000' movwf TRISC ;PORTC output except RC4 BANKSEL VRCON ;change banks movlw 0x0C ;setup Voltage Reference movwf VRCON BANKSEL LCDCON CLRF LCDCON BANKSEL PORTA ;change banks clrf INTCON clrf flags ;clear flags register bsf DAC_CS ;TURN OFF DAC ;********************TEST AREA********************* ;************************************************** start BANKSEL PORTA ;change banks CALL IT1 ;LOADING DATA STORED GOTO HERE ;BUTTON NOT PUSHED JUMP TO HERE CALIBRATE CALL LOAD ;LOAD MESSAGE movlw D'25' ;TIMER FOR CALIBRATION DELAY and taking average 25 times movwf TIMER1 clrf ACCbHI clrf ACCbMID clrf ACCbLO S1 CALL MEASURE ;MEASURE movf TimeHI,0 ;LOADING TIME INTO ACCa movwf ACCaHI movf TimeMID,0 movwf ACCaMID movf TimeLO,0 movwf ACCaLO call Add24 ;ADDING 25 TIMES DECFSZ TIMER1,1 ;ADDS 25 TIMES GOTO S1 movlw d'25' ;LOADING 25 movwf ACCaLO clrf ACCaHI ;clearing upper an mid clrf ACCaMID movf ACCbHI,0 movwf ACCcHI ;swapping ACCb toAAc movf ACCbMID,0 movwf ACCcMID movf ACCbLO,0 movwf ACCcLO clrf ACCbHI ;clearing ACCb clrf ACCbMID clrf ACCbLO call Div24 ;divide by 25 movf ACCcLO,0 ;loading Base with average movwf BaseLO movf ACCcMID,0 movwf BaseMID movf ACCcHI,0 movwf BaseHI CALL IT2 ;STORE BASE INTO MEMORY GOTO HERE ;DONE START REGULAR PROGRAM MEASURE bcf PIR2,C2IF ;clear comparator flag clrf TimeHI ;reset Time registers clrf TimeMID clrf TimeLO Capacitor BANKSEL PORTA ;change banks call AnalogOn ;turn analog on bsf PORTA,V1 ;charge capacitor CwaitU btfss flags,DONE ;measurement completed flag goto CwaitU bcf flags,DONE ;clear measurement completed flag call AnalogOff ;turn analog off shorting cap RETURN HERE BTFSS PROGRAM GOTO CALIBRATE movlw d'10' movwf TIMER1 clrf ACCbHI clrf ACCbMID clrf ACCbLO CALL MEASURE ;measure capacitor call SwapTtoA ;swap Time to accumulator a movf BaseHI,0 ;swap base capacitance value movwf ACCbHI ;to accumulator b movf BaseMID,0 movwf ACCbMID movf BaseLO,0 movwf ACCbLO BCF flags,sign ;CLEAR sign FLAG call Sub24 ;******************CHECKING TO SEE IF DATA IS HIGHER OR LOWER movlw 0xff subwf ACCbHI,0 btfss 3,2 goto AA ;DATA IS LOWER JUMP TO AA ;****************DATA IS HIGHER REVERSE SUBTRACTION call SwapBtoA movf TimeHI,0 ;MOVING TIME INTO ACCb movwf ACCbHI movf TimeMID,0 movwf ACCbMID movf TimeLO,0 movwf ACCbLO call Sub24 ;PERFORM SUBTRACTION AGAIN BSF flags,sign ;SET sign FLAG ;*****************MULTIPLYING TO GET CORRECT POSITION ON READ OUT********** AA movlw 0x01 ;LOADING 100,000 INTO ACCa movwf ACCaHI movlw 0x86 movwf ACCaMID movlw 0xa0 movwf ACCaLO call Mpy24 ;MULTIPLY DIFFERENCE BY 100,000 ;***************************** SETTING UP FOR DIVISION TO GET PERCENTAGE************** movf BaseHI,0 movwf ACCaHI movf BaseMID,0 movwf ACCaMID movf BaseLO,0 movwf ACCaLO call Div24 ;divide difference by base ;******************CONVERT TO DECIMAL FOR READING****************** aaa CALL DECIMAL ;convert CALL DISPLAYING CALL DOG BTFSS flags,sign ;CHECKING FOR + - goto AB MOVLW 02DH ;- CALL SEND GOTO AC AB MOVLW 02BH ;+ CALL SEND AC MOVF DIGIT_4,0 CALL SEND MOVLW 02EH ;. CALL SEND MOVF DIGIT_3,0 CALL SEND MOVF DIGIT_2,0 CALL SEND MOVF DIGIT_1,0 CALL SEND MOVLW 000H ;SPACE CALL SEND MOVLW 025H ;% CALL SEND ;**************************PREPARING FOR DAC*************** clrf ACCbHI ;clear ACCbHI clrf ACCbMID ;clear ACCbMID clrf ACCbLO ;cler ACCbLO movlw d'2' ;move 2 for division movwf ACCaLO ;load clrf ACCaHI ;clear ACCaHI clrf ACCaMID ;clear ACCaMID call Div24 ;divide ACCc is already loaded movlw 08h ;CHECKING FOR OVERFLOW WHICH WILL LOCK UP DAC subwf ACCcMID,0 btfss 3,0 goto DAC1 clrf ACCcHI clrf ACCcMID clrf ACCcLO bsf flags,sign ;keep from subtracting DAC1 movf ACCcHI,0 ;LOADING % CHANGE results are in ACCc reg movwf ACCaHI movf ACCcMID,0 movwf ACCaMID movf ACCcLO,0 movwf ACCaLO movlw 0x08 ;LOADING 2048 FOR CENTERING DAC 2.5 VOLTS movwf ACCbMID clrf ACCbHI clrf ACCbLO btfss flags,sign ;CHECK FOR SIGN goto BB call Add24 ;ADD % AND 2.5 VOLTS movf ACCbMID,0 movwf DAC_MID movf ACCbLO,0 movwf DAC_LO call DAC goto HERE BB call Sub24 ;MINUS SUBTRACT FROM 2.5 VOLTS movf ACCbMID,0 movwf DAC_MID movf ACCbLO,0 movwf DAC_LO CALL DAC goto HERE ;redo ;*****************************END OF MAIN PROGRAM************** ;************************************************************** AnalogOn BANKSEL CMCON0 ;change banks movf CMCON0,F ;for detection of change of comparator movlw 0x02 ;turn comparators on, mode 010 movwf CMCON0 ;4 inputs multiplexed to 2 comparators BANKSEL TRISA ;change banks movlw 0x0F ;make PORTA<3:0> all inputs movwf TRISA BANKSEL VRCON ;change banks bsf VRCON,VREN ;turn VRCON BANKSEL PORTA ;change banks call delay20 ;20msec delay BANKSEL CMCON0 ;change banks movf CMCON0,F ;clear comparator mismatch condition BANKSEL PORTA CLRF PIR2 ;clear comparator interrupt flag BANKSEL PIE2 BSF PIE2,C2IE ;TURN ON INTERRUPT BANKSEL PORTA ;change banks movlw 0E0H movwf INTCON clrf TMR0 ;clear TMR0 counter return AnalogOff BANKSEL PORTA ;change banks CLRF PORTA ;GROUND ALL PORT A clrf INTCON ;disable all interrupts BANKSEL TRISA ;change banks clrf TRISA ;set PORTA pins to outputs, discharge RC ckt BANKSEL VRCON ;change banks bcf VRCON,VREN ;disable Vref BANKSEL CMCON0 ;change banks movlw 0x07 movwf CMCON0 ;disable comparators BANKSEL PORTA ;change banks call delay20 ;20msec delay BANKSEL CMCON0 ;change banks movf CMCON0,F ;clear comparator mismatch condition BANKSEL PORTA ;change banks bcf PIR2,C2IF ;clear comparator interrupt flag BANKSEL PIE2 ;TURN OFF INTERRUPT CLRF PIE2 BANKSEL PORTA call vlong ;long delay to allow capacitors to discharge call vlong call vlong return ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- Delay Routines -* ;*--------------------------------------------------------------------------* ;**************************************************************************** vlong movlw 0xff ;very long delay, approx 200msec movwf msb goto d1 delay20 ;20 msec delay movlw .26 movwf msb goto d1 delay16 ;16 msec delay movlw .21 movwf msb goto d1 delay1 ;approx 750nsec delay movlw .1 movwf msb d1 movlw 0xff movwf lsb d2 decfsz lsb,F goto d2 decfsz msb,F goto d1 return ;____________________________________________________________________________ ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- Swap Time to Accumulator a -* ;*--------------------------------------------------------------------------* ;**************************************************************************** SwapTtoA BANKSEL PORTA ;change banks movf TimeHI,W movwf ACCaHI movf TimeMID,W movwf ACCaMID movf TimeLO,W movwf ACCaLO return ;**************************************************************************** SwapBtoA BANKSEL PORTA ;change banks movf BaseHI,W movwf ACCaHI movf BaseMID,W movwf ACCaMID movf BaseLO,W movwf ACCaLO return ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- ISR to service a Timer0 overflow -* ;*--------------------------------------------------------------------------* ;**************************************************************************** ServiceTimer incf TimeMID,F ;increment middle Time byte btfsc STATUS,Z ;if middle overflows, incf TimeHI,F ;increment high Time byte bcf INTCON,T0IF ;clear TMR0 interrupt flag return ;____________________________________________________________________________ ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- ISR to service a Comparator interrupt -* ;*--------------------------------------------------------------------------* ;**************************************************************************** ServiceComparator BANKSEL PORTA ;change banks clrf INTCON ;disable TMR0 interrupts movf Ttemp,W movwf TimeLO bsf flags,DONE ;set DONE flag BANKSEL PIE2 clrf PIE2 BANKSEL PORTA bcf PIR2,C2IF ;clear comparator interrupt flag return ;************************DAC PROGRAM********************** DAC ;LABEL BCF DAC_CS ;SET CS LOW TO TURN ON D1 BCF DAC_SI ; CALL CLOCK_OUT ;WRITE TO DAC CALL CLOCK_OUT ;UNBUFFERED BSF DAC_SI CALL CLOCK_OUT ;GAIN1 CALL CLOCK_OUT ;ACTIVE MOVLW 4 ;FOUR BITS MOVWF ROTATE ;COUNTER MOVF DAC_MID,0 ;MOVING DAC MID INTO OUT MOVWF OUT ;MOVE BCF 3,0 ;CLR C RLF OUT,1 RLF OUT,1 RLF OUT,1 RLF OUT,1 D2 RLF OUT,1 ;ROTATE MSD OUT INTO C BTFSS 3,0 ;CHECK TO SEE IF C IS HIGH BCF DAC_SI ;ANALOG OUT LOW BTFSC 3,0 ;CHECK TO SEE IF C IS LOW BSF DAC_SI ;ANALOG OUT LOW CALL CLOCK_OUT ;CLOCK OUT DECFSZ ROTATE,1 ;DO 4 TIMES GOTO D2 ;DO AGAIN MOVLW 8 ;EIGHT BITS MOVWF ROTATE ;COUNTER MOVF DAC_LO,0 ;MOVING DAC LO INTO OUT MOVWF OUT ;MOVE BCF 3,0 ;CLR C D3 RLF OUT,1 ;ROTATE MSD OUT INTO C BTFSS 3,0 ;CHECK TO SEE IF C IS HIGH BCF DAC_SI ;ANALOG OUT LOW BTFSC 3,0 ;CHECK TO SEE IF C IS LOW BSF DAC_SI ;ANALOG OUT LOW CALL CLOCK_OUT ;CLOCK OUT DECFSZ ROTATE,1 ;DO 8 TIMES GOTO D3 ;DO AGAIN BSF DAC_CS ;SET CS HIGH TO TURN LOAD RETURN CLOCK_OUT ;LABEL BSF CLK ;CLOCK HIGH BCF CLK ;CLOCK LOW RETURN ;RETURN ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- 24-bit Addition -* ;*- -* ;*- Uses ACCa and ACCb -* ;*- -* ;*- ACCa + ACCb -> ACCb -* ;*--------------------------------------------------------------------------* ;**************************************************************************** Add24 movf ACCaLO,W addwf ACCbLO,1 ;add low bytes btfsc STATUS,C ;add in carry if necessary goto A2 A1 movf ACCaMID,W addwf ACCbMID,1 ;add mid bytes btfsc STATUS,C ;add in carry if necessary incf ACCbHI,1 movf ACCaHI,W addwf ACCbHI,1 ;add high bytes retlw 0 A2 incf ACCbMID,1 btfsc STATUS,Z incf ACCbHI,1 goto A1 ;____________________________________________________________________________ ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- Subtraction ( 24 - 24 -> 24 ) -* ;*- -* ;*- Uses ACCa, ACCb, ACCd -* ;*- -* ;*- ACCa -> ACCd, -* ;*- 2's complement ACCa, -* ;*- call Add24 ( ACCa + ACCb -> ACCb ), -* ;*- ACCd -> ACCa -* ;*--------------------------------------------------------------------------* ;**************************************************************************** Sub24 movf ACCaHI,W ;Transfer ACCa to ACCd movwf ACCdHI movf ACCaMID,W movwf ACCdMID movf ACCaLO,W movwf ACCdLO call compA ;2's complement ACCa call Add24 ;Add ACCa to ACCb movf ACCdHI,W ;Transfer ACCd to ACCa movwf ACCaHI movf ACCdMID,W movwf ACCaMID movf ACCdLO,W movwf ACCaLO retlw 0 ;____________________________________________________________________________ ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- Multiply ( 24 X 24 -> 56 ) -* ;*- -* ;*- Uses ACCa, ACCb, ACCc, ACCd -* ;*- -* ;*- ACCa * ACCb -> ACCb,ACCc 56-bit output -* ;*- with ACCb (ACCbHI,ACCbMID,ACCbLO) with 24 msb's and -* ;*- ACCc (ACCcHI,ACCcMID,ACCcLO) with 24 lsb's -* ;*--------------------------------------------------------------------------* ;**************************************************************************** Mpy24 call Msetup mloop rrf ACCdHI,1 ;rotate d right rrf ACCdMID,1 rrf ACCdLO,1 btfsc STATUS,C ;need to add? call Add24 rrf ACCbHI,1 rrf ACCbMID,1 rrf ACCbLO,1 rrf ACCcHI,1 rrf ACCcMID,1 rrf ACCcLO,1 decfsz temp,1 ;loop until all bits checked goto mloop retlw 0 Msetup movlw 0x18 ;for 24 bit shifts movwf temp movf ACCbHI,W ;move ACCb to ACCd movwf ACCdHI movf ACCbMID,W movwf ACCdMID movf ACCbLO,W movwf ACCdLO clrf ACCbHI clrf ACCbMID clrf ACCbLO retlw 0 ;____________________________________________________________________________ ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- Division ( 56 / 24 -> 24 ) -* ;*- -* ;*- Uses ACCa, ACCb, ACCc, ACCd -* ;*- -* ;*- 56-bit dividend in ACCb,ACCc ( ACCb has msb's and ACCc has lsb's) -* ;*- 24-bit divisor in ACCa -* ;*- quotient is stored in ACCc -* ;*- remainder is stored in ACCb -* ;*--------------------------------------------------------------------------* ;**************************************************************************** Div24 call Dsetup dloop bcf STATUS,C rlf ACCcLO,1 ;Rotate dividend left 1 bit position rlf ACCcMID,1 rlf ACCcHI,1 rlf ACCbLO,1 rlf ACCbMID,1 rlf ACCbHI,1 btfsc STATUS,C ;invert carry and exclusive or with the goto clear ;msb of the divisor then move this bit btfss ACCaHI,msb_bit ;into the lsb of the dividend incf ACCcLO,1 goto cont clear btfsc ACCaHI,msb_bit incf ACCcLO,1 cont btfsc ACCcLO,lsb_bit ;check the lsb of the dividend goto minus call Add24 ;if = 0, then add divisor to upper 24 bits goto check ;of dividend minus call Sub24 ;if = 1, then subtract divisor from upper ;24 bits of dividend check decfsz temp,f ;do 24 times goto dloop bcf STATUS,C rlf ACCcLO,1 ;shift lower 24 bits of dividend 1 bit rlf ACCcMID,1 ;position left rlf ACCcHI,1 btfsc ACCbHI,msb_bit ;exlusive or the inverse of the msb of the goto w1 ;dividend with the msb of the divisor btfss ACCaHI,msb_bit ;store in the lsb of the dividend incf ACCcLO,1 goto wzd w1 btfsc ACCaHI,msb_bit incf ACCcLO,1 wzd btfss ACCbHI,msb_bit ;if the msb of the remainder is set and goto wend btfsc ACCaHI,msb_bit ;the msb of the divisor is not goto wend call Add24 ;add the divisor to the remainder to correct ;for zero partial remainder wend retlw 0 ;quotient in 24 lsb's of dividend ;remainder in 24 msb's of dividend Dsetup movlw 0x18 ;loop 24 times movwf temp retlw 0 ;____________________________________________________________________________ ;**************************************************************************** ;*--------------------------------------------------------------------------* ;*- 2's Complement -* ;*- -* ;*- Uses ACCa -* ;*- -* ;*- Performs 2's complement conversion on ACCa -* ;*--------------------------------------------------------------------------* ;**************************************************************************** compA comf ACCaLO,1 ;invert all bits in accumulator a comf ACCaMID,1 comf ACCaHI,1 incf ACCaLO,1 ;add one to accumulator a btfsc STATUS,Z incf ACCaMID,1 btfsc STATUS,Z incf ACCaHI,1 retlw 0 ;___________________________________________________ ;------------------------------------------------------------------------------ DECIMAL ;CONVERSION FROM HEXADECIMAL TO DECIMAL BANKSEL PORTA ;change banks SWAPF ACCcMID,W ANDLW 0FH ADDLW 0F0H MOVWF THOUSANDS ADDWF THOUSANDS,F ADDLW 0E2H MOVWF HUNDREDS ADDLW 32H MOVWF ONES MOVF ACCcMID,0 ANDLW 0FH ADDWF HUNDREDS,F ADDWF HUNDREDS,F ADDWF ONES,F ADDLW 0E9H MOVWF TENS ADDWF TENS,F ADDWF TENS,F SWAPF ACCcLO,W ANDLW 0FH ADDWF TENS,F ADDWF ONES,F RLF TENS,F RLF ONES,F COMF ONES,F RLF ONES,F MOVF ACCcLO,W ANDLW 0FH ADDWF ONES,F RLF THOUSANDS,F MOVLW 07H MOVWF TENK MOVLW 0AH LB1 ADDWF ONES,F DECF TENS,F BTFSS 3,0 GOTO LB1 LB2 ADDWF TENS,F DECF HUNDREDS,F BTFSS 3,0 GOTO LB2 LB3 ADDWF HUNDREDS,F DECF THOUSANDS,F BTFSS 3,0 GOTO LB3 LB4 ADDWF THOUSANDS,F DECF TENK,F BTFSS 3,0 GOTO LB4 RETURN ;------------------------------------------------------------------------------ SEND MOVWF DATA1 CALL WRDATA_CHK CALL DELAY30uS RETURN WRDATA_CHK CALL CHK_BUSY BSF RS BCF RW BSF E MOVF DATA1,0 MOVWF PORTB BCF E MOVLW .255 MOVWF PORTB RETURN WRINS_CHK CALL CHK_BUSY WRINS_NOCHK BCF RS BCF RW BSF E MOVF DATA1,0 MOVWF PORTB BCF E MOVLW .255 MOVWF PORTB RETURN CHK_BUSY BCF RS ;RS LOW BSF RW ;RW HIGH BSF E ;ENABLE HIGH BANKSEL TRISB ;CHANGING OUTPUT TO INPUT MOVLW .255 MOVWF TRISB ;LOAD BANKSEL PORTA ;CHANGE BANKS ; BTFSC BUSY ;CHECK TO SEE IF BUSY ; GOTO $-1 ;HOLD BANKSEL TRISB ;CHANGING INPUT TO OUTPUT CLRF TRISB ;LOAD BANKSEL PORTA ;CHANGE BANKS BCF E ;LOWER ENABLE RETURN ;RETURN DELAY40MS MOVLW .105 MOVWF COUNTER1 DECFSZ COUNTER0,1 GOTO $-1 DECFSZ COUNTER1,1 GOTO $-3 RETURN DELAY30uS MOVLW .16 MOVWF COUNTER0 DECFSZ COUNTER0,1 GOTO $-1 RETURN DELAY2MS MOVLW 6 MOVWF COUNTER1 DECFSZ COUNTER0,1 GOTO $-1 DECFSZ COUNTER1,1 GOTO $-3 RETURN DOG CALL DELAY40MS MOVLW 039H ;FUNCTION SET INSTRUCTION SET 0 MOVWF DATA1 CALL WRINS_NOCHK CALL DELAY30uS MOVLW 039H ;FUNCTION SET MOVWF DATA1 CALL WRINS_NOCHK CALL DELAY30uS MOVLW 01CH ;SET BIAS 5 VOLT MOVWF DATA1 CALL WRINS_CHK CALL DELAY30uS MOVLW 074H ;CONTRAST SET ADJUSTMENT 5 VOLT MOVWF DATA1 CALL WRINS_CHK CALL DELAY30uS MOVLW 052H ;POWER/ICON/CONTRAST 5 VOLT MOVWF DATA1 CALL WRINS_CHK CALL DELAY30uS MOVLW 069H ;FOLLOWER CONTROL MOVWF DATA1 CALL WRINS_CHK CALL DELAY30uS MOVLW 038H ;FUNCTION SET INSTRUCTION SET 1 MOVWF DATA1 CALL WRINS_NOCHK CALL DELAY30uS MOVLW 00CH ;DISPLAY ON CURSOR OFF MOVWF DATA1 CALL WRINS_CHK CALL DELAY30uS MOVLW 001H ;CLEAR DISPLAY MOVWF DATA1 CALL WRINS_CHK CALL DELAY2MS MOVLW 006H ;ENTRY MODE SET MOVWF DATA1 CALL WRINS_CHK CALL DELAY30uS RETURN LOAD CALL DOG ;DISPLAY MESSAGE MOVLW 053H ;S CALL SEND MOVLW 054H ;T CALL SEND MOVLW 041H ;A CALL SEND MOVLW 04EH ;N CALL SEND MOVLW 044H ;D CALL SEND MOVLW 000H ;SPACE CALL SEND MOVLW 042H ;B CALL SEND MOVLW 059H ;Y CALL SEND RETURN ;**************************** DISPLAYING *****************************8 DISPLAYING MOVLW 0 ;LOAD INTO 0 THE LOW ADDRESS OF LOOKUP TABLE LOOKUP TABLE ADDRESS ADDWF ONES,0 ;ADD THE OFFSET TO THE LOW ADDRESS (ADRES) MOVLW 3 ;LOAD 3 INTO HIGH ADDRESS OF LOOKUP TABLE BTFSC STATUS,C ;CHECK TO SEE IF THE OFFSET ADDED TO LOW LOOKUP TABLE WENT ABOVE 255 ADDLW 1 ;IF IT DID ADD 1 TO HIGH TABLE BYTE (PCLATH) MOVWF PCLATH MOVF ONES,W ;MOVE CONTROL INTO W CALL DISPLAY ;GO TO LOOK UP TABLE MOVWF DIGIT_1 CLRF PCLATH MOVLW 0 ADDWF TENS,0 MOVLW 3 BTFSC STATUS,C ADDLW 1 MOVWF PCLATH MOVF TENS,0 CALL DISPLAY MOVWF DIGIT_2 CLRF PCLATH MOVLW 0 ADDWF HUNDREDS,0 MOVLW 3 BTFSC STATUS,C ADDLW 1 MOVWF PCLATH MOVF HUNDREDS,0 CALL DISPLAY MOVWF DIGIT_3 MOVLW 0 ADDWF THOUSANDS,0 MOVLW 3 BTFSC STATUS,C ADDLW 1 MOVWF PCLATH MOVF THOUSANDS,0 CALL DISPLAY MOVWF DIGIT_4 CLRF PCLATH RETURN ORG 300 DISPLAY ADDWF PCL,1 ;ADD W TO PROGRAM COUNTER AND LOOK UP DATA "." = DECIMAL # RETLW B'00110000' ;0 RETLW B'00110001' ;1 RETLW B'00110010' ;2 RETLW B'00110011' ;3 RETLW B'00110100' ;4 RETLW B'00110101' ;5 RETLW B'00110110' ;6 RETLW B'00110111' ;7 RETLW B'00111000' ;8 RETLW B'00111001' ;9 ;+ = 02BH ;- = 02DH ;% ;********GETTING DATA FROM EEPROM **************** IT1 BANKSEL EEADR MOVLW 1 ; Data Memory MOVWF EEADR ; Address to read BANKSEL EECON1 BCF EECON1,EEPGD ; Point to Data BSF EECON1,RD ; EE Read BANKSEL EEDATA MOVF EEDATA,W ; W = EEDATA BANKSEL PORTA MOVWF BaseHI ;load BANKSEL EEADR MOVLW 2 ; Data Memory MOVWF EEADR ; Address to read BANKSEL EECON1 BCF EECON1,EEPGD ; Point to Data BSF EECON1,RD ; EE Read BANKSEL EEDATA MOVF EEDATA,W ; W = EEDATA BANKSEL PORTA MOVWF BaseMID ;load BANKSEL EEADR MOVLW 3 ; Data Memory MOVWF EEADR ; Address to read BANKSEL EECON1 BCF EECON1,EEPGD ; Point to Data BSF EECON1,RD ; EE Read BANKSEL EEDATA MOVF EEDATA,W ; W = EEDATA BANKSEL PORTA MOVWF BaseLO ;load CALL DOG MOVLW 04CH ;L CALL SEND MOVLW 04FH ;O CALL SEND MOVLW 041H ;A CALL SEND MOVLW 044H ;D CALL SEND MOVLW 049H ;I CALL SEND MOVLW 04EH ;N CALL SEND MOVLW 047H ;G CALL SEND CALL DISPLAY_DELAY BTFSS PROGRAM GOTO $-1 RETURN ;**************STORING DATA IN EEPROM************** IT2 BANKSEL EECON1 BTFSC EECON1,WR ;Wait for write GOTO $-1 ;to complete BCF STATUS,RP0 ;Bank 2 MOVLW 1 ;Data Memory MOVWF EEADR ;Address to write BANKSEL PORTA MOVF TimeHI,0 ;Data Memory Value MOVWF BaseHI ;STORE IN BASE AND EPROM BANKSEL EEDATA MOVWF EEDATA ;to write BANKSEL EECON1 BCF EECON1,EEPGD ;Point to DATA ;memory BSF EECON1,WREN ;Enable writes BCF INTCON,GIE ;Disable INTs. MOVLW 0X55 ; MOVWF EECON2 ;Write 55h MOVLW 0AAh ; MOVWF EECON2 ;Write AAh BSF EECON1,WR ;Set WR bit to ;begin write BSF INTCON,GIE ;Enable INTs. BCF EECON1,WREN ;Disable writes BANKSEL EECON1 BTFSC EECON1,WR ;Wait for write GOTO $-1 ;to complete BCF STATUS,RP0 ;Bank 2 MOVLW 2 ;Data Memory MOVWF EEADR ;Address to write BANKSEL PORTA MOVF TimeMID,0 ;Data Memory Value MOVWF BaseMID ;STORE IN BASE AND EPROM BANKSEL EEDATA MOVWF EEDATA ;to write BANKSEL EECON1 BCF EECON1,EEPGD ;Point to DATA ;memory BSF EECON1,WREN ;Enable writes BCF INTCON,GIE ;Disable INTs. MOVLW 0X55 ; MOVWF EECON2 ;Write 55h MOVLW 0AAh ; MOVWF EECON2 ;Write AAh BSF EECON1,WR ;Set WR bit to ;begin write BSF INTCON,GIE ;Enable INTs. BCF EECON1,WREN ;Disable writes BANKSEL EECON1 BTFSC EECON1,WR ;Wait for write GOTO $-1 ;to complete BCF STATUS,RP0 ;Bank 2 MOVLW 3 ;Data Memory MOVWF EEADR ;Address to write BANKSEL PORTA MOVF TimeLO,0 ;Data Memory Value MOVWF BaseLO ;STORE IN BASE AND EPROM BANKSEL EEDATA MOVWF EEDATA ;to write BANKSEL EECON1 BCF EECON1,EEPGD ;Point to DATA ;memory BSF EECON1,WREN ;Enable writes BCF INTCON,GIE ;Disable INTs. MOVLW 0X55 ; MOVWF EECON2 ;Write 55h MOVLW 0AAh ; MOVWF EECON2 ;Write AAh BSF EECON1,WR ;Set WR bit to ;begin write BSF INTCON,GIE ;Enable INTs. BCF EECON1,WREN ;Disable writes BANKSEL PORTA CALL DOG MOVLW 053H ;S CALL SEND MOVLW 054H ;T CALL SEND MOVLW 04FH ;O CALL SEND MOVLW 052H ;R CALL SEND MOVLW 049H ;I CALL SEND MOVLW 04EH ;N CALL SEND MOVLW 047H ;G CALL SEND CALL DISPLAY_DELAY BTFSS PROGRAM GOTO $-1 RETURN DISPLAY_DELAY MOVLW 10 MOVWF TIMER3 DECFSZ TIMER1,1 GOTO $-1 DECFSZ TIMER2,1 GOTO $-3 DECFSZ TIMER3,1 GOTO $-5 RETURN CHECK BANKSEL PORTA CALL DOG MOVLW 043H ;C CALL SEND MOVLW 048H ;H CALL SEND MOVLW 045H ;E CALL SEND MOVLW 043H ;C CALL SEND MOVLW 04BH ;K CALL SEND RETURN END