;Verwendete Hardware:
;Eigenes Board mit 89C2051 Prozessor
;Testsystem 80535 
;Erstellt: September 2001, Klaus Leidinger
;                 
;Beispielprogramm zum testen des 7Segment LED Boards http://www.mikrocontroller-projekte.de
;getestet mit 24Mhz Quarz

    incl "MOD51.H"  ; default definitionen


T_Sig       bit P3_7 ;Aktivierung tausender Segment (Seg3)
H_Sig       bit P3_6 ;Aktivierung hunderter Segment (Seg2)
Z_Sig       bit P3_5 ;Aktivierung zehner Segment (Seg1)
E_Sig       bit P3_4 ;Aktivierung einer Segment (Seg0)
LEDPort		equ P1	 ;Port mit angeschlossenen 7 Segemnt Anzeigen
                                                                 
delay2 equ 20	;Anzeigedauer einer Ziffer im durchlauf
                                                                

	org 050H		;RAM Adressen

;Definition der Programmtypischen Variablen/Labels
tausender   ds  1  ;Speicherstelle für wert der tausender Anzeige (Seg3)
hunderter   ds  1  ;Speicherstelle für wert der hunderter Anzeige (Seg2)
zehner      ds  1  ;Speicherstelle für wert der zehner Anzeige (Seg1)
einer       ds  1  ;Speicherstelle für wert der einer Anzeige (Seg0)
                                                        

; Start des Programmcodes
        org 0000H      ;Programmstart
        ljmp STARTPROG
        org 0003H      ;Interrupt 0
;        ljmp INT0_int   ;Sprungziel fuer Interrupt 0
        org 000BH      ;Interrupt Timer0
;        ljmp Timer0_int ;Sprungziel für Timer0 Interrupt
        org 0013H
;        ljmp INT1_int   ;Sprungziel für Interrupt 1
        org 001BH      ;Interrupt Timer1

        org 0023H      ;Interrupt Serial Port

        org 002BH      ;Interrupt Timer2

        org 0033H      ;Ende der Interrupttabelle

   db "7Sementtest Version 1.0  vom 09.09.2001, Internet Download"

STARTPROG               ;Start des eigentlichen Programms
        mov  SP,#070H   ;Stack setzen
          
   ;Start des Hauptprogrammes
          setb T_Sig		;Alle Anzeigen ausschalten
          setb H_Sig
          setb Z_Sig
          setb E_Sig

resetloop
          mov tausender,#0H    ;1234
          mov hunderter,#1H    
          mov zehner,#2H
          mov einer,#3H

          mov DPTR,#HEXvalTAB
          
          mov R5,#0FFH	;Verzögerung
          mov R4,#delay2
          
          mov R3,#02FH  ;Anzahl der Zählschritte, Ende des Zeichensatzes nach 02FH Zeichen 
loop  					;In dieser loop findet das eigentliche Hauptprogramm statt
        djnz R5,loop1	;Zähler bis R5=0
        djnz R4,loop1   ;R4 * R5
        inc tausender   ;nächste Ziffer wird angezeigt
        inc hunderter
        inc zehner
        inc einer
        mov R4,#delay2
        djnz R3,loop1   ;Ende des Zeichensatzes erreicht?
        sjmp resetloop
loop1        
		acall display   ;Sprung ins eigentliche Anzeigeprogramm
		sjmp loop       ;Endlosschleife
  


display
          mov A,tausender  ;hole Wert der vordersten Stelle (Seg3)
          movc A,@A+DPTR   ;hole passendes Zeichen aus Tabelle
          mov LEDPort,A    ;ausgabe auf Port
          clr T_Sig        ;Segment einschalten
          acall disp_loop  ;warten auf das träge Auge...
          mov A,hunderter  ;und die nächste Stelle...
          movc A,@A+DPTR
          setb T_Sig       ;ausschalten der letzten Stelle
          mov LEDPort,A
          clr H_Sig
          acall disp_loop
          mov A,zehner
          movc A,@A+DPTR
          setb H_Sig
          mov LEDPort,A
          clr Z_Sig
          acall disp_loop
          mov A,einer
          movc A,@A+DPTR
          setb Z_Sig
          mov LEDPort,A
          clr E_Sig
          acall disp_loop
          setb E_Sig
          ret


