; Filename : MULTI_U2.asm ; MultiDisplay program for U2 chip ( 16F84 : 3 digit numeric readout ) ; This program is written for a 16F84 chip with 3.58 MHz crystal clock. ; This program accepts data input to TMR0 external clock input ; and generates multiplexed 7-segment drive signals for a 3-digit ; numeric display. ; Display readouts are common anode. External transistors provide ; LED drive currents, and invert the drive signal polarities. ; Cathodes are energised with logic high output from chip. ; Anodes are energised with logic low output from chip. ; Data is provided via a 2-wire interface. ( clock and gate ) ; Data gate is applied to pin 10 ( RB4 ) ; Data clock is applied to pin 3 ( T0CKI ) ; When data gate goes high, TMR0 and its overflow bit are reset ; Data is then applied to pin 3, as a series of clock pulses. ; The number of clock pulses ranges from 0 to 360. ; Valid bearing values ( in TMR0 + overflow ) range from 0 to 359 ; A bearing value of 360 indicates invalid data. ( display = dashes ) ; When data clock ( pin 3 ) is finished, data gate ( pin 10 ) goes ; low to signal end of data transmission. ; Pin 12 ( RB6 ) is a strap input. Tied low will cause the display ; to show horizontal "dashes" when data goes invalid. Tied high will ; freeze the last valid data, but it will "blink" once per second to ; indicated data is not updating. ; RA0 (pin 17) : Output, "b" segment cathode, active = high ; RA1 (pin 18) : Output, BRG X10 digit anode, active = low ; RA2 (pin 1) : Output, BRG X1 digit anode, active = low ; RA3 (pin 2) : Output, "c" segment cathode, active = high ; T0CKI (pin 3) : Input, data clock ( falling edge trigger ) ; RB0 (pin 6) : Output, "a" segment cathode, active = high ; RB1 (pin 7) : Output, "g" segment cathode, active = high ; RB2 (pin 8) : Output, "f" segment cathode, active = high ; RB3 (pin 9) : Output, "d" segment cathode, active = high ; RB4 (pin 10) : Input, data gate ( active = high ) ; RB5 (pin 11) : Output, BRG X100 digit anode, active = low ; RB6 (pin 12) : hold/blank strap input ( high = hold ) ; RB7 (pin 13) : Output, "e" segment cathode, active = high ;--------------------------------------------------------- ; ; ASSEMBLER DIRECTIVES ; ;--------------------------------------------------------- processor 16F84 ; __config h'3ff1' ;config bits : ;memory protect = off ;pwr-on rst = on ;wdt = off ;osc = xtal ;osc = xtal ;--------------------------------------------------------- ; ; EXECUTABLE CODE BEGINS HERE ; ;--------------------------------------------------------- ;--------------------------------------------------------- ; ; COLDSTART routine ; ;--------------------------------------------------------- COLDSTART goto MAINSTART ;jump around interrupt handler ;--------------------------------------------------------- ; ; INT : Interrupt handler routine ; ;--------------------------------------------------------- org h'0004' ;interrupt vector address INT nop ;entry point ; ; Save CPU status to restore it later ; movwf W_TEMP ;save W reg contents swapf STATUS,0 ;swap W and status bcf STATUS,RP0 ;force bank = 0 movwf STAT_TEMP ;save STATUS reg contents ; ; Examine the interrupt trigger ; btfsc PORTB,4 ;check DATA_GATE bit goto INT_1 ;DATA_GATE = high, jump goto INT_2 ;DATA_GATE = low, jump ; ; Interrupt trigger = start data input ; Clear TMR0 and the overflow bit ; INT_1 clrf TMR0 ;clear TMR0 data byte bcf INTCON,T0IF ;clear TMR0 overflow bit goto INT_4 ;exit ; ; Interrupt trigger = end data input ; Preset VALID flag = 1 ( assume data is valid ) ; Check if data is valid ; Check range : number from 000 to 359 = OK ; INT_2 bsf VALID,0 ;VALID = 1 btfss INTCON,2 ;data > 255 ? goto INT_3 ;if not, jump movlw h'68' ;data > 359 ? subwf TMR0,0 ; btfss STATUS,CY ; goto INT_3 ;if not, jump ; ; Number is out of range ( > 359 ) ; Clear VALID flag and proceed ; clrf VALID ;VALID = 0 goto INT_4 ;exit ; ; Data is valid ; Get TMR0 and overflow bit ; Convert data to BCD for display ; INT_3 movf TMR0,0 ;get TMR0 data byte movwf BINLO ;save it movf INTCON,0 ;get TMRO overflow bit andlw h'04' ; movwf BINHI ; rrf BINHI,1 ;move overflow bit to bit 0 rrf BINHI,1 ; call BINBCD ;convert data to BCD ; ; Restore CPU status ; Clear interrupt flag ; Re-enable interrupts and return ; INT_4 swapf STAT_TEMP,W ;restore STATUS reg contents movwf STATUS ; swapf W_TEMP,1 ;restore W reg swapf W_TEMP,0 ; bcf INTCON,RBIF ;clear PORTB interrupt flag retfie ;done, return ;--------------------------------------------------------- ; ; MAINSTART : Main startup routines are here ; ;--------------------------------------------------------- MAINSTART nop ;entry point ; ; Configure port pins for outputs ; bsf STATUS,RP0 ;select bank 1 bcf TRISA,RA0 ;pin 17 = output bcf TRISA,RA1 ;pin 18 = output bcf TRISA,RA2 ;pin 1 = output bcf TRISA,RA3 ;pin 2 = output bcf TRISB,RB0 ;pin 6 = output bcf TRISB,RB1 ;pin 7 = output bcf TRISB,RB2 ;pin 8 = output bcf TRISB,RB3 ;pin 9 = output bcf TRISB,RB5 ;pin 11 = output bcf TRISB,RB7 ;pin 13 = output bcf STATUS,RP0 ;back to bank 0 clrw ;turn off all LEDs movwf PORTA ; movwf PORTB ; ; ; Configure TMR0 module ; bsf STATUS,RP0 ;select memory bank 1 bcf OPTN,T0SE ;TMR0 clock = rising edge bcf STATUS,RP0 ;back to memory bank 0 ; ; Enable interrupts ; movf PORTB,0 ;read PORTB to preset mask bsf INTCON,RBIE ;enable PORTB interrupts bsf INTCON,GIE ;enable interrupts ; ; Initialize variables ; Proceed to SELFTEST when done ; clrf TMR0 ; clrf VALID ; clrf DIGIT ; movlw BLON_LO ; movwf BLNDX1 ; movlw BLON_HI ; movwf BLNDX2 ; bsf BL_STAT,0 ; ;--------------------------------------------------------- ; ; SELFTEST : LED ( power on ) self-test routine is here ; ;--------------------------------------------------------- SELFTEST nop ;entry point ; ; Prepare for display self test ; Turn off all anodes and cathods ; bcf PORTB,RB0 ;segment a = off bcf PORTA,RA0 ;segment b = off bcf PORTA,RA3 ;segment c = off bcf PORTB,RB3 ;segment d = off bcf PORTB,RB7 ;segment e = off bcf PORTB,RB2 ;segment f = off bcf PORTB,RB1 ;segment g = off bsf PORTA,RA2 ;BRG X1 digit = off bsf PORTA,RA1 ;BRG X10 digit = off bsf PORTB,RB5 ;BRG X100 digit = off ; ; Energise and test each digit individually ; bcf PORTB,RB5 ;BRG X100 digit = on call ST_1 ;check each segment bsf PORTB,RB5 ;BRG X100 digit = off bcf PORTA,RA1 ;BRG X10 digit = on call ST_1 ;check each segment bsf PORTA,RA1 ;BRG X10 digit = off bcf PORTA,RA2 ;BRG X1 digit = on call ST_1 ;check each segment bsf PORTA,RA2 ;BRG X1 digit = off ; ; Self test completed, proceed to EXEC routine ; goto EXEC ;done, proceed ; ; Check each segment for approx. 0.2 seconds ; ST_1 bsf PORTB,RB0 ;segment a = on call ST_2 ;time delay bcf PORTB,RB0 ;segment a = off bsf PORTA,RA0 ;segment b = on call ST_2 ;time delay bcf PORTA,RA0 ;segment b = off bsf PORTA,RA3 ;segment c = on call ST_2 ;time delay bcf PORTA,RA3 ;segment c = off bsf PORTB,RB3 ;segment d = on call ST_2 ;time delay bcf PORTB,RB3 ;segment d = off bsf PORTB,RB7 ;segment e = on call ST_2 ;time delay bcf PORTB,RB7 ;segment e = off bsf PORTB,RB2 ;segment f = on call ST_2 ;time delay bcf PORTB,RB2 ;segment f = off bsf PORTB,RB1 ;segment g = on call ST_2 ;time delay bcf PORTB,RB1 ;segment g = off return ;done, return ; ; Provide approx 0.2 seconds of time delay ; ST_2 movlw ST_MID ;get delay middle byte movwf NDX2 ; movlw ST_LO ;get delay lo byte movwf NDX1 ; ST_3 decfsz NDX1,1 ;lo byte = 0 ? goto ST_3 ;if not, jump decfsz NDX2,1 ;mid byte = 0 ? goto ST_3 ;if not, jump return ;done, return ;--------------------------------------------------------- ; ; EXEC : Executive routines are here ; ;--------------------------------------------------------- EXEC nop ;entry point call DISP ;display the data goto EXEC ;repeat ;--------------------------------------------------------- ; ; DISP : Digit display driver routines ; ;--------------------------------------------------------- DISP nop ;entry point ; ; Point to next digit and check for overflow ; DIGIT = 0, 1 or 2 only ; incf DIGIT,1 ;point to next digit movlw h'03' ;check if DIGIT = 3 subwf DIGIT,0 ; btfsc STATUS,ZRO ;DIGIT = 3 ? clrf DIGIT ;if so, make DIGIT = 0 ; ; Identify the number to be displayed ; 0 = X1 digit, 1 = X10 digit, 2 = X100 digit ; movlw h'00' ;check if DIGIT = 0 (X1) subwf DIGIT,0 ; btfsc STATUS,ZRO ;DIGIT = 0 ? goto DISP_1 ;if so, jump movlw h'01' ;check if DIGIT = 1 (X10) subwf DIGIT,0 ; btfsc STATUS,ZRO ;DIGIT = 1 ? goto DISP_2 ;if so, jump movlw h'02' ;check if DIGIT = 2 (x100) subwf DIGIT,0 ; btfsc STATUS,ZRO ;DIGIT = 2 ? goto DISP_3 ;if so, jump ; ; Display the X1 digit ; DISP_1 movf BCDX1,0 ;get X1 BCD digit movwf BCDOUT ;save it bsf PORTA,RA2 ;BRG X1 digit = off bsf PORTA,RA1 ;BRG X10 digit = off bsf PORTB,RB5 ;BRG X100 digit = off call DISP_4 ;output the digit bcf PORTA,RA2 ;BRG X1 digit = on call BLINK ;check for blink goto MUX ;exit ; ; Display the X10 digit ; DISP_2 movf BCDX10,0 ;get X10 BCD digit movwf BCDOUT ;save it bsf PORTA,RA2 ;BRG X1 digit = off bsf PORTA,RA1 ;BRG X10 digit = off bsf PORTB,RB5 ;BRG X100 digit = off call DISP_4 ;output the digit bcf PORTA,RA1 ;BRG X10 digit = on call BLINK ;check for blink goto MUX ;exit ; ; Display the X100 digit ; DISP_3 movf BCDX100,0 ;get X100 BCD digit movwf BCDOUT ;save it bsf PORTA,RA2 ;BRG X1 digit = off bsf PORTA,RA1 ;BRG X10 digit = off bsf PORTB,RB5 ;BRG X100 digit = off call DISP_4 ;output the digit bcf PORTB,RB5 ;BRG X100 digit = on call BLINK ;check for blink goto MUX ;exit ; ; Check if data is valid ; DISP_4 btfsc VALID,0 ;data = valid ? goto DISP_5 ;if so, jump goto DASH ;invalid data, display "dash" ; ; Data is valid ( or flashing )identify which numeral to display ; DISP_5 movlw h'00' ;check if digit = 0 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 0 ? goto ZERO ;if so, jump movlw h'01' ;check if digit = 1 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 1 ? goto ONE ;if so, jump movlw h'02' ;check if digit = 2 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 2 ? goto TWO ;if so, jump movlw h'03' ;check if digit = 3 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 3 ? goto THREE ;if so, jump movlw h'04' ;check if digit = 4 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 4 ? goto FOUR ;if so, jump movlw h'05' ;check if digit = 5 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 5 ? goto FIVE ;if so, jump movlw h'06' ;check if digit = 6 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 6 ? goto SIX ;if so, jump movlw h'07' ;check if digit = 7 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 7 ? goto SEVEN ;if so, jump movlw h'08' ;check if digit = 8 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 8 ? goto EIGHT ;if so, jump movlw h'09' ;check if digit = 9 subwf BCDOUT,0 ; btfsc STATUS,ZRO ;digit = 9 ? goto NINE ;if so, jump ; ; These are the display output routines for each number ; ZERO movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'09' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'8d' ;set new bits movwf PORTB ;do it return ;exit ONE movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'09' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'00' ;set new bits movwf PORTB ;do it return ;exit TWO movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'01' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'8b' ;set new bits movwf PORTB ;do it return ;exit THREE movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'09' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'0b' ;set new bits movwf PORTB ;do it return ;exit FOUR movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'09' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'06' ;set new bits movwf PORTB ;do it return ;exit FIVE movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'08' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'0f' ;set new bits movwf PORTB ;do it return ;exit SIX movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'08' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'8e' ;set new bits movwf PORTB ;do it return ;exit SEVEN movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'09' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'01' ;set new bits movwf PORTB ;do it return ;exit EIGHT movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'09' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'8f' ;set new bits movwf PORTB ;do it return ;exit NINE movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'09' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'07' ;set new bits movwf PORTB ;do it return ;exit ; ; This is the output routine for invalid data ( dash ) ; DASH nop ;entry point ; ; Check if BLINK strap input is high, return if true ; btfsc PORTB,RB6 ; goto DISP_5 ; ; ; Display horizontal dashes on the display ; movf PORTA,0 ;get PORTA andlw h'f6' ;preserve old bits iorlw h'00' ;set new bits movwf PORTA ;do it movf PORTB,0 ;get PORTB andlw h'70' ;preserve old bits iorlw h'02' ;set new bits movwf PORTB ;do it return ;exit ; ; This routine provides a slight mux time delay before returning ; MUX nop ;entry point movlw MUX_LO ;get delay byte movwf NDX1 ; MUX_1 decfsz NDX1,1 ;lo byte = 0 ? goto MUX_1 ;if not, jump return ;done, return ;--------------------------------------------------------- ; ; BINBCD : Binary-to-BCD conversion routine ( 9 bits ) ; ;--------------------------------------------------------- BINBCD nop ;entry point clrf BCDX100 ;clear result registers clrf BCDX10 clrf BCDX1 BIN2E8 btfss BINHI,0 ;bit 8 = 1 ? goto BIN2E7 ;if not, jump movlw BCD2 ;add 256 to result movwf BCDX100 movlw BCD5 movwf BCDX10 movlw BCD6 movwf BCDX1 BIN2E7 btfss BINLO,7 ;bit 7 = 1 ? goto BIN2E6 ;if not, jump movlw BCD1 ;add 128 to result movwf BCDX100T movlw BCD2 movwf BCDX10T movlw BCD8 movwf BCDX1T call BCDSUM BIN2E6 btfss BINLO,6 ;bit 6 = 1 ? goto BIN2E5 ;if not, jump movlw BCD0 ;add 64 to result movwf BCDX100T movlw BCD6 movwf BCDX10T movlw BCD4 movwf BCDX1T call BCDSUM BIN2E5 btfss BINLO,5 ;bit 5 = 1 ? goto BIN2E4 ;if not, jump movlw BCD0 ;add 32 to result movwf BCDX100T movlw BCD3 movwf BCDX10T movlw BCD2 movwf BCDX1T call BCDSUM BIN2E4 btfss BINLO,4 ;bit 4 = 1 ? goto BIN2E3 ;if not, jump movlw BCD0 ;add 16 to result movwf BCDX100T movlw BCD1 movwf BCDX10T movlw BCD6 movwf BCDX1T call BCDSUM BIN2E3 btfss BINLO,3 ;bit 3 = 1 ? goto BIN2E2 ;if not, jump movlw BCD0 ;add 8 to result movwf BCDX100T movlw BCD0 movwf BCDX10T movlw BCD8 movwf BCDX1T call BCDSUM BIN2E2 btfss BINLO,2 ;bit 2 = 1 ? goto BIN2E1 ;if not, jump movlw BCD0 ;add 4 to result movwf BCDX100T movlw BCD0 movwf BCDX10T movlw BCD4 movwf BCDX1T call BCDSUM BIN2E1 btfss BINLO,1 ;bit 1 = 1 ? goto BIN2E0 ;if not, jump movlw BCD0 ;add 2 to result movwf BCDX100T movlw BCD0 movwf BCDX10T movlw BCD2 movwf BCDX1T call BCDSUM BIN2E0 btfss BINLO,0 ;bit 0 = 1 ? return ;if not, return movlw BCD0 ;add 1 to result movwf BCDX100T movlw BCD0 movwf BCDX10T movlw BCD1 movwf BCDX1T call BCDSUM return ;--------------------------------------------------------- ; ; BCDSUM : Adds BCD partial to BCD total sum. ( subroutine ) ; ;--------------------------------------------------------- BCDSUM nop ;entry point BCDSUM1 clrw ;start with zero addwf BCDX1,0 ;get previous bcd x1 answer addwf BCDX1T,0 ;add new part movwf BCDX1 ;store result addlw OFLOW ;check if answer < 10 btfss STATUS,CY goto BCDSUM10 ;jump if no carry incf BCDX10,1 ;carry 1 to next digit movlw TEN ;subtract 10 from bcd x1 answer subwf BCDX1,1 ;save it BCDSUM10 clrw ;start with zero addwf BCDX10,0 ;get previous bcd x10 answer addwf BCDX10T,0 ;add new part movwf BCDX10 ;store result addlw OFLOW ;check if answer < 10 btfss STATUS,CY goto BCDSUM100 ;jump if no carry incf BCDX100,1 ;carry 1 to next digit movlw TEN ;subtract 10 from bcd x10 answer subwf BCDX10,1 ;save it BCDSUM100 clrw ;start with zero addwf BCDX100,0 ;get previous bcd x100 answer addwf BCDX100T,0 ;add new part movwf BCDX100 ;store result addlw OFLOW ;check if answer < 10 btfss STATUS,CY return ;return if no carry movlw TEN ;subtract 10 from bcd x100 answer subwf BCDX100,1 ;save it return ;--------------------------------------------------------- ; ; BLINK : Blink the display if enabled and data = invalid ; ;--------------------------------------------------------- BLINK nop ;entry point ; ; Check if blink enabled, return if not ; btfss PORTB,RB6 ;blink enabled ? return ;if not, return ; ; Check if data is valid, return if true ; btfsc VALID,0 ;data valid ? return ;if so, return ; ; If CPU arrives here, blink is active ; Check blink status to see if display is presently ON or OFF ; btfss BL_STAT,0 ;display = on ? goto BLINK_1 ;if not, jump ; ; Display is presently ON ; Decrement ON time counters ; Proceed if time = now to turn displays OFF ; Otherwise, return ; decfsz BLNDX1,1 ; return ; decfsz BLNDX2,1 ; return ; ; ; Time to turn displays OFF ; Load counters with values for OFF time ; Increment counters to prepare for loop ; Change blink status from ON to OFF ; movlw BLOFF_LO ; movwf BLNDX1 ; movlw BLOFF_HI ; movwf BLNDX2 ; incf BLNDX1,1 ; incf BLNDX2,1 ; bcf BL_STAT,0 ;blink status = OFF ; ; Turn off the displays ; Decrement OFF time counters ; Proceed if time = now to turn displays ON ; Otherwise, return ; BLINK_1 bsf PORTA,RA2 ;turn off X1 digit bsf PORTA,RA1 ;turn off X10 digit bsf PORTB,RB5 ;turn off X100 digit decfsz BLNDX1,1 ; return ; decfsz BLNDX2,1 ; return ; ; ; Time to turn displays ON ; Load counters with values for ON time ; Increment counters to prepare for loop ; Change blink status from OFF to ON and return ; movlw BLON_LO ; movwf BLNDX1 ; movlw BLON_HI ; movwf BLNDX2 ; incf BLNDX1,1 ; incf BLNDX2,1 ; bsf BL_STAT,0 ;blink status = ON return ;done, return ;--------------------------------------------------------- ; ; END OF EXECUTABLE CODE ; ;--------------------------------------------------------- ; ; LABEL DEFINITION AREA ; ;--------------------------------------------------------- ; ; PREDEFINED REGISTERS ; STATUS equ h'03' ;STATUS register OPTN equ h'81' ;OPTION register INTCON equ h'0b' ;INTCON register TMR0 equ h'01' ;TMR0 register TRISA equ h'85' ;TRISA reg TRISB equ h'86' ;TRISB reg PORTA equ h'05' ;PORTA reg PORTB equ h'06' ;PORTB reg ; ; PROGRAM CONSTANTS ; RP0 equ h'05' ;bank select bit in STATUS reg ZRO equ h'02' ;zero bit in STATUS reg T0SE equ h'04' ;T0SE bit in OPTION reg GIE equ h'07' ;global interrupt enable in INTCON reg T0IF equ h'02' ;TMR0 interrupt flag in INTCON reg RBIF equ h'00' ;PORTB interrupt flag in INTCON reg RBIE equ h'03' ;PORTB interrupt mask in INTCON reg RA0 equ h'00' ;PORTA bit 0 RA1 equ h'01' ;PORTA bit 1 RA2 equ h'02' ;PORTA bit 2 RA3 equ h'03' ;PORTA bit 3 RB0 equ h'00' ;PORTB bit 0 RB1 equ h'01' ;PORTB bit 1 RB2 equ h'02' ;PORTB bit 2 RB3 equ h'03' ;PORTB bit 3 RB5 equ h'05' ;PORTB bit 5 RB6 equ h'06' ;PORTB bit 6 RB7 equ h'07' ;PORTB bit 7 BCD0 equ 0 ;BCD 0 BCD1 equ 1 ;BCD 1 BCD2 equ 2 ;BCD 2 BCD3 equ 3 ;BCD 3 BCD4 equ 4 ;BCD 4 BCD5 equ 5 ;BCD 5 BCD6 equ 6 ;BCD 6 BCD7 equ 7 ;BCD 7 BCD8 equ 8 ;BCD 8 BCD9 equ 9 ;BCD 9 OFLOW equ D'246' ;BCD OVERFLOW TEST ( 256-10 ) TEN equ D'10' ;BCD TEN CY equ h'00' ;carry bit (STATUS reg bit 0) ST_LO equ h'00' ;SELF TEST time delay lo byte ST_MID equ h'c0' ;SELF TEST time delay mid byte MUX_LO equ h'40' ;MUX time delay lo byte BLON_LO equ h'00' ;BLINK display ON time lo byte BLON_HI equ h'10' ;BLINK display ON time hi byte BLOFF_LO equ h'00' ;BLINK display OFF time lo byte BLOFF_HI equ h'01' ;BLINK display OFF time hi byte ; ; PROGRAM VARIABLES ; STAT_TEMP equ h'0c' ;temp storage for STATUS reg W_TEMP equ h'0d' ;temp storage for W reg BINLO equ h'0e' ;DF data lo byte BINHI equ h'0f' ;DF data hi byte VALID equ h'10' ;DF data valid flag DIGIT equ h'11' ;digit select byte BCDOUT equ h'12' ;numeral data byte BCDX1 equ h'13' ;BCD result X1 digit BCDX10 equ h'14' ;BCD result X10 digit BCDX100 equ h'15' ;BCD result X100 digit BCDX1T equ h'16' ;BCD temporary X1 digit BCDX10T equ h'17' ;BCD temporary X10 digit BCDX100T equ h'18' ;BCD temporary X100 digit NDX1 equ h'19' ;loop index lo byte NDX2 equ h'1a' ;loop index mid byte NDX3 equ h'1b' ;loop index hi byte SAVE_A equ h'1c' ;A port data preserve reg SAVE_B equ h'1d' ;B port data preserve reg BLNDX1 equ h'1e' ;blink index low byte reg BLNDX2 equ h'1f' ;blink index mid byte reg BLNDX3 equ h'20' ;blink index hi byte reg BL_STAT equ h'21' ;blink ON / OFF status ;--------------------------------------------------------- ; ; END OF SOURCE CODE ; ;--------------------------------------------------------- end