;Count2 ; ;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 10 ;Program Counter High Bits INTCON .EQU 11 ;Interrupt Control TMR1L .EQU 14 ;Least Significant Byte of Counter TMR1H .EQU 15 ;Most Significant Byte of Counter T1CON .EQU 16 ;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 32 D6 .EQU 33 D5 .EQU 34 D4 .EQU 35 D3 .EQU 36 D2 .EQU 37 D1 .EQU 38 D0 .EQU 39 DIGIT .EQU 40 CHAR .EQU 41 LOOP .EQU 42 DELAY .EQU 43 LCOUNT .EQU 44 HDATA .EQU 50 HTEMP .EQU 51 HCARRY .EQU 52 HOFFSET .EQU 53 HOFFBIT .EQU 54 ;Project Bits GATE .EQU 3 RST .EQU 2 ;START!!! .ORG $10 ;Initialise BSF 3, 5 BCF 3, 6 ; CLRF PORTA ;PORTA = Output MOVLW $FF MOVWF PORTB ;PORTB = Input MOVLW $03 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 100 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 30 MOVWF DELAY SHORT DECFSZ DELAY, F GOTO SHORT ;Close Gate BCF PORTC, GATE BCF T1CON, TMR1ON ;Loop to end of cycle MOVLW 3 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 $F0 MOVWF PORTC ;Clear Display INCF DIGIT, W ;Update character ANDLW $07 MOVWF DIGIT MOVWF PORTA ADDLW 32 ;Register Offset MOVWF FSR SWAPF INDR, W ;Get char ANDLW $F0 MOVWF CHAR MOVF PORTC, W ANDLW $0C IORWF CHAR, W MOVWF PORTC ;Delay loop MOVLW 200 MOVWF DELAY LOOP1 DECFSZ DELAY, F GOTO LOOP1 NOP ;602uS in Loop1 MOVLW 124 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 32 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 6 ;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 10 SUBWF INDR, F HINCOFF INCF HOFFSET, F ;Increment offset MOVLW 7 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 8 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 $0F MOVWF D1 MOVF D2, F BTFSS STATUS, ZERO RETURN MOVLW $0F MOVWF D2 MOVF D3, F BTFSS STATUS, ZERO RETURN MOVLW $0F MOVWF D3 MOVF D4, F BTFSS STATUS, ZERO RETURN MOVLW $0F MOVWF D4 RETURN .END