Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
list p=16f628 ; list directive to define processor
#include <p16f628.inc> ; processor specific variable definitions
; errorlevel -302 ;hide banking message
;*****
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF
;*****
;internal osc settings
;*****
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
Count1 EQU 0X72 ; First Counter for Delay Loops
Count2 EQU 0X73 ; Second Counter for Delay Loops
;**********************************************************************
ORG 0x000 ; processor reset vector
goto Start ; go to beginning of program
;*****
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;*****
Start
clrf PORTA
clrf PORTB
MOVLW B'00000111'
MOVWF CMCON ; Turn off comparator
bsf STATUS,RP0 ; bank one
movlw 0xFF
movwf TRISA ; porta all Input
movlw 0x00
movwf TRISB ; portb all Output
bcf STATUS,RP0 ; return to bank 0
;*****
movlw b'00000000' ;See datasheet for prefered
movwf OPTION_REG ;settings of OPTION_REG
bsf PORTB,7 ; Turn on Power LED
btfss PORTA,0 ; Check if Upper Sensor = 1
Goto Prestart ; If not go to prestart subroutine
bsf PORTB,6
Goto RUN
;*****
Prestart
bsf PORTB,5 ; Turn on Warning LED
bsf PORTB,4 ; Turn on Refill LED
bsf PORTB,3 ; Turn On Relay Sub-Circuit
btfsc PORTA,0 ; If Upper Sensor = 1
Goto Run ; Go to Operation Mode
Run
btfss PORTA,0 ; If Upper Sensor = 0
bsf PORTB,5 ; Then turn on Warning LED
btfss PORTA,1 ; If Lower Sensor = 0
call Refill ; Go To Refill Subroutine
decfsz Count1,1 ; Decrement Counter
goto Run
Refill
bsf PORTB,4 ; Turn on Refill LED
bsf PORTB,3 ; Turn on Refill Sub-Circuit
btfsc PORTA,0 ; If Upper Sensor = 1
bcf PORTB,3 ; Turn Off Refill Sub-Circuit
btfsc PORTA,0 ; If Upper Sensor = 1
bcf PORTB,4 ; Turn off Refill LED
btfsc PORTA,0 ; If Upper Sensor = 1
bcf PORTB,5 ; Turn off Warning LED
goto Run
;*****
END
Firstly you have to set up your program with a Main routine where the micro accesses one of the displays and then accesses the other display to produce a 0-99 display.
Uhhh I think you need a coffee colin he's just playing with 3-4 led's. What is this talk about 7 segment displays?
Mike
list p=16f628 ; list directive to define processor
#include <p16f628.inc> ; processor specific variable definitions
errorlevel -302 ;hide banking message
;*****
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF
;*****
;internal osc settings
;*****
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
Count1 EQU 0X20 ; First Counter for Delay
Count2 EQU 0X21 ; Second Counter for Delay
Count3 EQU 0X22 ; Third Counter for Delay
;**********************************************************************
ORG 0x000 ; processor reset vector
goto Start ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
Start
clrf PORTA
clrf PORTB
MOVLW B'00000111'
MOVWF CMCON ; Turn off comparator
bsf STATUS,RP0 ; bank one
movlw 0xFF
movwf TRISA ; porta all Input
movlw 0x00
movwf TRISB ; portb all Output
bcf STATUS,RP0 ; return to bank 0
movlw b'00000000' ;See datasheet for prefered
movwf OPTION_REG ;settings of OPTION_REG
bsf PORTB,7 ; Turn on Power LED
btfss PORTA,0 ; Check if Upper Sensor = 1
Call Prestart ; If not go to prestart subroutine
bsf PORTB,6 ; Turn on Operation LED
Goto Run
Prestart
movlw b'00011101'
btfss PORTA,0
movlw b'00000001'
movwf TRISB
btfss PORTA,0
movlw b'0000001'
movwf PORTB
btfsc PORTA,0 ; If Upper Sensor = 1
Return ; Return to Startup Section
goto Prestart
Run
btfss PORTA,0 ; If Upper Sensor = 0
bsf PORTB,5 ; Then turn on Warning LED
btfsc PORTA,0 ; If Upper Sensor = 0
decfsz Count1,1 ; Don't Decrement Counter 1
btfss PORTA,1 ; If Lower Sensor = 0
Call Refill ; Go To Refill Subroutine
goto Run
Refill
movlw b'00011101'
btfsc PORTA,0
movlw b'00000011'
movfw PORTB
btfss PORTA,0
goto Refill
btfsc PORTA,0
Return
END
list p=16f628 ; list directive to define processor
#include <p16f628.inc> ; processor specific variable definitions
errorlevel -302 ;hide banking message
;*****
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF
;*****
;internal osc settings
;*****
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
Count1 EQU 0X20 ; First Counter for Delay
Count2 EQU 0X21 ; Second Counter for Delay
Count3 EQU 0X22 ; Third Counter for Delay
;**********************************************************************
ORG 0x000 ; processor reset vector
goto Start ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
Start
clrf PORTA
clrf PORTB
MOVLW B'00000111'
MOVWF CMCON ; Turn off comparator
bsf STATUS,RP0 ; bank one
movlw 0xFF
movwf TRISA ; porta all Input
movlw 0x00
movwf TRISB ; portb all Output
bcf STATUS,RP0 ; return to bank 0
movlw b'00000000' ;See datasheet for prefered
movwf OPTION_REG ;settings of OPTION_REG
btfss PORTA,0 ; Check if Upper Sensor = 1
Call Prestart ; If not go to Prestart Subroutine
Goto Run ; Then go to Operation Mode
Prestart
movlw b'10111000' ; Set Refill Mode
btfsc PORTA,0 ; Check If Upper Sensor = 1
movlw b'11000000' ; Then Set Operation Mode
movwf PORTB ; Move to PORTB
btfss PORTA,0 ; Check If Upper Sensor = 1
goto Prestart ; If Not Return to Top of subroutine
Return ; Return to Start
Run
movlw b'11000000' ; Set Operation Mode
btfss PORTA,0 ; Check if Upper Sensor = 1
movlw b'11100000' ; Set Warning Mode
movwf PORTB ; Move to PortB
btfss PORTA,1 ; Check If Lower Sensor = 1
Call Refill ; Go to Refill Subroutine
Goto Run ; Return to Top
Refill
movlw b'10111000' ; Set Refill Mode
btfsc PORTA,0 ; Check If Upper Sensor = 1
movlw b'11000000' ; Then Set Operation Mode
movwf PORTB ; Move to PORTB
btfss PORTA,0 ; Check If Upper Sensor = 1
goto Refill ; If Not Return to Top of subroutine
Return ; Return to Start
END
Start
clrf PORTA
clrf PORTB
MOVLW B'00000111'
MOVWF CMCON ; Turn off comparator
bsf STATUS,RP0 ; bank one
movlw 0xFF
movwf TRISA ; porta all Input
movlw 0x00
movwf TRISB ; portb all Output
movlw b'00000000' ;See datasheet for prefered
movwf OPTION_REG ;settings of OPTION_REG
bcf STATUS,RP0 ; return to bank 0
btfss PORTA,0 ; Check if Upper Sensor = 1
Call Prestart ; If not go to Prestart Subroutine
Goto Run ; Then go to Operation Mode
list p=16f628 ; list directive to define processor
#include <p16f628.inc> ; processor specific variable definitions
errorlevel -302 ;hide banking message
;*****
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF
;*****
;internal osc settings
;*****
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
Count1 EQU 0X20 ; First Counter for Delay
;**********************************************************************
ORG 0x000 ; processor reset vector
goto Start ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
Start
clrf PORTA
clrf PORTB
MOVLW B'00000111'
MOVWF CMCON ; Turn off comparator
bsf STATUS,RP0 ; bank one
movlw 0xFF
movwf TRISA ; porta all Input
movlw 0x00
movwf TRISB ; portb all Output
movlw b'00000000' ;See datasheet for prefered
movwf OPTION_REG ;settings of OPTION_REG
bcf STATUS,RP0 ; return to bank 0
call Systest
btfss PORTA,0 ; Check if Upper Sensor = 1
Call Refill ; If not go to Refill Subroutine
Goto Run ; Then go to Operation Mode
Systest
movlw b'10000000' ; Set PortB,7 High the others Low
movwf PORTB
movlw 0x05 ; Set Count1 to 05H
movwf Count1
call Delay ; Call Delay Subroutine
movlw b'01000000' ; Set PortB,6 High the others Low
movwf PORTB
movlw 0x05 ;Reset Counter1 to 05H
movwf Count1
call Delay ;Call Delay Subroutine
movlw b'00100000' ; Set PortB,5 High the others Low
movwf PORTB
movlw 0x05 ;Reset Counter1 to 05H
movwf Count1
call Delay ; Call Delay Subroutine
movlw b'00010000' ; Set PortB,4 High the others Low
movwf PORTB
movlw 0x05 ; Reset Counter to 05H
movwf Count1
Call Delay ; Call Delay Subroutine
movlw b'11110000' ; Set All Indicators High
movwf PORTB
movlw 0x05 ; Last Counter Reset to 05H
movwf Count1
call Delay ; Call Delay Subroutine
movlw b'10000000' ; Turn on Power LED
movwf PORTB
RETURN ;Return to main program
Run
movlw b'11000000' ; Set Operation Mode
btfss PORTA,0 ; Check if Upper Sensor = 1
movlw b'11100000' ; Set Warning Mode
movwf PORTB ; Move to PortB
btfss PORTA,1 ; Check If Lower Sensor = 1
Call Refill ; Go to Refill Subroutine
Goto Run ; Return to Top
Refill
movlw b'10111000' ; Set Refill Mode
btfsc PORTA,0 ; Check If Upper Sensor = 1
movlw b'11000000' ; Then Set Operation Mode
movwf PORTB ; Move to PORTB
btfss PORTA,0 ; Check If Upper Sensor = 1
goto Refill ; If Not Return to Top of subroutine
Return ; Return to Start
Delay
decfsz Count1,1 ;Decrement Count1 1
goto Delay ;If Count1 > 0 Return to top
Return ;Return to Previous place
END
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
Count1 EQU 0X20 ; counter
Count1v EQU 0X21 ; will be value for counter
;*************************************
Delay:
movf Count1v,w ;Copies preset delay to working register
movwf Count1 ;Copies delay to Count1 to save code space
Delay1:
decfsz Count1,1 ;Decrement Count1 1
goto Delay1 ;If Count1 > 0 Return to top
Return ;Return to Previous place
list p=16f628 ; list directive to define processor
#include <p16f628.inc> ; processor specific variable definitions
errorlevel -302 ;hide banking message
;*****
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF
;*****
;internal osc settings
;*****
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
Count1 EQU 0X20 ; First Counter for Delay
Count1v EQU 0X21 ; Second Counter for Delay
;**********************************************************************
ORG 0x000 ; processor reset vector
goto Start ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
Start
clrf PORTA
clrf PORTB
MOVLW B'00000111'
MOVWF CMCON ; Turn off comparator
bsf STATUS,RP0 ; bank one
movlw 0xFF
movwf TRISA ; porta all Input
movlw 0x00
movwf TRISB ; portb all Output
movlw b'00000000' ;See datasheet for prefered
movwf OPTION_REG ;settings of OPTION_REG
bcf STATUS,RP0 ; return to bank 0
call Systest
btfss PORTA,0 ; Check if Upper Sensor = 1
Call Refill ; If not go to Refill Subroutine
Goto Run ; Then go to Operation Mode
Systest
movlw 0x05
movwf Count1v ; Set Delay Counter to 05H
call Delay ; Call Delay Routine to set Delay time
movlw b'10000000' ; Set PortB,7 High the others Low
movwf PORTB
call Delay1 ; Call Delay Subroutine
call Delay ; Call Delay Routine to set Delay time
movlw b'01000000' ; Set PortB,6 High the others Low
movwf PORTB
call Delay1 ;Call Delay Subroutine
call Delay ; Call Delay Routine to set Delay time
movlw b'00100000' ; Set PortB,5 High the others Low
movwf PORTB
call Delay ; Call Delay Routine to set Delay time
call Delay1 ; Call Delay Subroutine
movlw b'00010000' ; Set PortB,4 High the others Low
movwf PORTB
call Delay ; Call Delay Routine to set Delay time
Call Delay1 ; Call Delay Subroutine
movlw b'11110000' ; Set All Indicators High
movwf PORTB
call Delay ; Call Delay Routine to set Delay time
call Delay1 ; Call Delay Subroutine
movlw b'10000000' ; Turn on Power LED
movwf PORTB
RETURN ;Return to main program
Run
movlw b'11000000' ; Set Operation Mode
btfss PORTA,0 ; Check if Upper Sensor = 1
movlw b'11100000' ; Set Warning Mode
movwf PORTB ; Move to PortB
btfss PORTA,1 ; Check If Lower Sensor = 1
Call Refill ; Go to Refill Subroutine
Goto Run ; Return to Top
Refill
movlw b'10111000' ; Set Refill Mode
btfsc PORTA,0 ; Check If Upper Sensor = 1
movlw b'11000000' ; Then Set Operation Mode
movwf PORTB ; Move to PORTB
movlw 0x62 ; Set W Register to 62H
movwf Count1 ; Move W Register to Count1
btfsc PORTA,1 ; Check If Lower Sensor = 1
call Delay1 ; Then Go To Delay Subroutine
btfss PORTA,0 ; Check If Upper Sensor = 1
goto Refill ; If Not Return to Top of subroutine
Return ; Return to Start
Delay:
movfw Count1v ;Copies preset delay to working register
movwf Count1 ;Copies delay to Count1 to save code space
Return
Delay1:
decfsz Count1,1 ;Decrement Count1 1
goto Delay1 ;If Count1 > 0 Return to top
Return ;Return to Previous place
END