Morseman
Newbie level 2

Hello all,
I am trying to make an incrementing counter using a PIC 16F84 and two seven segment display. I want to count from 00 to 99 incrementing the units and when they reach 10 then reset to 0 and increment the tens, thus counting to 99. I also need to multiplex the two seven segment displays and have a delay.
I have been struggling with this, so any help at all would be greatly appreciated. Here is a copy of my assembly code which does not seem to work at the moment.
;****************INCCNT.asm******************
;
;An incrementing counter from 00 to 99 using to seven segment displays.
;****************************************************
LIST P=16F84 ;type of pic used
INCLUDE "p16F84.inc"
;*************SET UP LABELS
PORTB EQU 6
TRISB EQU 0X86 ; this means HEX value $86
PORTA EQU 5
TRISA EQU 0X85
STATUS EQU 3
ZERO EQU 2
PCL EQU 2
;W EQU 1
;F EQU 0
;***MEMORY LOCATIONS USED
UNITS EQU 0X0C
TENS EQU 0X0D
COUNT EQU 0X0E ;REG USED IN DISPLAY
NUMBER1 EQU 0X0F ;REG USED IN DELAY
NUMBER2 EQU 0X10 ;REG USED IN DELAY
;DISPLAY EQU 0X11 ;REG USED IN DISPLAY
;MAIN EQU 0X1C
;****VALUES USED**********
VAL1 EQU 0XFF ;USED IN DELAY
VAL2 EQU 0X0F ;USED IN DELAY
TEN EQU 0X0A ;THE VALUE TEN
UNIT EQU 0X01 ;THE VALUE ONE
;*****DEFINITIONS********
#DEFINE BANK1 BSF STATUS,5 ;SELECT BANK 1
#DEFINE BANK0 BCF STATUS,5 ;SELECT BANK 0
;*****SET ORIGIN & INITIALISE PORTS
ORG 0X00 ;SET THE START OF THE PROGRAM TO ADDRESS $00
BANK1 ;SELECT REGISTOR BANK1
MOVLW 0X00 ;SET ALL BITS IN PORT B
MOVWF PORTB ;AS OUTPUT
MOVLW 0X00
MOVWF PORTA
;TRIS PORTB ;AS OUTPUT
;TRIS PORTA
BANK0 ;SELECT REGISTOR BANK0
GOTO MAIN
;******SUBROUTINES********
;*******DELAY25**********
DELAY25: MOVLW VAL2
MOVWF NUMBER2
DELOOP2: MOVLW VAL1
MOVWF NUMBER1
DELOOP1: DECF NUMBER1,f
BTFSS STATUS,ZERO
GOTO DELOOP1
DECF NUMBER2,f
BTFSS STATUS,ZERO
GOTO DELOOP2
RETURN
;******* TABLE ****************
TABLE ADDWF PCL,f
RETLW 0X3F ;0
RETLW 0X06 ;1
RETLW 0X5B ;2
RETLW 0X4F ;3
RETLW 0X66 ;4
RETLW 0X6D ;5
RETLW 0X7D ;6
RETLW 0X07 ;7
RETLW 0X7F ;8
RETLW 0X67 ;9
;**************DISPLAY*************
DISPLAY
MOVLW TEN ;MOVES VALUE 10 TO W REG
MOVWF COUNT ;COUNT FILE = 10
LOOP1
MOVLW UNITS
CALL TABLE
MOVWF PORTB
BSF PORTA,0
BCF PORTA,1
CALL DELAY25
CLRF UNITS
MOVLW TENS
MOVWF COUNT
CALL TABLE
MOVWF PORTB
BCF PORTA,0
BSF PORTA,1
CALL DELAY25
DECF COUNT,f
BTFSS STATUS, ZERO
GOTO LOOP1
RETURN
;*****MAIN PROGRAM*****
MAIN
INCF UNITS,f ;INCREMENT UNITS
MOVFW UNITS
SUBLW TEN
BTFSS STATUS,ZERO
GOTO FINISH
CLRF UNITS ;CLEAR UNITS
INCF TENS,f ;INCREMENT TENS
MOVFW TENS
SUBLW TEN
BTFSS STATUS, ZERO
GOTO FINISH
CLRF TENS
FINISH
CALL DISPLAY
END
If anyone can help me then you can either reply to the group or direct at m0gmt@yahoo.co.uk
Thanks,
Danny...
I am trying to make an incrementing counter using a PIC 16F84 and two seven segment display. I want to count from 00 to 99 incrementing the units and when they reach 10 then reset to 0 and increment the tens, thus counting to 99. I also need to multiplex the two seven segment displays and have a delay.
I have been struggling with this, so any help at all would be greatly appreciated. Here is a copy of my assembly code which does not seem to work at the moment.
;****************INCCNT.asm******************
;
;An incrementing counter from 00 to 99 using to seven segment displays.
;****************************************************
LIST P=16F84 ;type of pic used
INCLUDE "p16F84.inc"
;*************SET UP LABELS
PORTB EQU 6
TRISB EQU 0X86 ; this means HEX value $86
PORTA EQU 5
TRISA EQU 0X85
STATUS EQU 3
ZERO EQU 2
PCL EQU 2
;W EQU 1
;F EQU 0
;***MEMORY LOCATIONS USED
UNITS EQU 0X0C
TENS EQU 0X0D
COUNT EQU 0X0E ;REG USED IN DISPLAY
NUMBER1 EQU 0X0F ;REG USED IN DELAY
NUMBER2 EQU 0X10 ;REG USED IN DELAY
;DISPLAY EQU 0X11 ;REG USED IN DISPLAY
;MAIN EQU 0X1C
;****VALUES USED**********
VAL1 EQU 0XFF ;USED IN DELAY
VAL2 EQU 0X0F ;USED IN DELAY
TEN EQU 0X0A ;THE VALUE TEN
UNIT EQU 0X01 ;THE VALUE ONE
;*****DEFINITIONS********
#DEFINE BANK1 BSF STATUS,5 ;SELECT BANK 1
#DEFINE BANK0 BCF STATUS,5 ;SELECT BANK 0
;*****SET ORIGIN & INITIALISE PORTS
ORG 0X00 ;SET THE START OF THE PROGRAM TO ADDRESS $00
BANK1 ;SELECT REGISTOR BANK1
MOVLW 0X00 ;SET ALL BITS IN PORT B
MOVWF PORTB ;AS OUTPUT
MOVLW 0X00
MOVWF PORTA
;TRIS PORTB ;AS OUTPUT
;TRIS PORTA
BANK0 ;SELECT REGISTOR BANK0
GOTO MAIN
;******SUBROUTINES********
;*******DELAY25**********
DELAY25: MOVLW VAL2
MOVWF NUMBER2
DELOOP2: MOVLW VAL1
MOVWF NUMBER1
DELOOP1: DECF NUMBER1,f
BTFSS STATUS,ZERO
GOTO DELOOP1
DECF NUMBER2,f
BTFSS STATUS,ZERO
GOTO DELOOP2
RETURN
;******* TABLE ****************
TABLE ADDWF PCL,f
RETLW 0X3F ;0
RETLW 0X06 ;1
RETLW 0X5B ;2
RETLW 0X4F ;3
RETLW 0X66 ;4
RETLW 0X6D ;5
RETLW 0X7D ;6
RETLW 0X07 ;7
RETLW 0X7F ;8
RETLW 0X67 ;9
;**************DISPLAY*************
DISPLAY
MOVLW TEN ;MOVES VALUE 10 TO W REG
MOVWF COUNT ;COUNT FILE = 10
LOOP1
MOVLW UNITS
CALL TABLE
MOVWF PORTB
BSF PORTA,0
BCF PORTA,1
CALL DELAY25
CLRF UNITS
MOVLW TENS
MOVWF COUNT
CALL TABLE
MOVWF PORTB
BCF PORTA,0
BSF PORTA,1
CALL DELAY25
DECF COUNT,f
BTFSS STATUS, ZERO
GOTO LOOP1
RETURN
;*****MAIN PROGRAM*****
MAIN
INCF UNITS,f ;INCREMENT UNITS
MOVFW UNITS
SUBLW TEN
BTFSS STATUS,ZERO
GOTO FINISH
CLRF UNITS ;CLEAR UNITS
INCF TENS,f ;INCREMENT TENS
MOVFW TENS
SUBLW TEN
BTFSS STATUS, ZERO
GOTO FINISH
CLRF TENS
FINISH
CALL DISPLAY
END
If anyone can help me then you can either reply to the group or direct at m0gmt@yahoo.co.uk
Thanks,
Danny...