disp_loop mov R6,#2FH 		;sorgt für eine mindest Leuchtdauer der Segmente
          djnz R6,$
          ret


HEXvalTAB ;Die Werte sind abhängig vom Anschluss der 7 Segmentanzeige
          ;P1_0=g       a
          ;P1_1=f      -----
          ;P1_2=a    f|     |b
          ;P1_3=b     |  g  |
          ;P1_4=e      -----
          ;P1_5=d    e|     |c
          ;P1_6=c     |  d  |
          ;P1_7=dp     ----- . dp
          ; dpdecbfag
          ;------------------------------------------
         db 10000001B    ; 7 segment Steuerung für 0
         db 10110111B    ; 7 segment Steuerung für 1
         db 11000010B    ; 7 segment Steuerung für 2
         db 10010010B    ; 7 segment Steuerung für 3
         db 10110100B    ; 7 segment Steuerung für 4
         db 10011000B    ; 7 segment Steuerung für 5
         db 10001000B    ; 7 segment Steuerung für 6
         db 10110011B    ; 7 segment Steuerung für 7
         db 10000000B    ; 7 segment Steuerung für 8
         db 10010000B    ; 7 segment Steuerung für 9
         db 10100000B    ; 7 segment Steuerung für A
         db 10001100B    ; 7 segment Steuerung für b
         db 11001001B    ; 7 segment Steuerung für C
         db 10000110B    ; 7 segment Steuerung für d
         db 11001000B    ; 7 segment Steuerung für E
         db 11101000B    ; 7 segment Steuerung für F

         db 00000001B    ; 7 segment Steuerung für 0. = 010H
         db 00110111B    ; 7 segment Steuerung für 1. = 011H
         db 01000010B    ; 7 segment Steuerung für 2. = 012H
         db 00010010B    ; 7 segment Steuerung für 3. = 013H
         db 00110100B    ; 7 segment Steuerung für 4. = 014H
         db 00011000B    ; 7 segment Steuerung für 5. = 015H
         db 00001000B    ; 7 segment Steuerung für 6. = 016H
         db 00110011B    ; 7 segment Steuerung für 7. = 017H
         db 00000000B    ; 7 segment Steuerung für 8. = 018H
         db 00010000B    ; 7 segment Steuerung für 9. = 019H
         db 00100000B    ; 7 segment Steuerung für A. = 01AH
         db 00001100B    ; 7 segment Steuerung für b. = 01BH
         db 01001001B    ; 7 segment Steuerung für C. = 01CH
         db 00000110B    ; 7 segment Steuerung für d. = 01DH
         db 01001000B    ; 7 segment Steuerung für E. = 01EH
         db 01101000B    ; 7 segment Steuerung für F. = 01FH

         db 11111111B    ; 7 segment Steuerung für " "= 020H (Blank)
         db 11001110B    ; 7 segment Steuerung für c  = 021H
         db 10100100B    ; 7 segment Steuerung für H  = 022H
         db 10101100B    ; 7 segment Steuerung für h  = 023H
         db 11101111B    ; 7 segment Steuerung für i  = 024H
         db 10010111B    ; 7 segment Steuerung für J  = 025H
         db 11001101B    ; 7 segment Steuerung für L  = 026H
         db 10101110B    ; 7 segment Steuerung für n  = 027H
         db 10001110B    ; 7 segment Steuerung für o  = 028H
         db 11100000B    ; 7 segment Steuerung für P  = 029H
         db 11101110B    ; 7 segment Steuerung für r  = 02AH
         db 10000101B    ; 7 segment Steuerung für U  = 02BH
         db 10001111B    ; 7 segment Steuerung für u  = 02CH
         db 11111110B    ; 7 segment Steuerung für -  = 02DH
         db 11011111B    ; 7 segment Steuerung für _  = 02EH
         db 01111111B    ; 7 segment Steuerung für .  = 02FH


