mathur2000
New Member
Hi i am new to PIC. I have made a project (Digital Timer) that displays time increasing every sec. The circuit & program I made using PIC 16F72 has multiplexed display segments on PORTA, and to driving transistors (BC547) on PORTC,4 & PORTC,5. The time is displayed perfectly as desired. However when I tried to add one display (PORTC,7) the display gets haywire.
this code is working fine for 2 digits
;*********************************************************
; TABLE FOR SEVEN SEGMENT OUTPUT FOR COMMON ANODE
;*********************************************************;
; B A F G E D C DP
TABLE ADDWF PCL,F
RETLW B'00010001' ; 0
RETLW B'01111101' ; 1
RETLW B'00100011' ; 2
RETLW B'00101001' ; 3
RETLW B'01001101' ; 4
RETLW B'10001001' ; 5
RETLW B'10000001' ; 6
RETLW B'00111101' ; 7
RETLW B'00000001' ; 8
RETLW B'00001001' ; 9
RETLW 0 ; JUST IN CASE
;*********************************************************
; DISPLAY DRIVING ROUTINE
;*********************************************************;
OVER MOVF MSD,W ; MOVE THE VALUE OF MSD IN W
BTFSC STATUS,Z ; CHECK IF MSD IS 0 (FOR BLANKING)
GOTO STEP_OVER ; IF YES, JUMP TO STEP_OVER
CALL TABLE ; OTHERWISE, DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF D_MSD ; ENABLE D_MSD
CALL DELAY ; FOR 0.01 SECONDS
BCF D_MSD ; THEN DISABLE D_MSD
STEP_OVER
MOVF LSD,W ; MOVE VALUE OF LSD IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF D_LSD ; ENABLE D_LSD
CALL DELAY ; FOR 0.01 SECONDS
BCF D_LSD ; THEN DISABLE D_LSD
GOTO TEST
When I connect three displays. Two displays run concurrently. I have used following code for running three displays :
;*******************************************************
; TABLE FOR SEVEN SEGMENT OUTPUT FOR COMMON ANODE ;
;*******************************************************;
; A F B E D C G DP
TABLE ADDWF PCL,F ; ADD PROGRAM COUNTER TO ITSELF
RETLW B'00000011' ; SEGMENT OUTPUTS FOR 0
RETLW B'11011011' ; SEGMENT OUTPUTS FOR 1
RETLW B'01000101' ; SEGMENT OUTPUTS FOR 2
RETLW B'01010001' ; SEGMENT OUTPUTS FOR 3
RETLW B'10011001' ; SEGMENT OUTPUTS FOR 4
RETLW B'00110001' ; SEGMENT OUTPUTS FOR 5
RETLW B'00100001' ; SEGMENT OUTPUTS FOR 6
RETLW B'01011011' ; SEGMENT OUTPUTS FOR 7
RETLW B'00000001' ; SEGMENT OUTPUTS FOR 8
RETLW B'00010001' ; SEGMENT OUTPUTS FOR 9
RETLW 0 ; JUST IN CASE
;*******************************************************;
; DISPLAY DRIVING ROUTINE ;
;*******************************************************;
OVER MOVF HS,W ; MOVE THE VALUE OF HS IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF PORTC,4
CALL DELAY ; FOR 0.01 SECONDS
BCF PORTC,4
MOVF TENS,W ; MOVE VALUE OF TENS IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF PORTC,5
CALL DELAY ; FOR 0.01 SECONDS
BCF PORTC,5
MOVF ONES,W ; MOVE VALUE OF ONES IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF PORTC,5
CALL DELAY ; FOR 0.01 SECONDS
BCF PORTC,5
GOTO TEST
PLEASE HELP
this code is working fine for 2 digits
;*********************************************************
; TABLE FOR SEVEN SEGMENT OUTPUT FOR COMMON ANODE
;*********************************************************;
; B A F G E D C DP
TABLE ADDWF PCL,F
RETLW B'00010001' ; 0
RETLW B'01111101' ; 1
RETLW B'00100011' ; 2
RETLW B'00101001' ; 3
RETLW B'01001101' ; 4
RETLW B'10001001' ; 5
RETLW B'10000001' ; 6
RETLW B'00111101' ; 7
RETLW B'00000001' ; 8
RETLW B'00001001' ; 9
RETLW 0 ; JUST IN CASE
;*********************************************************
; DISPLAY DRIVING ROUTINE
;*********************************************************;
OVER MOVF MSD,W ; MOVE THE VALUE OF MSD IN W
BTFSC STATUS,Z ; CHECK IF MSD IS 0 (FOR BLANKING)
GOTO STEP_OVER ; IF YES, JUMP TO STEP_OVER
CALL TABLE ; OTHERWISE, DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF D_MSD ; ENABLE D_MSD
CALL DELAY ; FOR 0.01 SECONDS
BCF D_MSD ; THEN DISABLE D_MSD
STEP_OVER
MOVF LSD,W ; MOVE VALUE OF LSD IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF D_LSD ; ENABLE D_LSD
CALL DELAY ; FOR 0.01 SECONDS
BCF D_LSD ; THEN DISABLE D_LSD
GOTO TEST
When I connect three displays. Two displays run concurrently. I have used following code for running three displays :
;*******************************************************
; TABLE FOR SEVEN SEGMENT OUTPUT FOR COMMON ANODE ;
;*******************************************************;
; A F B E D C G DP
TABLE ADDWF PCL,F ; ADD PROGRAM COUNTER TO ITSELF
RETLW B'00000011' ; SEGMENT OUTPUTS FOR 0
RETLW B'11011011' ; SEGMENT OUTPUTS FOR 1
RETLW B'01000101' ; SEGMENT OUTPUTS FOR 2
RETLW B'01010001' ; SEGMENT OUTPUTS FOR 3
RETLW B'10011001' ; SEGMENT OUTPUTS FOR 4
RETLW B'00110001' ; SEGMENT OUTPUTS FOR 5
RETLW B'00100001' ; SEGMENT OUTPUTS FOR 6
RETLW B'01011011' ; SEGMENT OUTPUTS FOR 7
RETLW B'00000001' ; SEGMENT OUTPUTS FOR 8
RETLW B'00010001' ; SEGMENT OUTPUTS FOR 9
RETLW 0 ; JUST IN CASE
;*******************************************************;
; DISPLAY DRIVING ROUTINE ;
;*******************************************************;
OVER MOVF HS,W ; MOVE THE VALUE OF HS IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF PORTC,4
CALL DELAY ; FOR 0.01 SECONDS
BCF PORTC,4
MOVF TENS,W ; MOVE VALUE OF TENS IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF PORTC,5
CALL DELAY ; FOR 0.01 SECONDS
BCF PORTC,5
MOVF ONES,W ; MOVE VALUE OF ONES IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF PORTC,5
CALL DELAY ; FOR 0.01 SECONDS
BCF PORTC,5
GOTO TEST
PLEASE HELP