Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

driving multiplexed 7 segment display

Status
Not open for further replies.

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
 
Hello,
I just looked through your code quickly.
Where do you set PORTC...bit 7 High??
I think that might be your problem.
Good luck....Art
 
Hi,
You said that PORTC,7 is added for driving another 7-segment display; but you never do it in your code? The last part of transistor switching should be like this:
Code:
MOVF ONES,W ; MOVE VALUE OF ONES IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF PORTC,[B]7[/B]
CALL DELAY ; FOR 0.01 SECONDS
BCF PORTC,[B]7[/B]
*If I'm not mistaken :D
 
I am sorry . This is a typo. A mistake while copy pasting. the actual code is :

;*********************************************************;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,6
CALL DELAY ; FOR 0.01 SECONDS
BCF PORTC,6

GOTO TEST


It does not work. Atleast 2 displays light up concurrently. Please Help
 
I'm getting confused :D
You mentioned that you added another 7-segment display at PORTC,7, and the latest code you showed is still not RC7 but RC6. So it doesn't work, of course.
 
Oops. another mistake. Actualy the display is on PORTA,6 & i am plannining to add another one in POATA,7, but I am still stuck at running three displays. Can't move on the fourth. Thanks for pointing out. Thease mistakes are in this post only, not in the code.
 
Oops. another mistake. Actualy the display is on PORTC,6 & i am plannining to add another one in POATC,7, but I am still stuck at running three displays. Can't move on the fourth. Thanks for pointing out. Thease mistakes are in this post only, not in the code.

:p :p :p :p :p :p
 
Sir this is the complete code. Please point out any errors. while driving 2 displays everything is ok but when i drive 3 digits, 2digit light up at the same time. When run in the MPLAB simulator, everything is fine.

Code:
    LIST    P=16F72      ; DEFINE PROCESSOR
#INCLUDE    <P16F72.INC> ; INCLUDE DEFINATIONS

   __CONFIG _CP_ALL & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC

    ERRORLEVEL	-302	; SUPRESS MESSAGES

#DEFINE    DGT_ONES	PORTC,4
#DEFINE    DGT_TENS	PORTC,5
#DEFINE    DGT_HS	PORTC,6
#DEFINE    DGT_THS      PORTC,7

    CBLOCK 0X20
	ONES, TENS, HS, THS, MSEC, SEC, MIN
	TMP_W, TMP_STS, C1, C2, C3, MSECT
	ENDC


	ORG	0X00
     	GOTO	INIT


	ORG	0X04

INTP	MOVWF	TMP_W	  ; SAVE VALUE OF W IN TMP_W FILE
	SWAPF	STATUS,W  ; & VALUE OF STATUS REGISTER
	MOVWF	TMP_STS   ; TMP_STS FILE

	BTFSS	INTCON,2  ; CHECK OF INTERRUPT ROLLOVER
	GOTO	EXIT	  ; IF NOT, EXIT FROM INTERRUPT

	BCF	INTCON,2  ; IF YES, CLEAR INTERRUPT FLAG
	MOVLW	.6	  ; ADD 6 TO TMR0 REGISTER FOR EXACT 
	ADDWF	TMR0, F	  ; 4000 µS PULSE (16 X 250 µS)

	INCF	MSEC, F  
	MOVLW	.250	  ; 4 MS X 250 = 1 SEC	WAS 250
	SUBWF	MSEC,W	  ;
	BTFSS	STATUS,Z  ; CHECK 0 STATUS
	GOTO	EXIT	  ; IF NOT 0, EXIT FROM INTERRUPT

	CALL	UPDATE

	BCF	INTCON,2

EXIT	SWAPF	TMP_STS,W ; MOVE BACK ORIGINAL VALUES OF W &
	MOVWF	STATUS	  ; STATUS TO W & STATUS REGISTERS
	MOVF	TMP_W,W	  ;
	RETFIE		  ; & RETURN FROM INTERRUPT			


; 		  AFBEDCGDP
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


