'**************************************************************
'* Projekt:   Würfel mit 89C2051
'* Author:    SYSTEM-CLINCH, Manuel Magnin
'* Datum:     10.10.2007
'* Version:   V0.0
'* änderung:  ..
'**************************************************************

' Die Schaltung wir per Tastendruck eingeschaltet und der uC
' kann sich selber wieder ausschalten (nach ca. 30 Sek.)
'
' Die Zeit während der der Taster gedrückt wird wird für die 
' Zufallszahl hochgezählt.
'
' Während dem betätigen des Tasters zum Würfeln, leuchten
' alle 7 LEDs mit 50% der normalen Helligkeit.
'
' Das gewürfelten Augen werden 30 Sekunden lang angezeigt
' wird während dieser Zeit nicht erneut gewürfelt, so 
' schaltet sich der Prozessor aus.
'
' FEHLER:
' Wenn ein Fehler in der Ausschalt elektronik vorliegt, so
' blinkt die mittlere LED! (Der elektronische Würfel muss
' repariert werden!)
' Wenn der Taster verklemmt ist so leuchten alle 7 LED's 
' mit 50% kontinuierlich.
'
' Stromaufnahme:
' 100mA bei Anzeige 6 Augen
'  60mA bei Anzeige 1 Auge
'  85mA bei 7 Augen Taster gedrückt
'   5uA nach Auto Off
' Batterie Laufzeit OFF > 2 Jahr  (9V Blockbatterie 100mAh)
'
'

' ASSEMBLER MCS51
INCLUDE 89C2051.mc


;-----------------------------------------------------------------
; Haupt Programm
;-----------------------------------------------------------------

ORG     00H
LJMP    START                      ; Reset

;-----------------------------------------------------------------
; Verwendete Variablen
;-----------------------------------------------------------------
Taster  EQU     P1.0             ; Eingang Power On / Würfeln
LED     EQU     P1               ; LED's P1.1 - P1.7
Power   EQU     P3.0             ; 1=Power-On
Wurfel1 EQU     11101111b	   ; Würfelzahl 1
Wurfel2 EQU     01111101b	   ; Würfelzahl 2
Wurfel3 EQU     01101101b	   ; Würfelzahl 3
Wurfel4 EQU     01010101b	   ; Würfelzahl 4
Wurfel5 EQU     01000101b	   ; Würfelzahl 5
Wurfel6 EQU     00010001b	   ; Würfelzahl 6


Org     20H                        ; Stack Start
StackP  DATA  20h                  ; Start Adresse des Stack Pointers

;-------------------------------------------------------------------------
;Initialisierung
;-------------------------------------------------------------------------
ORG     40H
START:  MOV SP,#StackP             ; StackPointer setzen

                                   ; starte würfeln
        SETB    Power              ; eingeschaltet bleiben
        SETB    Taster             ; Taster ist ein Eingang

Zaehl:  INC     R0                 ; Nächste Zahl (Vorgabe Wert = Warte Zähler !!)
        MOV     LED,#00000001b     ; LEDs setzen alles an (50%)
        IF R0 > #06 THEN MOV R0,#01; Überlauf des Würfelzählers
        MOV     LED,#11111111b     ; LEDs löschen alles aus (50%)
        JB      Taster, Zaehl      ; Bis Taster frei

        'Würfelzahl darstellen:
        IF R0 = #01 THEN MOV LED,#Wurfel1	'Würfelzahl 1
        IF R0 = #02 THEN MOV LED,#Wurfel2	'Würfelzahl 2 
        IF R0 = #03 THEN MOV LED,#Wurfel3	'Würfelzahl 3
        IF R0 = #04 THEN MOV LED,#Wurfel4	'Würfelzahl 4
        IF R0 = #05 THEN MOV LED,#Wurfel5	'Würfelzahl 5
        IF R0 = #06 THEN MOV LED,#Wurfel6	'Würfelzahl 6

WarteTaste:                        ; Warte bis Taster entprellt
        MOV     R6,#25             ; Tastatur entprellen 0.1 Sek.
WT1:    DJNZ    R7,$               ; Repeat Until R7 = 0 
        DJNZ    R6,WT1             ; Repeat Until R6 = 0

Warte:  MOV     R5,#62             ; Warte auf nächstest Würfeln ca 30 Sek.
WWW:      DJNZ  R7,$               ; Repeat until R7 = 0
            JB  Taster,Zaehl       ; Neu würfeln?
          DJNZ  R6,WWW             ; Repeat Until R6 = 0
        DJNZ   R5,WWW              ; Repeat until R5 = 0


OFF:    CLR     Power              ; Ausschalten
        MOV     LED,#11111110b     ; LEDs alle aus inkl. Bit 0 = 0 = Power OFF
        ;JMP    $                  ; Endlosschleife bis Strom weg
        
OFFW:   DJNZ    R7,$               ; Warte auf Power OFF ca 1 Sek.          
          JB    Taster,Start       ; Neu würfeln?
        DJNZ    R5,OFFW            ; Repeat Until R5 = 0

        MOV     LED,#11101110b     ; LEDs mit ein ERROR!
        
OFFW1:  DJNZ    R7,$               ; Warte auf Power OFF ca 1 Sek.          
          JB    Taster,Start       ; Neu würfeln?
        DJNZ    R5,OFFW1           ; Repeat Until R5 = 0
        
ENDE:   JMP     OFF                ; ERROR Schleife LED mit blinkend
        
        
        







