;PIC Registers INDR .EQU $00 PCL .EQU $02 STATUS .EQU $03 ;Used for Zero bit FSR .EQU $04 PORTA .EQU $05 PORTB .EQU $06 PORTC .EQU $07 PCLATH .EQU $0A ;Program Counter High Bits ADRES .EQU $1E ;A/D Results (Data) ADCON .EQU $1F ;A/D Converter control ;PIC Bits W .EQU 0 F .EQU 1 CARRY .EQU 0 ZERO .EQU 2 GO .EQU 2 ;Project Registers D7 .EQU $20 D6 .EQU $21 D5 .EQU $22 D4 .EQU $23 D3 .EQU $24 D2 .EQU $25 D1 .EQU $26 D0 .EQU $27 DIGIT .EQU $28 COUNT .EQU $2B BINH .EQU $2D BINL .EQU $2E HDATA .EQU $30 HTEMP .EQU $31 HCARRY .EQU $32 HOFFSET .EQU $33 HOFFBIT .EQU $34 ;Program Start .ORG $00 GOTO START NOP NOP NOP NOP NOP NOP NOP NOP NOP ;Initialise START BSF 3, 5 ;Go to register bank 1 MOVLW $0F ;Set Port A bits 0-3 In, 4-7 Out MOVWF PORTA CLRF PORTB ;Set Port B to all outputs MOVLW $0F ;Set Port C bits 0-3 In, 4-7 Out MOVWF PORTC MOVLW $85 ;Right justify, ext Vref, A0+A1 only MOVWF ADCON BCF 3, 5 MOVLW $40 MOVWF ADCON CLRF PCLATH CLRF DIGIT CLRF D0 CLRF D1 CLRF D2 CLRF D3 CLRF D4 CLRF D5 CLRF D6 CLRF D7 BSF ADCON, 0 ;Switch A/D on CALL DELAY ;Start of main loop LOOP BSF ADCON, GO ;Start A/D CALL DELAY ;Wait at least 9 x 8 = 72uS AD BTFSC ADCON, GO GOTO AD MOVF ADRES, W MOVWF BINH ;Over/Under volt detection BSF PORTA, 4 ;Switch off undervolts BSF PORTA, 5 ;Switch off overvolts BTFSS BINH, 0 ;Bit 0 set? GOTO ISLOW ;No (could be 00) BTFSC BINH, 1 ;Bit 1 set? GOTO NEXT ;Yes, so OK BCF PORTA, 4 ;Switch on undervolts GOTO NEXT ISLOW BTFSS BINH, 1 ;Bit 1 set? GOTO NEXT ;No, so OK BCF PORTA, 5 ;Switch on overvolts ;Get Low byte of conversion NEXT BSF 3, 5 ;Go to register bank 1 MOVF ADRES, W BCF 3, 5 ;Go to register bank 0 MOVWF BINL CLRF HTEMP ADDLW $00 ;Clear carry bit RRF BINH, F RRF BINL, F ;Bin now in 10mV steps ;Add 11 volts (1100 x 10mV) = $44C CLRF HTEMP ADDLW $00 ;Clear carry bit MOVLW $4C ADDWF BINL, F BTFSC STATUS, CARRY INCF BINH, F MOVLW $04 ADDWF BINH, F ;Convert to BCD CLRF D0 CLRF D1 CLRF D2 CLRF D3 CLRF D4 CLRF D5 CLRF D6 CLRF D7 MOVF BINH, W MOVWF HDATA CALL HEX2BCD MOVF BINL, W MOVWF HDATA CALL HEX2BCD ;Output next digit TICK MOVLW $FF MOVWF PORTB INCF DIGIT, W ;Update digit number ANDLW $07 MOVWF DIGIT SWAPF DIGIT, W MOVWF PORTC MOVF DIGIT, W ADDLW $20 ;Add Register Offset MOVWF FSR NOP NOP MOVF INDR, W ;Get Digit ANDLW $0F CALL TABLE MOVWF PORTB CALL DELAY GOTO LOOP ;HEX 2 BCD ;Registers used are HDATA, HTEMP, HCARRY, HOFFSET, HOFFBIT ;Digits are in registers 32 - 39 ;This routine converts full bytes only. ;Before calling this routine, HDATA must contain data byte to be converted HEX2BCD CLRF HTEMP CLRF HOFFBIT HLOOP CLRF HCARRY CLRF HOFFSET BTFSC HDATA, 7 ;Is bit 7 set? INCF HCARRY, F ;Yes so set HCARRY HNXTDGT MOVF HOFFSET, W ;Next Digit ADDLW $20 MOVWF FSR NOP NOP CLRF HTEMP ADDLW $00 ;Clear carry bit RLF INDR, F ;Multiply data by two MOVF HCARRY, F ;Is carry set BTFSS STATUS, ZERO INCF INDR, F MOVF INDR, W ADDLW $06 ;Add 6 MOVWF HTEMP CLRF HCARRY ;Prepare by clearing HCARRY BTFSS HTEMP, 4 ;Is data > 10? (HTEMP > 16?) GOTO HINCOFF ;No MOVLW $01 MOVWF HCARRY ;Yes so set HCARRY & subtract 10 MOVLW $0A SUBWF INDR, F HINCOFF INCF HOFFSET, F ;Increment offset MOVLW $07 SUBWF HOFFSET, W BTFSS STATUS, ZERO ;Is it past last digit GOTO HNXTDGT ;No so do next digit HNXTBIT INCF HOFFBIT, F ;Yes so do next bit MOVLW $08 SUBWF HOFFBIT, W BTFSC STATUS, ZERO ;Is it past last bit RETURN ;Yes,all done so return RLF HDATA, F ;No so shift data GOTO HLOOP DELAY MOVLW $80 ;Approx 400uS MOVWF COUNT DC DECFSZ COUNT, F GOTO DC RETURN TABLE ADDWF PCL, F RETLW $09 ;Zero RETLW $ED ;One RETLW $43 ;Two RETLW $C1 ;Three RETLW $A5 ;Four RETLW $91 ;Five RETLW $31 ;Six RETLW $CD ;Seven RETLW $01 ;Eight RETLW $85 ;Nine RETLW $FE ;10 RETLW $FE ;11 RETLW $FE ;12 RETLW $FE ;13 RETLW $FE ;14 RETLW $FE ;15 RETLW $FE ;16 .END