Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;*************************************************************************************************
- ;** **
- ;** Header Information **
- ;** **
- ;*************************************************************************************************
- list p=16F628A, r=dec, w=-302
- include <P16F628A.INC>
- __config _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
- ;*************************************************************************************************
- ;** **
- ;** Variable Declarations **
- ;** **
- ;*************************************************************************************************
- cblock 0x20
- ANODE
- DIGIT1
- DIGIT2
- endc
- cblock 0x70
- W_TEMP
- STATUS_TEMP
- PCLATH_TEMP
- endc
- ;*************************************************************************************************
- ;** **
- ;** Start Main Code **
- ;** **
- ;*************************************************************************************************
- org 0x000 ;reset vector
- goto START
- ;*************************************************************************************************
- ;** **
- ;** Interrupt Handler **
- ;** **
- ;*************************************************************************************************
- org 0x004 ;interrupt vector
- ;interrupt context save
- movwf W_TEMP
- swapf STATUS,W
- movwf STATUS_TEMP
- movfw PCLATH
- movwf PCLATH_TEMP
- btfsc INTCON,T0IF ;timer 0 interrupt?
- goto Display ;yes
- goto ISRExit ;no, exit ISR
- Display movfw PORTB
- movwf ANODE
- btfsc ANODE,4 ;is right digit on?
- goto DigitLoad ;no, load next digit
- movlw b'00001000' ;reset anode buffer
- movwf ANODE
- movlw 0x20 ;reset RAM address pointer
- movwf FSR
- DigitLoad incf FSR,F ;increment RAM address pointer
- rrf ANODE,F ;shift anode drive bits 1 left
- movfw INDF ;load next digit value
- clrf PORTB ;blank display
- movwf PORTA ;send digit pattern to display
- movfw ANODE ;turn on next digit
- movwf PORTB
- clrf TMR0 ;init timer 0
- bcf INTCON,T0IF ;clear timer 0 interrupt flag
- ;interrupt context restore
- ISRExit movfw PCLATH_TEMP
- movwf PCLATH
- swapf STATUS_TEMP,W
- movwf STATUS
- swapf W_TEMP,F
- swapf W_TEMP,W
- retfie ;exit interrupt
- ;*************************************************************************************************
- ;** **
- ;** Digit Lookup Table **
- ;** **
- ;*************************************************************************************************
- TABLE addwf PCL,F
- retlw b'10000000' ;0
- retlw b'11011001' ;1
- retlw b'01000100' ;2
- retlw b'01010000' ;3
- retlw b'00011001' ;4
- retlw b'00010010' ;5
- retlw b'00000010' ;6
- retlw b'11011000' ;7
- retlw b'00000000' ;8
- retlw b'00010000' ;9
- retlw b'11011111' ;blank
- ;*************************************************************************************************
- ;** **
- ;** Initialization Routine **
- ;** **
- ;*************************************************************************************************
- START movlw 7 ;disable on chip comparator
- movwf CMCON
- movlw 0xFF ;init PORTA all segments blank
- movwf PORTA
- movlw b'00000100' ;init PORTB digit 1 on
- movwf PORTB
- banksel TRISA ;bank 1
- clrf TRISA ;port a and b all outputs
- clrf TRISB
- movlw 0xD3 ;timer 0 clock source = Tcy
- movwf OPTION_REG ;1:16 prescale
- banksel 0 ;bank 0
- movlw 2 ;fetch number 2 segment data
- call TABLE
- movwf DIGIT1 ;load into digit 1 buffer
- movlw 4 ;fetch number 4 segment data
- call TABLE
- movwf DIGIT2 ;load into digit 2 buffer
- clrf TMR0 ;init TMR0
- bcf INTCON,T0IF ;clear timer 0 interrupt flag
- bsf INTCON,T0IE ;enable timer 0 interrupt
- bsf INTCON,GIE ;enable unmasked interrupts
- goto $
- end
Add Comment
Please, Sign In to add comment