OVER	MOVF	ONES,W		; MOVE THE VALUE OF ONES IN W
	CALL	TABLE		; OTHERWISE, DISPLAY SEVEN SEGMENT VALUE	
	MOVWF	PORTB		; IN DISPLAYS THROUGH PORTB

	BSF	DGT_ONES
	CALL	DELAY		; FOR 0.0005 SECONDS
	BCF	DGT_ONES
	
	MOVF	TENS,W		; MOVE VALUE OF TENS IN W
	CALL	TABLE		; DISPLAY SEVEN SEGMENT VALUE
	MOVWF	PORTB		; IN DISPLAYS THROUGH PORTB

	BSF	DGT_TENS
	CALL	DELAY		; FOR 0.0005 SECONDS
	BCF	DGT_TENS

	MOVF	HS,W		; MOVE VALUE OF HS IN W
	CALL	TABLE		; DISPLAY SEVEN SEGMENT VALUE
	MOVWF	PORTB		; IN DISPLAYS THROUGH PORTB

	BSF	DGT_HS
	CALL	DELAY		; FOR 0.0005 SECONDS
	BCF	DGT_HS


	GOTO	OVER

INIT	MOVLW	B'00000000'	; STATUS OF PORTA
	MOVWF	PORTC		; 
	MOVLW	B'00000000'	; STATUS OF PORTB
	MOVWF	PORTB		; 
	MOVLW	B'00000000'	; STATUS OF PORTC
	MOVWF	PORTA		; 

	BANKSEL	TRISA		; SWITCH TO BANK1
	CLRF	TRISA		; ALL OUTPUTS
	CLRF	TRISB		; ALL OUTPUTS
	CLRF	TRISC		; ALL OUTPUTS
	BANKSEL	PORTA		; SWITCH BACK TO BANK0
	

CLR	MOVLW	20H		; MOVE A VALUE OF 20
	MOVWF	FSR		; IN FILE SELECT REGISTER
	
CLR_RAM	CLRF	INDF		; CLEAR INDIRECT FILE
	INCF	FSR,F		; INCREASE FSR 
	MOVLW	40H		;
	SUBWF	FSR,W		; TILL 80H LOCATION
	BTFSS	STATUS,Z	; IF YES, JUMP TO NEXT COMMAND
	GOTO	CLR_RAM		; IF NOT, DO UNTILL DONE.

	BANKSEL	ADCON1		;
	MOVLW	06H		; CONVERT ALL IO PINS 
	MOVWF	ADCON1		; TO DIGITAL IO'S
	MOVLW	03H		; SET PRESCALER TO 1:16
	MOVWF	OPTION_REG	;
	BANKSEL	PORTA		;
	
	MOVLW	06H		; (256-6) OVERFLOW EVERY 4 MS
	MOVWF	TMR0		; 16 X 250 = 4000 µS

	BSF	INTCON,TMR0IE	; ENABLE TMR0
	BSF	INTCON,7	; ENABLE ALL INTERRUPTS

	CLRF	PORTC
	GOTO	OVER		; RUN

UPDATE	CLRF	MSEC		; CLEAR MSEC
	INCF	ONES,F		; INCREASE ONES

	MOVLW	.10 		; CHECK IF IT HAS REACHED 10
	SUBWF	ONES,W		; OR NOT
	BTFSS	STATUS,Z	; CHECK 0 STATUS
	RETURN

	CLRF	ONES		; CLEAR ONES
	INCF	TENS,F		; INCREASE TENS
	MOVLW	.10 		; CHECK IF IT HAS REACHED 10
	SUBWF	TENS,W		; OR NOT
	BTFSS	STATUS,Z	; CHECK 0 STATUS
	RETURN

	CLRF	TENS		; CLEAR TENS
	INCF	HS,F		; INCREASE HS
	MOVLW	.10 		; CHECK IF IT HAS REACHED 10
	SUBWF	HS,W		; OR NOT
	BTFSS	STATUS,Z	; CHECK 0 STATUS
	RETURN

	CLRF	HS		; CLEAR HS
	RETURN


DELAY	MOVLW	.165			
	MOVWF	C1	

LOOP	DECFSZ	C1,F	
	GOTO	LOOP	
	NOP
	NOP
	NOP
	NOP
	RETURN

	END

Please Help
 
Last edited:
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top