__config 3f79 ;PIC Registers INDR EQU 0x00 PCL EQU 0x02 STATUS EQU 0x03 ;Used for Zero bit FSR EQU 0x04 PORTA EQU 0x05 PORTB EQU 0x06 PORTC EQU 0x07 PCLATH EQU 0x0A ;Program Counter High Bits ADRES EQU 0x1E ;A/D Results (Data) ADCON EQU 0x1F ;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 0x20 D6 EQU 0x21 D5 EQU 0x22 D4 EQU 0x23 D3 EQU 0x24 D2 EQU 0x25 D1 EQU 0x26 D0 EQU 0x27 DIGIT EQU 0x28 COUNT EQU 0x2B BINH EQU 0x2D BINL EQU 0x2E HDATA EQU 0x30 HTEMP EQU 0x31 HCARRY EQU 0x32 HOFFSET EQU 0x33 HOFFBIT EQU 0x34 ;Program Start ORG 0x00 GOTO START NOP NOP NOP NOP NOP NOP NOP NOP NOP ;Initialise START BSF 3, 5 ;Go to register bank 1 MOVLW 0x0F ;Set Port A bits 0-3 In, 4-7 Out MOVWF PORTA CLRF PORTB ;Set Port B to all outputs MOVLW 0x0F ;Set Port C bits 0-3 In, 4-7 Out MOVWF PORTC MOVLW 0x85 ;Right justify, ext Vref, A0+A1 only MOVWF ADCON BCF 3, 5 MOVLW 0x40 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 0x00 ;Clear carry bit RRF BINH, F RRF BINL, F ;Bin now in 10mV steps ;Add 11 volts (1100 x 10mV) = 0x44C CLRF HTEMP ADDLW 0x00 ;Clear carry bit MOVLW 0x4C ADDWF BINL, F BTFSC STATUS, CARRY INCF BINH, F MOVLW 0x04 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 0xFF MOVWF PORTB INCF DIGIT, W ;Update digit number ANDLW 0x07 MOVWF DIGIT SWAPF DIGIT, W MOVWF PORTC MOVF DIGIT, W ADDLW 0x20 ;Add Register Offset MOVWF FSR NOP NOP MOVF INDR, W ;Get Digit ANDLW 0x0F 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 0x20 MOVWF FSR NOP NOP CLRF HTEMP ADDLW 0x00 ;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 0x06 ;Add 6 MOVWF HTEMP CLRF HCARRY ;Prepare by clearing HCARRY BTFSS HTEMP, 4 ;Is data > 10? (HTEMP > 16?) GOTO HINCOFF ;No MOVLW 0x01 MOVWF HCARRY ;Yes so set HCARRY & subtract 10 MOVLW 0x0A SUBWF INDR, F HINCOFF INCF HOFFSET, F ;Increment offset MOVLW 0x07 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 0x08 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 0x80 ;Approx 400uS MOVWF COUNT DC DECFSZ COUNT, F GOTO DC RETURN TABLE ADDWF PCL, F RETLW 0x09 ;Zero RETLW 0xED ;One RETLW 0x43 ;Two RETLW 0xC1 ;Three RETLW 0xA5 ;Four RETLW 0x91 ;Five RETLW 0x31 ;Six RETLW 0xCD ;Seven RETLW 0x01 ;Eight RETLW 0x85 ;Nine RETLW 0xFE ;10 RETLW 0xFE ;11 RETLW 0xFE ;12 RETLW 0xFE ;13 RETLW 0xFE ;14 RETLW 0xFE ;15 RETLW 0xFE ;16 END