__config 3f79 ;Long (100mS) Count ; ;Display (0-6) connected to RA0 thru RA2 ;Digit (0-9) connected to RC4 thru RC7 ;Gate is RC3 ;Reset 74HC4040 is RC2 ;Count In is RC0 ;74HC4040 data is RB0-7 ; ;Definitions ;PIC Registers INDR EQU 0 PCL EQU 2 STATUS EQU 3 ;Used for Zero bit FSR EQU 4 PORTA EQU 5 PORTB EQU 6 PORTC EQU 7 PCLATH EQU 0x0A ;Program Counter High Bits INTCON EQU 0x0B ;Interrupt Control TMR1L EQU 0x0E ;Least Significant Byte of Counter TMR1H EQU 0x0F ;Most Significant Byte of Counter T1CON EQU 0x10 ;Counter Control ;PIC Bits W EQU 0 F EQU 1 CARRY EQU 0 ZERO EQU 2 TMR1ON EQU 0 TMR1CS EQU 1 T1SYNC EQU 2 T1OSCEN EQU 3 T1CKPS0 EQU 4 T1CKPS1 EQU 5 ;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 CHAR EQU 0x29 LOOP EQU 0x2A DELAY EQU 0x2B LCOUNT EQU 0x2C HDATA EQU 0x32 HTEMP EQU 0x33 HCARRY EQU 0x34 HOFFSET EQU 0x35 HOFFBIT EQU 0x36 ;Project Bits GATE EQU 3 RST EQU 2 ;START!!! ORG 0x10 ;Initialise BSF 3, 5 BCF 3, 6 ; CLRF PORTA ;PORTA = Output MOVLW 0xFF MOVWF PORTB ;PORTB = Input MOVLW 0x03 MOVWF PORTC ;PORTC = (0-1=Input) (2-7=Output) BCF 3, 5 CLRF PCLATH CLRF DIGIT CLRF D0 CLRF D1 CLRF D2 CLRF D3 CLRF D4 CLRF D5 CLRF D6 CLRF D7 CLRF T1CON BSF T1CON, T1OSCEN BSF T1CON, TMR1CS BCF PORTC, GATE ;Set Up Count LONG MOVLW 0x64 MOVWF LCOUNT ;Reset Counters etc CLRF DIGIT BSF PORTC, RST CLRF TMR1L CLRF TMR1H BCF PORTC, RST ;Open Gates BSF T1CON, TMR1ON BSF PORTC, GATE ;Main Delay Loop WAIT CALL TICK DECFSZ LCOUNT, F GOTO WAIT MOVLW 0x1E MOVWF DELAY SHORT DECFSZ DELAY, F GOTO SHORT ;Close Gate BCF PORTC, GATE BCF T1CON, TMR1ON ;Loop to end of cycle MOVLW 0x03 MOVWF LCOUNT WAIT2 CALL TICK DECFSZ LCOUNT, F GOTO WAIT2 ;Decode display CLRF D0 CLRF D1 CLRF D2 CLRF D3 CLRF D4 CLRF D5 CLRF D6 CLRF D7 MOVF TMR1H, W MOVWF HDATA CALL HEX2BCD MOVF TMR1L, W MOVWF HDATA CALL HEX2BCD MOVF PORTB, W MOVWF HDATA CALL HEX2BCD CALL BLANK GOTO LONG ;Output Digit (16uS) TICK MOVF PORTC, W IORLW 0xF0 MOVWF PORTC ;Clear Display INCF DIGIT, W ;Update character ANDLW 0x07 MOVWF DIGIT MOVWF PORTA ADDLW 0x20 ;Register Offset MOVWF FSR SWAPF INDR, W ;Get char ANDLW 0xF0 MOVWF CHAR MOVF PORTC, W ANDLW 0x0C IORWF CHAR, W MOVWF PORTC ;Delay loop MOVLW 0xC8 MOVWF DELAY LOOP1 DECFSZ DELAY, F GOTO LOOP1 NOP ;602uS in Loop1 MOVLW 0x7C MOVWF DELAY LOOP2 DECFSZ DELAY, F GOTO LOOP2 NOP ;392uS in Loop2 RETURN ;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 BCF STATUS, CARRY ;Clear carry bit RLF INDR, F ;Multiply data by two BTFSC HCARRY, 0 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 INCF HCARRY, F ;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 BLANK MOVF D1, F BTFSS STATUS, ZERO RETURN MOVLW 0x0F MOVWF D1 MOVF D2, F BTFSS STATUS, ZERO RETURN MOVLW 0x0F MOVWF D2 MOVF D3, F BTFSS STATUS, ZERO RETURN MOVLW 0x0F MOVWF D3 MOVF D4, F BTFSS STATUS, ZERO RETURN MOVLW 0x0F MOVWF D4 RETURN END