; Source created with Parsic Version 3.x
; at : 01.09.2005 13:33:56
; Project File : Z:\8Bit.PIC
; Project Version : 1.0.8
; Created : 24.07.2001 15:00:00
; Last change : 01.09.2005 13:29:00
PROCESSOR 16F877
INCLUDE P16F877.INC
RADIX DEC
__IDLOCS H'0100'
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_ON & _BODEN_ON & _XT_OSC & _LVP_OFF & _CPD_OFF & _DEBUG_OFF
; Diverses
ZERO EQU Z ; ZERO-Flag
CARRY EQU C ; CARRY-Flag
; Variable
S1 = 32 ; located in Bank 0
TR1 = 33 ; located in Bank 0
TR1_HI = 34 ; located in Bank 0
S7 = 35 ; located in Bank 0
S0 = 36 ; located in Bank 0
S6 = 37 ; located in Bank 0
OS1_FD = 38 ; located in Bank 0
OS2_FD = 39 ; located in Bank 0
OS3_FD = 40 ; located in Bank 0
ZV1 = 41 ; located in Bank 0
ZV1_FD = 42 ; located in Bank 0
Z100 = 43 ; located in Bank 0
S2 = 44 ; located in Bank 0
S4 = 45 ; located in Bank 0
Z10 = 46 ; located in Bank 0
S5 = 47 ; located in Bank 0
Z1 = 48 ; located in Bank 0
S3 = 49 ; located in Bank 0
RAM = 50 ; located in Bank 0
SYS_TMP1 = 115 ; located in Bank 0, 1, 2, 3
SYS_WSAV = 116 ; located in Bank 0, 1, 2, 3
SYS_SSAV = 117 ; located in Bank 0, 1, 2, 3
SYS_PSAV = 118 ; located in Bank 0, 1, 2, 3
SYS_TMP2 = 119 ; located in Bank 0, 1, 2, 3
SYS_TMP3 = 120 ; located in Bank 0, 1, 2, 3
SYS_TMP4 = 121 ; located in Bank 0, 1, 2, 3
ERRORLEVEL -302 ; disable warning (Bankswitching)
ERRORLEVEL -306 ; disable warning (Pageswitching)
;****************************************
;Programmanfang
;****************************************
ORG 0
CLRF STATUS ; switch to RAM-Bank 0
MOVLW HIGH SYS_INIT ; set page
MOVWF PCLATH
GOTO SYS_INIT
;****************************************
;Interrupt-Adress
;****************************************
MOVWF SYS_WSAV ; save register
SWAPF STATUS,W
CLRF STATUS ; bank 0
MOVWF SYS_SSAV
MOVFW PCLATH
MOVWF SYS_PSAV
CLRF PCLATH
BCF INTCON,T0IF ; Interrupt quitieren
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
INCFSZ TR1,F
GOTO SYS_INT_LABEL_0
INCF TR1_HI,F
SYS_INT_LABEL_0
EXITINT
MOVFW SYS_PSAV
MOVWF PCLATH
SWAPF SYS_SSAV,W ; Register zurück
MOVWF STATUS
SWAPF SYS_WSAV,F
SWAPF SYS_WSAV,W
RETFIE ; RETurn From Interrupt and Enable GIE
;****************************************
; Multiplication 8 - Bit
;****************************************
SYSMUL8
CLRF SYS_TMP3
MOVLW 8
MOVWF SYS_TMP4
SYSMUL8_1
MOVFW SYS_TMP1
RRF SYS_TMP2,F
BTFSC STATUS,CARRY
ADDWF SYS_TMP3,F
RLF SYS_TMP1,F
DECFSZ SYS_TMP4,F
GOTO SYSMUL8_1
RETURN
;****************************************
; Division 8 - Bit
;****************************************
SYSDIV8
MOVF SYS_TMP2,F
BTFSC STATUS,ZERO
GOTO SYSDIV8_ERROR
CLRF SYS_TMP3 ; Ergebnis löschen
MOVLW 1
MOVWF SYS_TMP4
SYSDIV8_0
BTFSC SYS_TMP2,7 ; OP2 linksbündig
GOTO SYSDIV8_1
INCF SYS_TMP4,F
BCF STATUS,CARRY
RLF SYS_TMP2,F
GOTO SYSDIV8_0
SYSDIV8_1
MOVFW SYS_TMP2 ; vergleichen
SUBWF SYS_TMP1,F ; F-W -> W
BTFSC STATUS,CARRY
GOTO SYSDIV8_2
ADDWF SYS_TMP1,F ; F+W -> F
BCF STATUS,CARRY
SYSDIV8_2
RLF SYS_TMP3,F
RRF SYS_TMP2,F
DECFSZ SYS_TMP4,F
GOTO SYSDIV8_1
RETURN
SYSDIV8_ERROR
MOVLW 255
MOVWF SYS_TMP3
RETURN
;****************************************
; Subroutines
;****************************************
;****************************************
;Initialisierung
;****************************************
SYS_INIT
MOVLW B'00100000'
MOVWF INTCON
; Ausgangs-Pegel setzen, bevor die Richtung gesetzt wird
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
MOVLW B'00000000'
MOVWF PORTA
MOVLW B'01111111'
MOVWF PORTB
MOVLW B'00000000'
MOVWF PORTC
MOVLW B'00000000'
MOVWF PORTD
MOVLW B'00000000'
MOVWF PORTE
MOVLW 143
BSF STATUS,RP0 ; Bank 1
MOVWF OPTION_REG
MOVLW 6 ; all Digital
MOVWF ADCON1
; Richtung setzen
MOVLW B'11111111'
MOVWF TRISA
MOVLW B'10000000'
MOVWF TRISB
MOVLW B'11111000'
MOVWF TRISC
MOVLW B'11111111'
MOVWF TRISD
MOVLW B'00000111'
MOVWF TRISE
; init vars
; Clear RAM
BCF STATUS,IRP
MOVLW 32
MOVWF FSR
CR1
CLRF INDF
INCF FSR,F
BTFSS FSR,7
GOTO CR1
BSF FSR,5
CR2
CLRF INDF
INCF FSR,F
MOVLW H'F0'
SUBWF FSR,W
BTFSS STATUS,ZERO
GOTO CR2
BSF STATUS,IRP
MOVLW 16
MOVWF FSR
CR3
CLRF INDF
INCF FSR,F
MOVLW H'70'
SUBWF FSR,W
BTFSS STATUS,ZERO
GOTO CR3
MOVLW 144
MOVWF FSR
CR4
CLRF INDF
INCF FSR,F
MOVLW H'F0'
SUBWF FSR,W
BTFSS STATUS,ZERO
GOTO CR4
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
CLRF TMR0
BCF INTCON,T0IF
BSF INTCON,GIE ; Interrupt freigeben
;**********************************
;******* Haupt-Programm ***********
;**********************************
MAIN
CLRWDT
;***************************************************
; Unterprogramm BIN_TO_7SEG aufrufen
;***************************************************
MOVLW HIGH BIN_TO_7SEG ; set page
MOVWF PCLATH
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
MOVFW S0
CALL BIN_TO_7SEG
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
MOVWF S1
BSF INTCON,GIE
BCF PCLATH,3 ; Page 0
BCF PCLATH,4 ; Page 0
;***************************************************
; Timer -> TR1
;***************************************************
MOVLW 0 ; Test auf >=
SUBWF TR1_HI,W ;F-W -> W
BTFSS STATUS,ZERO
GOTO LABEL_TR1_CHECK
MOVLW 8
SUBWF TR1,W ;F-W -> W
LABEL_TR1_CHECK
BTFSS STATUS,CARRY
GOTO LABEL_TR1_ENDE
LABEL_TR1_RESET
MOVLW 0 ; Test auf >=
SUBWF TR1_HI,F ;F-W -> F
MOVLW 8
SUBWF TR1,F ;F-W -> F
BTFSS STATUS,CARRY
DECF TR1_HI,F
LABEL_TR1_SET ; toggel output
BTFSC S7,0
GOTO LABEL_TR1_CLR
BSF S7,0
GOTO LABEL_TR1_ENDE
LABEL_TR1_CLR
BCF S7,0
LABEL_TR1_ENDE
;***************************************************
; Multiplexer -> MX1
;***************************************************
CLRF SYS_TMP1
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
MOVFW ZV1
BTFSS STATUS,ZERO
GOTO LABEL_MX1_CHECKCONTROL1
MOVFW Z1
MOVWF S0
GOTO LABEL_MX1_END
LABEL_MX1_CHECKCONTROL1
INCF SYS_TMP1,F
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
MOVFW ZV1
SUBWF SYS_TMP1,W
BTFSS STATUS,ZERO
GOTO LABEL_MX1_CHECKCONTROL2
MOVFW Z10
MOVWF S0
GOTO LABEL_MX1_END
LABEL_MX1_CHECKCONTROL2
INCF SYS_TMP1,F
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
MOVFW ZV1
SUBWF SYS_TMP1,W
BTFSS STATUS,ZERO
GOTO LABEL_MX1_CHECKCONTROL3
MOVFW Z100
MOVWF S0
GOTO LABEL_MX1_END
LABEL_MX1_CHECKCONTROL3
LABEL_MX1_END
;***************************************************
; UND - Gatter -> UG12
;***************************************************
LABEL_UG12_1
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BTFSC S6,0
GOTO LABEL_UG12_FALSE
LABEL_UG12_2
BTFSC S6,1
GOTO LABEL_UG12_FALSE
LABEL_UG12_3
BTFSS S6,4
GOTO LABEL_UG12_FALSE
LABEL_UG12_TRUE
BSF PORTC,0
GOTO LABEL_UG12_ENDE
LABEL_UG12_FALSE
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BCF PORTC,0
LABEL_UG12_ENDE
;***************************************************
; UND - Gatter -> UG13
;***************************************************
LABEL_UG13_1
BTFSS S6,0
GOTO LABEL_UG13_FALSE
LABEL_UG13_2
BTFSC S6,1
GOTO LABEL_UG13_FALSE
LABEL_UG13_3
BTFSS S6,4
GOTO LABEL_UG13_FALSE
LABEL_UG13_TRUE
BSF PORTC,1
GOTO LABEL_UG13_ENDE
LABEL_UG13_FALSE
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BCF PORTC,1
LABEL_UG13_ENDE
;***************************************************
; UND - Gatter -> UG14
;***************************************************
LABEL_UG14_1
BTFSC S6,0
GOTO LABEL_UG14_FALSE
LABEL_UG14_2
BTFSS S6,1
GOTO LABEL_UG14_FALSE
LABEL_UG14_3
BTFSS S6,4
GOTO LABEL_UG14_FALSE
LABEL_UG14_TRUE
BSF PORTC,2
GOTO LABEL_UG14_ENDE
LABEL_UG14_FALSE
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BCF PORTC,2
LABEL_UG14_ENDE
;***************************************************
; One Shot -> OS1
;***************************************************
BTFSS S7,0
GOTO LABEL_OS1_1
BTFSC OS1_FD,0
GOTO LABEL_OS1_1
BSF OS1_FD,0
BSF S6,5
GOTO LABEL_OS1_2
LABEL_OS1_1
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BCF S6,5
BTFSC S7,0
GOTO LABEL_OS1_2
BCF OS1_FD,0
LABEL_OS1_2
;***************************************************
; One Shot -> OS2
;***************************************************
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BTFSC S6,5
GOTO LABEL_OS2_1
BTFSC OS2_FD,0
GOTO LABEL_OS2_1
BSF OS2_FD,0
BSF S6,6
GOTO LABEL_OS2_2
LABEL_OS2_1
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BCF S6,6
BTFSS S6,5
GOTO LABEL_OS2_2
BCF OS2_FD,0
LABEL_OS2_2
;***************************************************
; One Shot -> OS3
;***************************************************
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BTFSC S6,6
GOTO LABEL_OS3_1
BTFSC OS3_FD,0
GOTO LABEL_OS3_1
BSF OS3_FD,0
BSF S6,7
GOTO LABEL_OS3_2
LABEL_OS3_1
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BCF S6,7
BTFSS S6,6
GOTO LABEL_OS3_2
BCF OS3_FD,0
LABEL_OS3_2
;***************************************************
; RS-FLIP-FLOP -> RS1
;***************************************************
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BTFSC S6,5
GOTO LABEL_RS1_RESET
BTFSS S6,7
GOTO LABEL_RS1_ENDE
BSF S6,4 ; Ausgang setzen
GOTO LABEL_RS1_ENDE
LABEL_RS1_RESET
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BCF S6,4 ; Ausgang zurücksetzen
LABEL_RS1_ENDE
;***************************************************
; Zähler -> ZV1
;***************************************************
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BTFSS S6,2 ; Reset ?
GOTO LABEL_ZV1_COUNT
CLRF ZV1
GOTO LABEL_ZV1_SETOUT
LABEL_ZV1_COUNT
; Test auf negative Flanke
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BTFSC S6,5
GOTO LABEL_ZV1_SETFD
BTFSS ZV1_FD,0
GOTO LABEL_ZV1_SETFD
BCF ZV1_FD,0
BTFSC S6,3 ; Vorwärts oder Rückwärts ?
GOTO LABEL_ZV1_BACKWARD
INCF ZV1,F
GOTO LABEL_ZV1_SETOUT
LABEL_ZV1_BACKWARD
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
DECF ZV1,F
LABEL_ZV1_SETOUT
; Output Q0
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BTFSS ZV1,0
GOTO LABEL_ZV1_SETOUT0
BSF S6,0
GOTO LABEL_ZV1_SETOUT0_END
LABEL_ZV1_SETOUT0
BCF S6,0
LABEL_ZV1_SETOUT0_END
; Output Q1
BTFSS ZV1,1
GOTO LABEL_ZV1_SETOUT1
BSF S6,1
GOTO LABEL_ZV1_SETOUT1_END
LABEL_ZV1_SETOUT1
BCF S6,1
LABEL_ZV1_SETOUT1_END
; Output Q2
BTFSS ZV1,2
GOTO LABEL_ZV1_SETOUT2
BSF S6,2
GOTO LABEL_ZV1_SETOUT2_END
LABEL_ZV1_SETOUT2
BCF S6,2
LABEL_ZV1_SETOUT2_END
LABEL_ZV1_SETFD
; Test auf positive Flanke
BCF STATUS,RP0 ; Bank 0
BCF STATUS,RP1 ; Bank 0
BTFSS S6,5
GOTO LABEL_ZV1_EXIT
BSF ZV1_FD,0
LABEL_ZV1_EXIT
;***************************************************
; Verteiler -> BV1
;***************************************************
BTFSC S1,0
GOTO LABEL_BV1_0
BSF PORTB,0
GOTO LABEL_BV1_0_END
LABEL_BV1_0
BCF PORTB,0
LABEL_BV1_0_END
;**********************************************
BTFSC S1,1
GOTO LABEL_BV1_1
BSF PORTB,1
GOTO LABEL_BV1_1_END
LABEL_BV1_1
BCF PORTB,1
LABEL_BV1_1_END
;**********************************************
BTFSC S1,2
GOTO LABEL_BV1_2
BSF PORTB,2
GOTO LABEL_BV1_2_END
LABEL_BV1_2
BCF PORTB,2
LABEL_BV1_2_END
;**********************************************
BTFSC S1,3
GOTO LABEL_BV1_3
BSF PORTB,3
GOTO LABEL_BV1_3_END
LABEL_BV1_3
BCF PORTB,3
LABEL_BV1_3_END
;**********************************************
BTFSC S1,4
GOTO LABEL_BV1_4
BSF PORTB,4
GOTO LABEL_BV1_4_END
LABEL_BV1_4
BCF PORTB,4
LABEL_BV1_4_END
;**********************************************
BTFSC S1,5
GOTO LABEL_BV1_5
BSF PORTB,5
GOTO LABEL_BV1_5_END
LABEL_BV1_5
BCF PORTB,5
LABEL_BV1_5_END
;**********************************************
BTFSC S1,6
GOTO LABEL_BV1_6
BSF PORTB,6
GOTO LABEL_BV1_6_END
LABEL_BV1_6
BCF PORTB,6
LABEL_BV1_6_END
;**********************************************
;***************************************************
; GND
;***************************************************
BCF S6,3 ; immer Low
;***************************************************
;AF1
;***************************************************
MOVFW S3
MOVWF SYS_TMP1
MOVLW 100
MOVWF SYS_TMP2
MOVLW HIGH SYSDIV8
MOVWF PCLATH
CALL SYSDIV8
MOVLW HIGH LABEL_AF1
MOVWF PCLATH
LABEL_AF1
MOVFW SYS_TMP3
MOVWF Z100
LABEL_AF1_EXIT
;***************************************************
;AF2
;***************************************************
MOVFW Z100
MOVWF SYS_TMP1
MOVLW 100
MOVWF SYS_TMP2
MOVLW HIGH SYSMUL8
MOVWF PCLATH
CALL SYSMUL8
MOVLW HIGH LABEL_AF2
MOVWF PCLATH
LABEL_AF2
MOVFW SYS_TMP3
MOVWF S2
LABEL_AF2_EXIT
;***************************************************
;AF3
;***************************************************
MOVFW S2
SUBWF S3,W ; F - W -> W
MOVWF S4
LABEL_AF3_EXIT
;***************************************************
;AF4
;***************************************************
MOVFW S4
MOVWF SYS_TMP1
MOVLW 10
MOVWF SYS_TMP2
MOVLW HIGH SYSDIV8
MOVWF PCLATH
CALL SYSDIV8
MOVLW HIGH LABEL_AF4
MOVWF PCLATH
LABEL_AF4
MOVFW SYS_TMP3
MOVWF Z10
LABEL_AF4_EXIT
;***************************************************
;AF5
;***************************************************
MOVFW Z10
MOVWF SYS_TMP1
MOVLW 10
MOVWF SYS_TMP2
MOVLW HIGH SYSMUL8
MOVWF PCLATH
CALL SYSMUL8
MOVLW HIGH LABEL_AF5
MOVWF PCLATH
LABEL_AF5
MOVFW SYS_TMP3
MOVWF S5
LABEL_AF5_EXIT
;***************************************************
;AF6
;***************************************************
MOVFW S5
SUBWF S4,W ; F - W -> W
MOVWF Z1
LABEL_AF6_EXIT
;***************************************************
; Verteiler -> BV2
;***************************************************
MOVLW 0
BTFSC PORTA,0 ; IN0
IORLW 1
BTFSC PORTA,1 ; IN1
IORLW 2
BTFSC PORTA,2 ; IN2
IORLW 4
BTFSC PORTA,3 ; IN3
IORLW 8
BTFSC PORTA,4 ; IN4
IORLW 16
BTFSC PORTA,5 ; IN5
IORLW 32
BTFSC PORTE,0 ; IN6
IORLW 64
BTFSC PORTE,1 ; IN7
IORLW 128
MOVWF S3 ; OUT
;****************************************
GOTO MAIN
ORG 8175
;***************************************************
; Table -> BIN_TO_7SEG
;***************************************************
BIN_TO_7SEG
MOVWF SYS_TMP1
MOVLW HIGH BIN_TO_7SEG_WERTE
MOVWF PCLATH
MOVFW SYS_TMP1
BCF INTCON,GIE
ADDWF PCL,F
BIN_TO_7SEG_WERTE
RETLW 63 ; // INDEX 0
RETLW 6 ; // INDEX 1
RETLW 91 ; // INDEX 2
RETLW 79 ; // INDEX 3
RETLW 102 ; // INDEX 4
RETLW 109 ; // INDEX 5
RETLW 125 ; // INDEX 6
RETLW 7 ; // INDEX 7
RETLW 127 ; // INDEX 8
RETLW 111 ; // INDEX 9
RETLW 63 ; // INDEX 10
END