Code:
list p=16f84a
;**************************************************************
;* Pinbelegung
;* ----------------------------------
;* PORTA: Eingänge
;* 0 - PIN 17 - Tastereingang
;* 1 - PIN 18 - n.c.
;* 2 - PIN 01 - Input #4
;* 3 - PIN 02 - Input #5
;* 4 - PIN 03 - n.c.
;* PORTB:
;* 0 - PIN 06 - Tastersignal
;* 1 - PIN 07 - n.c.
;* 2 - PIN 08 - n.c.
;* 3 - PIN 09 - n.c.
;* 4 - PIN 10 - LED x-Achse
;* 5 - PIN 11 - LED y-Achse
;* 6 - PIN 12 - LED z-Achse
;* 7 - PIN 13 - LED a-Achse
;*
;**************************************************************
;
;jorues 30.03.2007
;
; Handradlogik
;
; Taktquelle: 4 MHz
;
;**************************************************************
; Includedatei für den 16F84A einbinden
#include <P16f84a.INC>
; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;***************************************************************
; Variablen festlegen
Input Equ 0x20
Input_kor Equ 0x21
Result Equ 0x22
loops Equ 0x24 ; Zähler für Warteschleife
loops2 Equ 0x25 ; Zähler für Warteschleife
; Constanten festlegen
Ini_con Equ B'00000000' ; TMR0 -> Intetupt disable
digit0 Equ B'00000000' ; Wert0 festlegen
digit1 Equ B'00000100' ; Wert1 festlegen
digit2 Equ B'00001000' ; Wert2 festlegen
digit3 Equ B'00001100' ; Wert3 festlegen
LED_X Equ B'10000000' ; LED für X-Achse
LED_Y Equ B'01000000' ; LED für Y-Achse
LED_Z Equ B'00100000' ; LED für Z-Achse
LED_A Equ B'00010000' ; LED für A-Achse
;*************************************************************
;Reset vector
; This code will start executing when a reset occurs.
ORG 0x0000
;**************************************************************
; Das Programm beginnt mit der Initialisierung
Init
bsf STATUS, RP0 ; Bank 1
movlw B'11111111' ; PortA alle inputs
movwf TRISA ;
movlw B'00000000' ; PortB alle outputs
movwf TRISB ;
bcf STATUS, RP0 ; Bank 0
clrf PORTA
clrf PORTB
movlw Ini_con ; Interupt disable
movwf INTCON
clrw
;****************************************************************
Main
movfw PORTA ; Port A lesen und nach W kopieren >> W = PORTA
;
movwf Input ; von W in Input (0x20) kopieren >> Input = W
;
andlw 12 ; W = W & 0x0C, Zero-Flag in STATUS ggf. auf 1 wenn Ergebnis 0
;
movwf Input_kor ; Input_kor = W
; jetzt haben wir also den Originalzustand von PORTA in Input und den sauberen
; Zustand in Input_kor und W
;
clrw ; W löschen >> nicht nötig, wir brauchen Input_kor ja gleich wieder
;
clrf PORTA ; Alle Leitungen auf 0 (LOW)
clrf PORTB ;
;****************************************************************************************************************
;PORTB auf 10000000 (LED_X) wenn Input_kor = 00000000 (digit0)
X_achse
call Wait ; Wartezeit
movfw Input_kor ; Input_kor wird in W geladen
;
xorwf digit0,0 ; Input_kor und digit0 werden verglichen, Ergenbins in W
; wenn W gleich digit0, dann liefert XOR 0; das setzt
; das Zero-Flag in STATUS, und das kannst Du testen
;
movwf Result ; Ergebnis wird in Result gespeichert >> wenn Du magst, brauchen wir aber nicht
;
bnz Y_achse ; >> ungleich 0, war's also nicht (Branch on Non Zero)
bsf PORTB,7 ; Bit 7 von PORTB wird auf high gesetzt, die LED für X-Achse leuchtet
;****************************************************************************************************************
;PORTB auf 01000000 (LED_Y) wenn Input_kor = 00000100 (digit1)
Y_achse
call Wait ; Wartezeit
movfw Input_kor ; Input_kor wird in W geladen
;
xorwf digit1,0 ; Input_kor und digit1 werden verglichen, Ergenbins in W
; wenn W gleich digit1, dann liefert XOR 0; das setzt
; das Zero-Flag in STATUS, und das kannst Du testen
;
movwf Result ; Ergebnis wird in Result gespeichert >> wenn Du magst, brauchen wir aber nicht
;
bnz Z_achse ; >> ungleich 0, war's also nicht (Branch on Non Zero)
bsf PORTB,6 ; Bit 6 von PORTB wird auf high gesetzt, die LED für Y-Achse leuchtet
;****************************************************************************************************************
;PORTB auf 00100000 (LED_Z) wenn Input_kor = 00001000 (digit2)
Z_achse
call Wait ; Wartezeit
movfw Input_kor ; Input_kor wird in W geladen
;
xorwf digit2,0 ; Input_kor und digit2 werden verglichen, Ergenbins in W
; wenn W gleich digit2, dann liefert XOR 0; das setzt
; das Zero-Flag in STATUS, und das kannst Du testen
;
movwf Result ; Ergebnis wird in Result gespeichert >> wenn Du magst, brauchen wir aber nicht
;
bnz A_achse ; >> ungleich 0, war's also nicht (Branch on Non Zero)
bsf PORTB,5 ; Bit 5 von PORTB wird auf high gesetzt, die LED für Z-Achse leuchtet
;****************************************************************************************************************
;PORTB auf 00010000 (LED_A) wenn Input_kor = 00001100 (digit3)
A_achse
call Wait ; Wartezeit
movfw Input_kor ; Input_kor wird in W geladen
;
xorwf digit3,0 ; Input_kor und digit3 werden verglichen, Ergenbins in W
; wenn W gleich digit3, dann liefert XOR 0; das setzt
; das Zero-Flag in STATUS, und das kannst Du testen
;
movwf Result ; Ergebnis wird in Result gespeichert >> wenn Du magst, brauchen wir aber nicht
;
bnz X_achse ; >> ungleich 0, war's also nicht (Branch on Non Zero)
bsf PORTB,4 ; Bit 4 von PORTB wird auf high gesetzt, die LED für A-Achse leuchtet
;****************************************************************************************************************
goto Main
;****************************************************************************************************************
; Warteschleife 250 ms
Wait
movlw D'250' ; 250 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
Habs jetzt auch versuch, mit dem Ergebnis, dass nach dem einschalten erst RB7 und kurz darauf RB5 auf high, logisch 1, gehen.
Lesezeichen