whatareyoulookingat
whatareyoulookingat

Reputation: 1

PIC Programming Help. Creating a counter but I have some errors in my code

I am attempting to create a simple counter on a PIC16F628A board that will have two inputs, one to increase value, one to decrease and the values will be displayed on a 7 segment display, after I have completed this part I would eventually like to be able to implement this on a second 7-segment display and use it as an electronic lock, so any further advice would be appreciated. I have written my code but when I attempt to compile I get these error codes: Counter.asm:32:Error[116] Address label duplicated or different in second pass: "CMCON"

    LIST    P=16f628A, R=Dec
__FUSES _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON
include "P16f628A.inc"

CBLOCK  0x20
    W_TEMP
    STATUS_TEMP
    COUNTER
    FLAGS
    FILTR1
    FILTR2
ENDC




#DEFINE ST_BT1  FLAGS,0 
#DEFINE ST_BT2  FLAGS,1




MIN     EQU .0 ;minimum counter value
MAX     EQU .15 ;maximum counter value
T_FILTR EQU .255    






CMCON   
    movlw 0x07
    movwf CMCON





;reset
ORG 0x00
GOTO    start







ORG 0x04
CLRF    INTCON
RETURN







DISP7
    MOVF    COUNTER,W
   ANDLW    B'0001111'

   ADDWF    PCL,F

;
    RETLW   b'11101110' ;digit 0
    RETLW   b'00101000' ;digit 1
    RETLW   b'11001101' ;digit 2
    RETLW   b'01101101' ;digit 3
    RETLW   b'00101011' ;digit 4
    RETLW   b'01100111' ;digit 5
    RETLW   b'11100111' ;digit 6
    RETLW   b'00101100' ;digit 7
    RETLW   b'11101111' ;digit 8
    RETLW   b'00101111' ;digit 9
    RETLW   b'10101111' ;A
    RETLW   b'11100011' ;B
    RETLW   b'11000110' ;C
    RETLW   b'11101001' ;D
    RETLW   b'11000111' ;E
    RETLW   b'10000111' ;F





start       
    BCF     STATUS,RP0
MOVLW   B'00000111'
MOVWF   CMCON   

BSF     STATUS,RP0
MOVLW   B'00000110'
MOVWF   TRISA

MOVLW   B'00000000'
MOVWF   TRISB
MOVLW   B'10000000'
MOVWF   OPTION_REG


MOVLW   B'00000000'
MOVWF   INTCON
BCF     STATUS,RP0





CLRF    PORTA
CLRF    PORTB
CLRF    FLAGS
MOVLW   MIN
MOVWF   COUNTER
GOTO    DISPUP




MAIN
    MOVLW   T_FILTR
    MOVWF   FILTR1
    MOVWF   FILTR2

CHECK_BUTTON1
    BTFSC   PORTA,1 ;is button 1 pressed
    GOTO    BUTTON1_RELEASED
                ;yes
    DECFSZ  FILTR1,F

    GOTO    CHECK_BUTTON1

    BTFSS   ST_BT1
    GOTO    DEC
    GOTO    CHECK_BUTTON2

BUTTON1_RELEASED
    BCF     ST_BT1

CHECK_BUTTON2
    BTFSC   PORTA,2
    GOTO    BUTTON2_RELEASED

    DECFSZ  FILTR2,F

    GOTO    CHECK_BUTTON2

    BTFSS   ST_BT2
    GOTO    INC
    GOTO    MAIN

BUTTON2_RELEASED
    BCF ST_BT2
    GOTO    MAIN

DEC
    BSF ST_BT1
    MOVF    COUNTER,W
    XORLW   MIN


    BTFSC   STATUS,Z
    GOTO    MAIN

    DECF    COUNTER,F
    GOTO    DISPUP

INC
    BSF ST_BT2
    MOVF    COUNTER,W
    XORLW   MAX


    BTFSC   STATUS,Z
    GOTO    MAIN

    INCF    COUNTER,F
    GOTO    DISPUP

DISPUP
    CALL    DISP7

    MOVWF   PORTB


    GOTO    MAIN



    END

Upvotes: 0

Views: 467

Answers (1)

jolati
jolati

Reputation: 700

The register label CMCON is already defined in the header file p16f628A.inc as EQU H'001F'. Since you set that register to 7 in the first lines of start just remove the offending 3 lines:

CMCON   
   movlw 0x07
   movwf CMCON

Upvotes: 1

Related Questions