list p=16f73 ;****************************************************************************** ; Pinbelegung: ; ; PortA: ; 0 Relais ; 1 ; 2 ; 3 ; 4 ; 5 ; ; PortB: ; 0 ; 1 Q2 ; 2 Dezimalpunkt ; 3 ; 4 A ; 5 D ; 6 C ; 7 B ; ; PortC: ; 0 Links ; 1 Runter ; 2 Okay ; 3 Hoch ; 4 Rechts ; 5 Q1 ; 6 Q4 ; 7 Q3 ; ; ;****************************************************************************** ; ; Einstellbarer Counter für Belichtungsgerät ; ; Moritz Klein ; ; August 2010 ; ;****************************************************************************** ; #include "p16f73.inc" ; Include-Dateien Laden ; __CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC ; über 3,5 MHz ; ;****************************************************************************** loops equ 0x20 ; Zähler für Warteschleife loops2 equ 0x21 ; Zähler für Warteschleife w_temp equ 0x22 ; Backup Akkuregister (W-Register) status_temp equ 0x23 ; Backup Statusregister pclath_temp equ 0x24 ziffer1 equ 0x25 ziffer2 equ 0x26 ziffer3 equ 0x27 ziffer4 equ 0x28 Digit equ 0x29 ar equ 0x2A Zahl equ 0x2B Timer2 equ 0x2C STARTEN equ 0x2D ZZZZ equ 0x2E org 0x00 goto INIT org 0x04 intvec bcf INTCON, GIE ; disable Interupt movwf w_temp swapf STATUS, W clrf STATUS movwf status_temp movfw PCLATH movwf pclath_temp clrf PCLATH movlw D'131' ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz) movwf TMR0 Int_serv bcf PORTC, 5 ; Ziffer 1 aus bcf PORTB, 1 ; Ziffer 2 aus bcf PORTC, 7 ; Ziffer 3 aus bcf PORTC, 6 ; Ziffer 4 aus decf Digit,f ; Ziffernzähler verringern btfsc STATUS, Z goto Int_0 ; Z-Flag=1 ergo Digit=0 movfw Digit movwf ar decf ar, f btfsc STATUS, Z goto Int_1 ; Digit=1 (Ziffer 1) decf ar, f btfsc STATUS, Z goto Int_2 ; Digit=2 (Ziffer 2) decf ar, f btfsc STATUS, Z goto Int_3 ; Digit=3 (Ziffer 3) goto Int_4 ; Digit=4 (Ziffer 4) Int_0 movlw 5 movwf Digit btfss STARTEN, 0 goto Int_end decf Timer2, f ; von 32 bis 0 zählen btfss STATUS, Z goto Int_end ; Timer2 <> 0 movlw 32 movwf Timer2 movlw d'1' subwf ziffer4, f ; 1 Sekunden vertiefen btfsc STATUS, C goto Int_end ; 1 Sekunden <> 10 movlw d'9' movwf ziffer4 movlw d'1' subwf ziffer3, f ; 1 Sekunden vertiefen btfsc STATUS, C goto Int_end ; 1 Sekunden <> 10 movlw d'5' movwf ziffer3 movlw d'1' subwf ziffer2, f ; 1 Sekunden vertiefen btfsc STATUS, C goto Int_end ; 1 Sekunden <> 10 movlw d'9' movwf ziffer2 ; 1 Minuten <> 6 movlw d'1' subwf ziffer1, f ; 1 Sekunden vertiefen btfsc STATUS, C goto Int_end ; 1 Sekunden <> 10 movlw d'5' movwf ziffer1 goto Int_end Int_1 movfw ziffer1 ; Wert der 1. Ziffer call Segmente movwf PORTB ; Segmente einschalten bsf PORTC, 5 ; 1. Ziffer einschalten goto Int_end Int_2 movfw ziffer2 ; Wert der 2. Ziffer call Segmente movwf PORTB ; Segmente einschalten bsf PORTB, 1 ; 2. Ziffer einschalten goto Int_end Int_3 movfw ziffer3 ; Wert der 3. Ziffer call Segmente movwf PORTB ; Segmente einschalten bsf PORTC, 7 ; 3. Ziffer einschalten goto Int_end Int_4 movfw ziffer4 ; Wert der 4. Ziffer call Segmente movwf PORTB ; Segmente einschalten bsf PORTC, 6 ; 4. Ziffer einschalten goto Int_end Int_end movfw pclath_temp movwf PCLATH swapf status_temp,W movwf STATUS swapf w_temp,F swapf w_temp,W bcf INTCON, T0IF ; Interupt-Flag löschen bsf INTCON, GIE ; enable Interupt retfie INIT bsf STATUS, RP0 ; auf Bank 1 umschalten movlw 0x06 ; PortA auf Digital schalten movwf ADCON1 movlw B'00000000' ; RA alle output movwf TRISA movlw B'00000000' ; RB alle output movwf TRISB movlw B'00011111' ; RC0 bis RC4 input, RC5 bis RC7 output movwf TRISC ; 250 Hz-Timer-Interupt einstellen movlw B'10000100' ; internen Takt zählen, Vorteiler zum Timer0, 32:1 movwf OPTION_REG movlw D'131' ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz) bcf STATUS, RP0 ; auf Bank 0 zurückschalten movwf TMR0 movlw 5 movwf Digit movlw 32 movwf Timer2 clrf PORTA ; Port A löschen clrf PORTB ; Port B löschen clrf PORTC ; Port C löschen clrf ziffer1 clrf ziffer2 clrf ziffer3 clrf ziffer4 clrf Zahl clrf STARTEN bsf INTCON, T0IE ; Timer0 interupt erlauben bsf INTCON, GIE ; Interupt erlauben MAIN RECHTS_LINKS_1 call ZEAHLEN btfsc PORTC, 4 call RECHTS_1 btfsc PORTC, 0 call LINKS_1 PLUS_MINUS_1 btfsc PORTC, 3 call PLUS_1 btfsc PORTC, 1 call MINUS_1 goto RECHTS_LINKS_1 PLUS_1 call Wait incf ziffer1, F movlw d'6' subwf ziffer1, W btfsc STATUS, Z clrf ziffer1 return MINUS_1 call Wait movlw d'1' subwf ziffer1, F movlw d'5' btfss STATUS, C movwf ziffer1 return RECHTS_1 call Wait goto RECHTS_LINKS_2 LINKS_1 call Wait goto RECHTS_LINKS_4 RECHTS_LINKS_2 call ZEAHLEN btfsc PORTC, 4 call RECHTS_2 btfsc PORTC, 0 call LINKS_2 PLUS_MINUS_2 btfsc PORTC, 3 call PLUS_2 btfsc PORTC, 1 call MINUS_2 goto RECHTS_LINKS_2 PLUS_2 call Wait incf ziffer2, F movlw d'10' subwf ziffer2, W btfsc STATUS, Z clrf ziffer2 return MINUS_2 call Wait movlw d'1' subwf ziffer2, F movlw d'9' btfss STATUS, C movwf ziffer2 return RECHTS_2 call Wait goto RECHTS_LINKS_3 LINKS_2 call Wait goto RECHTS_LINKS_1 RECHTS_LINKS_3 call ZEAHLEN btfsc PORTC, 4 call RECHTS_3 btfsc PORTC, 0 call LINKS_3 PLUS_MINUS_3 btfsc PORTC, 3 call PLUS_3 btfsc PORTC, 1 call MINUS_3 goto RECHTS_LINKS_3 PLUS_3 call Wait incf ziffer3, F movlw d'6' subwf ziffer3, W btfsc STATUS, Z clrf ziffer3 return MINUS_3 call Wait movlw d'1' subwf ziffer3, F movlw d'5' btfss STATUS, C movwf ziffer3 return RECHTS_3 call Wait goto RECHTS_LINKS_4 LINKS_3 call Wait goto RECHTS_LINKS_2 RECHTS_LINKS_4 call ZEAHLEN btfsc PORTC, 4 call RECHTS_4 btfsc PORTC, 0 call LINKS_4 PLUS_MINUS_4 btfsc PORTC, 3 call PLUS_4 btfsc PORTC, 1 call MINUS_4 goto RECHTS_LINKS_4 PLUS_4 call Wait incf ziffer4, F movlw d'10' subwf ziffer4, W btfsc STATUS, Z clrf ziffer4 return MINUS_4 call Wait movlw d'1' subwf ziffer4, F movlw d'9' btfss STATUS, C movwf ziffer4 return RECHTS_4 call Wait goto RECHTS_LINKS_1 LINKS_4 call Wait goto RECHTS_LINKS_3 ZEAHLEN btfss PORTC, 2 return call Wait bsf PORTA, 0 comf STARTEN, F ZAEHLER2 incf ziffer1, W movwf ZZZZ decfsz ZZZZ, F goto ZAEHLER2 incf ziffer2, W movwf ZZZZ decfsz ZZZZ, F goto ZAEHLER2 incf ziffer3, W movwf ZZZZ decfsz ZZZZ, F goto ZAEHLER2 incf ziffer4, W movwf ZZZZ decfsz ZZZZ, F goto ZAEHLER2 bcf PORTA, 0 comf STARTEN, F goto MAIN Segmente addwf PCL, f retlw B'00000000' ; 0 retlw B'00010000' ; 1 retlw B'10000000' ; 2 retlw B'10010000' ; 3 retlw B'01000000' ; 4 retlw B'01010000' ; 5 retlw B'11000000' ; 6 retlw B'11010000' ; 7 retlw B'00100000' ; 8 retlw B'00110000' ; 9 ; Warteschleife (Taster - entprellung) Wait movlw D'200' ; 200 ms Pause movwf loops Wai movlw .110 ; Zeitkonstante für 1ms movwf loops2 Wai2 nop nop nop nop nop nop decfsz loops2, F ; 1 ms vorbei? goto Wai2 ; nein, noch nicht decfsz loops, F ; 250 ms vorbei? goto Wai ; nein, noch nicht retlw 0 ; das Warten hat ein Ende end