Hello, I just want to ask how to set the limit of this up down counter to something I desired(e.g 0-150 instead of 0-999)
I do not own the code but simply using it to understand how it works for future works. I am using Proteus to simulate and test the program
Program Code:
Mod edit: code tags
I do not own the code but simply using it to understand how it works for future works. I am using Proteus to simulate and test the program
Program Code:
Code:
Start:
LSB EQU H'0021'
MSB EQU H'0022'
NUM1 EQU H'0023'
NUM2 EQU H'0024'
NUM3 EQU H'0025'
NUM4 EQU H'0026'
NUM5 EQU H'0027'
VALUE EQU H'0028'
ONE EQU H'0029' ; Counter value - 3 digits unpacked BCD
TENS EQU H'002A'
HUNDRED EQU H'002B'
FIGURE EQU H'002D'
FIGURE1 EQU H'002E'
TEMP EQU H'002F'
;-------------------------- PROGRAM STARTS -------------------
LED:
CLRF MSB
CLRF LSB
BSF STATUS,5
MOVLW B'11110000'
MOVWF TRISA
MOVLW B'10000000'
MOVWF TRISB
BCF STATUS,5
CLRF PORTB
CLRF PORTA
CLRF ONE
CLRF TENS
CLRF HUNDRED
CLRF NUM1
CLRF NUM2
CLRF NUM1
CLRF NUM4
GOTO MAIN
;--------------- INCREMENT COUNTER -------
ADD:
INCF ONE,F
MOVLW .10
SUBWF ONE,W
BTFSS STATUS,Z
GOTO LCDB
CLRF ONE
INCF TENS,F
MOVLW .10
SUBWF TENS,W
BTFSS STATUS,Z
GOTO LCDB
CLRF TENS
INCF HUNDRED,F
MOVLW .10
SUBWF HUNDRED,W
BTFSS STATUS,Z
GOTO LCDB
CLRF HUNDRED
LCDB: ; Display incremented result
CALL SCREEN
BTFSS PORTB,7
GOTO LCDB
GOTO MAIN
;--------------- DECREMENT COUNTER ---------
COVER:
MOVLW .1
SUBWF ONE,F
BTFSC STATUS,C
GOTO LCDA
CLRF ONE
MOVLW .1
SUBWF TENS,F
BTFSC STATUS,C
GOTO ONE9
CLRF TENS
MOVLW .1
SUBWF HUNDRED,F
BTFSC STATUS,C
GOTO TENS9
CLRF HUNDRED
MOVLW .1
HUNDRED9:
MOVLW .9
MOVWF HUNDRED
TENS9:
MOVLW .9
MOVWF TENS
ONE9:
MOVLW .9
MOVWF ONE
LCDA: ; Display decremented result
CALL SCREEN
BTFSS PORTA,4
GOTO LCDA
GOTO MAIN
;--------------- MAIN LOOP ---------------
MAIN:
CALL SCREEN
BTFSS PORTA,4
GOTO COVER
BTFSS PORTB,7
GOTO ADD
GOTO MAIN
;------------------ DISPLAY COUNTER VALUE ------------------
SCREEN:
MOVLW .5 ;refresh all four
MOVWF FIGURE ;digits five times
CLRF PORTB ;active high segments off
MOVLW .255 ;selects active low digit
MOVWF PORTA ;lines off
SHOW:
BCF PORTA,0 ;select 4th digit(RA0)
BSF PORTA,1 ;''
BSF PORTA,2 ;''
BSF PORTA,3 ;''
;---------------------------
;FOR ONES DIGIT
MOVF ONE,W ;ONES, 0...9
CALL TABLE ;get segment data
MOVWF PORTB ;display new digit
CALL DELAY ;delay 850-uS
CALL DELAY ;delay 850-uS
CLRF PORTB ;Blank or clear the display
BSF PORTA,0 ;select the 3rd digit (RA1)
BCF PORTA,1 ; ''
BSF PORTA,2 ; ''
BSF PORTA,3 ; ''
;---------------------
;FOR TENS DIGIT
MOVF TENS,W ;TENS 0...9
CALL TABLE ;get segment data
MOVWF PORTB ;display new digit
CALL DELAY ;delay 850-uS
CLRF PORTB ;clear the display
BSF PORTA,0 ;select the second digit (RA2)
BSF PORTA,1 ; ''
BCF PORTA,2 ; ''
BSF PORTA,3 ; ''
;-------------------------
;THIS IS FOR THE HUNDREDS DIGIT
MOVF HUNDRED,W ;HUNDREDS 0...9
CALL TABLE ;get segment data
MOVWF PORTB ;display new digit
CALL DELAY ;delay 850-uS
CLRF PORTB ;clear the display
BSF PORTA,0 ;select the second digit (RA3)
BSF PORTA,1 ; ''
BSF PORTA,2 ; ''
BCF PORTA,3 ; ''
RETURN
;-----------------------
;This is our delay function with a fix time of 850-uS(microseconds)
DELAY
MOVLW .5
MOVWF MSB
D11
MOVLW .55
MOVWF LSB
D22
DECFSZ LSB,F
GOTO D22
DECFSZ MSB,F
GOTO D11
RETURN
;-------------------
TABLE
ADDWF PCL,F
RETLW h'3F'
RETLW h'06'
RETLW h'5B'
RETLW h'4F'
RETLW h'66'
RETLW h'6D'
RETLW h'7D'
RETLW h'07'
RETLW h'7F'
RETLW h'6F'
RETLW h'77'
RETLW h'7C'
RETLW h'39'
RETLW h'5E'
RETLW h'79'
RETLW h'71'
RETLW h'80'
;-------------------------------------------------------------------
END
Attachments
-
21.3 KB Views: 26
Last edited by a moderator: