Source Code
INCLUDE P16F688.INC
ERRORLEVEL -302 ;Supress the (manual) banking message!
__CONFIG _FCMEN_OFF & _IESO_OFF & _BOD_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
;===============================================================
TIME_S1 EQU 0xA0
TIME_S10 EQU 0xA1
TIME_M1 EQU 0xA2
TIME_M10 EQU 0xA3
TIME_H1 EQU 0xA4
TIME_H10 EQU 0xA5
OLD_S1 EQU 0xB0
OLD_S10 EQU 0xB1
OLD_M1 EQU 0xB2
OLD_M10 EQU 0xB3
OLD_H1 EQU 0xB4
OLD_H10 EQU 0xB5
COUNT EQU 0xC0
CUR_COL EQU 0xC1
TIME_CENT EQU 0xC2
BLUR_PHASE EQU 0xC3
BLUR_STEP EQU 0xC4
FLAG EQU 0x45
;===============================================================
;===============================================================
INT_OFF MACRO
BCF INTCON,GIE
ENDM
INT_ON MACRO
BSF INTCON,GIE
ENDM
INC_SEC MACRO
INCF TIME_S1,F
MOVLW 6
ADDWF TIME_S1,W
BTFSS STATUS,DC
RETURN
CLRF TIME_S1
INCF TIME_S10,F
MOVLW 10
ADDWF TIME_S10,W
BTFSS STATUS,DC
RETURN
CLRF TIME_S10
ENDM
INC_MIN MACRO
INCF TIME_M1,F
MOVLW 6
ADDWF TIME_M1,W
BTFSS STATUS,DC
RETURN
CLRF TIME_M1
INCF TIME_M10,F
MOVLW 10
ADDWF TIME_M10,W
BTFSS STATUS,DC
RETURN
CLRF TIME_M10
ENDM
INC_HR MACRO
INCF TIME_H1,F
MOVLW 6
BTFSC TIME_H10,1
MOVLW 12
ADDWF TIME_H1,W
BTFSS STATUS,DC
RETURN
CLRF TIME_H1
INCF TIME_H10,F
MOVLW 6
ADDWF TIME_H10,W
BTFSS STATUS,DC
RETURN
CLRF TIME_H10
ENDM
;===============================================================
ORG 0x00
GOTO INIT
;===============================================================
ORG 0x04
;Read PORTA to latch the change detector
BANKSEL 0x00
MOVFW PORTA
BANKSEL 0x80
CALL INCTIME
BCF INTCON,RAIF
RETFIE
;===============================================================
INIT
;CLOCK
BANKSEL 0x80
MOVLW B'01110001'
MOVWF OSCCON
INIT_VARIABLES
BANKSEL 0x80
CLRF TIME_S1
CLRF TIME_S10
CLRF TIME_M1
CLRF TIME_M10
CLRF TIME_H1
CLRF TIME_H10
CLRF OLD_S1
CLRF OLD_S10
CLRF OLD_M1
CLRF OLD_M10
CLRF OLD_H1
CLRF OLD_H10
CLRF CUR_COL
MOVLW _BLUR_LENGTH
MOVWF BLUR_PHASE
MOVWF BLUR_STEP
INIT_CMP
; BANKSEL 0x80
CLRF ANSEL ;Disable A/D
BANKSEL 0x00
MOVLW B'00000111' ;Disable CMP
MOVWF CMCON0
INIT_IO
; BANKSEL 0x00
MOVLW B'00110000'
MOVWF PORTC
MOVLW B'00110010'
MOVWF PORTA
BANKSEL 0x80
INIT_INT
;INTERRUPT-ON-CHANGE (PORTA0)
; BANKSEL 0x80
; BSF IOCA,0 ;RA0
; BSF INTCON,RAIE
; BANKSEL 0x00
;===============================================================
MAIN
INT_OFF
BANKSEL 0x00
; MOVLW B'00110000'
; MOVWF PORTC
; MOVLW B'00110010'
; MOVWF PORTA
BANKSEL 0x80
CALL DISP
INT_ON
BANKSEL 0x00
MOVFW PORTA
ANDLW B'00000001'
XORWF FLAG,W
BTFSS STATUS,Z
CALL INCTIME
BANKSEL 0x80
BTFSC CUR_COL,0
CALL TEST_BUTTONS
BANKSEL 0x80
GOTO MAIN
;---------------------------------------------------------------
DISP
MOVLW TIME_S1
MOVWF FSR
MOVFW BLUR_PHASE
SUBWF BLUR_STEP,W
BTFSC STATUS,C
GOTO DISP_SHOW
MOVLW 0x10
ADDWF FSR,F
DISP_SHOW
MOVLW 4
DECF CUR_COL,F
BTFSC CUR_COL,7
MOVWF CUR_COL
MOVF CUR_COL,W
ADDWF PCL,F
GOTO COL0
GOTO COL1
GOTO COL2
GOTO COL3
; GOTO COL4
COL4
BSF COL0_BIT
MOVLW 4
ADDWF FSR,F
COMF INDF,W
IORLW B'11110000'
MOVWF DATA_PORT
BCF COL4_BIT
GOTO DISP_BLUR
RETURN
COL3
BSF COL4_BIT
MOVLW 3
ADDWF FSR,F
COMF INDF,W
IORLW B'11110000'
MOVWF DATA_PORT
MOVLW 2
ADDWF FSR,F
BTFSC INDF,1
BCF DATA_PORT,3
BCF COL3_BIT
GOTO DISP_BLUR
RETURN
COL2
BSF COL3_BIT
MOVLW 2
ADDWF FSR,F
COMF INDF,W
IORLW B'11110000'
MOVWF DATA_PORT
BCF COL2_BIT
GOTO DISP_BLUR
RETURN
COL1
BSF COL2_BIT
INCF FSR,F
COMF INDF,W
IORLW B'11110000'
MOVWF DATA_PORT
MOVLW 4
ADDWF FSR,F
BTFSC INDF,0
BCF DATA_PORT,3
BCF COL1_BIT
GOTO DISP_BLUR
RETURN
COL0
BSF COL1_BIT
COMF INDF,W
IORLW B'11110000'
MOVWF DATA_PORT
BCF COL0_BIT
; RETURN
DISP_BLUR:
;PREPARE BLUR
DECFSZ BLUR_STEP,F
RETURN
MOVLW _BLUR_LENGTH
MOVWF BLUR_STEP
DECFSZ BLUR_PHASE,F
RETURN
;KEEP AT 1
INCF BLUR_PHASE,F
RETURN
;---------------------------------------------------------------
TEST_BUTTONS
;Test if a button is pressed
BANKSEL 0x00
BTFSS BUT_BIT
RETURN
BANKSEL 0x80
;Only handle buttons when millis exceeds 2<<4
BTFSS TIME_CENT,4
RETURN
BTFSC CUR_COL,1
GOTO TEST_BUTTON3
; GOTO TEST_BUTTON1
;TEST_BUTTON1
CLRF TIME_CENT
CLRF TIME_S1
CLRF TIME_S10
INC_MIN
RETURN
TEST_BUTTON3
CLRF TIME_CENT
CLRF TIME_S1
CLRF TIME_S10
INC_HR
RETURN
;---------------------------------------------------------------
INCTIME
XORWF FLAG,F
BANKSEL 0x80
INCF TIME_CENT,F
MOVLW 156
ADDWF TIME_CENT,W
BTFSS STATUS,C
RETURN
CLRF TIME_CENT
;PREPARE BLUR
MOVFW TIME_S1
MOVWF OLD_S1
MOVFW TIME_S10
MOVWF OLD_S10
MOVFW TIME_M1
MOVWF OLD_M1
MOVFW TIME_M10
MOVWF OLD_M10
MOVFW TIME_H1
MOVWF OLD_H1
MOVFW TIME_H10
MOVWF OLD_H10
MOVLW _BLUR_LENGTH
MOVWF BLUR_PHASE
MOVWF BLUR_STEP
INC_SEC
INC_MIN
INC_HR
RETURN
;===============================================================
END
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.