;Clock Program ;PIC Registers INDR .EQU 0 PCL .EQU 2 STATUS .EQU 3 ;Used for Zero bit FSR .EQU 4 PORTA .EQU 5 PORTB .EQU 6 PCLATH .EQU $0A ;PIC Bits W .EQU 0 F .EQU 1 ZERO .EQU 2 ;Project Registers HRTWO .EQU 16 ;Count 0 - 2. Updated every 10 Hours. Left hand display digit. HRTEN .EQU 17 ;Count 0 - 9. Updated every Hour. Second display digit. MINSIX .EQU 18 ;Count 0 - 5. Updated every 10 Minutes. Third display digit. MINTEN .EQU 19 ;Count 0 - 9. Updated every Minute. Fourth display digit. LETU .EQU 20 ;Letter U. Fifth display digit. LETT .EQU 21 ;Letter T. Sixth display digit. LETC .EQU 22 ;Letter C. Seventh display digit. BLANK .EQU 23 ;Unused eighth display digit. COUNT .EQU 24 ;Count 0 - 200. Updated every 5mS CNT2 .EQU 25 ;Count 0 - 5. Updated every 1mS SECS .EQU 26 ;Count 0 - 59. Updated every 1mS HOURS .EQU 27 ;Count 0 - 23. Updated every Hour CHAR .EQU 28 ;Display Digit 0-7 DIGIT .EQU 29 ;PortA Count (0-28 in 4's) DELAY .EQU 30 ;Delay Count ;Project Bits ;START!!! .ORG 5 ;Initialise BSF STATUS, 5 ; MOVLW 03 MOVWF PORTA ;PORTA = Bits 2-5 = Output, 0-1 = Input CLRF PORTB ;PORTB = Output BCF STATUS, 5 ; CLRF PCLATH CLRF CHAR CLRF DIGIT CLRF COUNT CLRF CNT2 CLRF SECS MOVLW 0 MOVWF MINTEN MOVLW 0 MOVWF MINSIX MOVLW 2 MOVWF HRTEN MOVLW 1 MOVWF HRTWO MOVLW 12 MOVWF HOURS MOVLW $0A MOVWF LETU MOVLW $0B MOVWF LETT MOVLW $0C MOVWF LETC ;Update Display TICK MOVLW 255 MOVWF PORTB ;Clear Display MOVF DIGIT, W ;Update PortA ADDLW 4 ANDLW 28 MOVWF DIGIT MOVWF PORTA INCF CHAR, W ;Update character ANDLW 7 MOVWF CHAR ADDLW 16 MOVWF FSR MOVF INDR, W ;Get char ANDLW 15 CALL TABLE ;Returns with display in W MOVWF PORTB MOVLW 201 MOVWF DELAY LOOP1 DECFSZ DELAY, F GOTO LOOP1 MOVLW 121 MOVWF DELAY LOOP2 DECFSZ DELAY, F GOTO LOOP2 NOP ;Each NOP adds 1 second per 1000. NOP INCF CNT2, F ;End of 1mS loop MOVF CNT2, W SUBLW 5 BTFSS STATUS, ZERO ;5mS? GOTO TICK ;No CLRF CNT2 ;Yes NOP ;Each NOP adds 1 second per 5000. INCF COUNT, F ;End of 5mS loop MOVF COUNT, W SUBLW 200 BTFSS STATUS, ZERO ;One Second? GOTO TICK ;No CLRF COUNT ;Yes NOP ;Each NOP adds 1 second per 1,000,000. BTFSS PORTA, 0 GOTO INCMIN BTFSS PORTA, 1 GOTO INCHR INCF SECS, F ;End of 1 Second loop MOVF SECS, W SUBLW 60 BTFSS STATUS, ZERO ;One Minute? GOTO TICK ;No CLRF SECS ;Yes NOP ;Each NOP adds 1 second per 60,000,000. INCMIN INCF MINTEN, F ;End of 1 Minute loop MOVF MINTEN, W SUBLW 10 BTFSS STATUS, ZERO ;Ten Minutes? GOTO TICK ;No CLRF MINTEN ;Yes INCF MINSIX, F ;End of 10 Minute loop MOVF MINSIX, W SUBLW 6 BTFSS STATUS, ZERO ;One Hour? GOTO TICK ;No CLRF MINSIX ;Yes INCHR INCF HOURS, F ;End of 1 Hour loop INCF HRTEN, F MOVF HRTEN, W SUBLW 10 BTFSS STATUS, ZERO ;Ten Hours? GOTO H1 ;No CLRF HRTEN ;Yes INCF HRTWO, F ;End of 10 Hour loop GOTO TICK H1 MOVF HOURS, W SUBLW 24 BTFSS STATUS, ZERO ;24 Hours? GOTO TICK ;No CLRF HOURS CLRF HRTEN CLRF HRTWO GOTO TICK TABLE: ADDWF PCL, F RETLW 01 ;Zero RETLW 87 ;One RETLW 34 ;Two RETLW 18 ;Three RETLW 84 ;Four RETLW 24 ;Five RETLW 08 ;Six RETLW 83 ;Seven RETLW 00 ;Eight RETLW 80 ;Nine RETLW 15 ;10 = "U" RETLW 44 ;11 = "T" RETLW 46 ;12 = "C" RETLW 255 ;13 RETLW 255 ;14 RETLW 255 ;15 RETLW 255 ;16 .END