lcd_befehl   equ   0F400h                  ;Modus Befehle an LCD schicken
lcd_status   equ   0F401h                  ;Modus Status von LCD lesen
lcd_daten    equ   0F402h                  ;Modus Daten an LCD schicken
zeile1       equ   80h                     ;Position für Zeile 1
zeile2       equ   0C0h                    ;Position für Zeile 2
zeile3       equ   90h                     ;Position für Zeile 3
zeile4       equ   0D0h                    ;Position für Zeile 4


org          0000h
             orl   96h,#00111000b          ;Schreib-/Lesefreigabe für internes EEPROM
             lcall lcd_init
             sjmp  auslesen		   ;wird zum Schreiben ins EEPROM auskommentiert
             mov   dptr,#0002h
             mov   a,#01111000b
             lcall eep_wr
             lcall lcd_zahl
             inc   dptr
             mov   a,#01100000b
             lcall eep_wr
             lcall lcd_zahl
             mov   a,dpl
             add   a,#19
             mov   dpl,a
             mov   a,#00000000b
             lcall eep_wr
             lcall lcd_zahl
             inc   dptr
             mov   a,#01100000b
             lcall eep_wr
             lcall lcd_zahl
             mov   a,dpl
             add   a,#9
             mov   dpl,a
             mov   a,#01111000b
             lcall eep_wr
             lcall lcd_zahl
             inc   dptr
             mov   a,#96h
             anl   a,#00011000b
             mov   96h,a
             mov   a,#01100000b
             lcall eep_wr
             lcall lcd_zahl
             mov   r5,#00h
             mov   r6,#00h
             mov   r7,#01h
zaehl:       djnz  r5,zaehl
             djnz  r6,zaehl
             djnz  r7,zaehl

auslesen:
             lcall lcd_init
             mov   dptr,#0002h
             movx  a,@dptr
             lcall lcd_zahl
             inc   dptr
             movx  a,@dptr
             lcall lcd_zahl
             mov   dptr,#0016h
             movx  a,@dptr
             lcall lcd_zahl
             inc   dptr
             movx  a,@dptr
             lcall lcd_zahl
ende:        sjmp  ende

eep_wr:      push  acc
             push  b
             mov   b,a
             movx  @dptr,a
;eep_warte:   movx  a,@dptr
;             cjne  a,b,eep_warte
             pop   b
             pop   acc
             ret
;===================================================================================================
;---------
;|für LCD|
;---------
;initialisiert den LCD und setzt die Anfangszeit
lcd_init:    push  dph
             push  dpl
             push  acc
 
             mov   dptr,#lcd_befehl
             mov   a,#00111000b            ;Funktion6: 8Bit, 4Zeilen, 5x7 Pixel
             movx  @dptr,a                 ;Befehle an LCD schicken
             lcall lcd_warte
 
             mov   a,#01h                  ;LCD löschen und Cursor auf Position 1 setzen
             movx  @dptr,a                 ;Befehle an LCD schicken
             lcall lcd_warte
 
             mov   a,#00001100b            ;Funktion4: Display an, Cursor aus, Blinken aus
             movx  @dptr,a                 ;Befehle an LCD schicken
             lcall lcd_warte
 
             pop   acc
             pop   dpl
             pop   dph
             ret
;---------------------------------------------------------------------------------------------------
;wartet bis der LCD alle Befehle abgearbeitet hat
lcd_warte:   push  dph
             push  dpl
             push  acc
 
             mov   dptr,#lcd_status
lcd_busy:    movx  a,@dptr                 ;Status des LCDs lesen
             jb    acc.7,lcd_busy
 
             pop   acc
             pop   dpl
             pop   dph
             ret
;---------------------------------------------------------------------------------------------------
;setzt den Cursor auf die in a stehende Position
set_cursor:  push  dph
             push  dpl
 
             lcall lcd_warte
             mov   dptr,#lcd_befehl
             movx  @dptr,a                 ;Cursor auf Position in a setzen
 
             pop   dpl
             pop   dph
             ret
;---------------------------------------------------------------------------------------------------
;schreibt das in a stehende Zeichen auf dem LCD
lcd_zeichen: push  dph
             push  dpl
 
             lcall lcd_warte
             mov   dptr,#lcd_daten
             movx  @dptr,a                 ;Daten in LCD schreiben
 
             pop   dpl
             pop   dph
             ret
;---------------------------------------------------------------------------------------------------
;gibt den Text, auf den dptr zeigt, auf dem LCD aus
lcd_txt:     push  acc
 
             mov   a,#00h                  ;Startwert für a
 
hole_z:      push  acc
 
             movc  a,@a+dptr               ;Zeichen holen
 
             cjne  a,#0FEh,lcd_ausg        ;Textende erreicht?
             pop   acc
             pop   acc
             ret
 
lcd_ausg:    lcall lcd_zeichen
             pop   acc
             inc   a                       ;Zeichenzähler erhöhen
             sjmp  hole_z
;---------------------------------------------------------------------------------------------------
;gibt die in a stehende Zahl auf dem LCD aus
lcd_zahl:    push  acc
 
             mov   b,#100                  ;Hunderterstelle
             div   ab
             orl   a,#30h                  ;maskieren
             lcall lcd_zeichen
 
             mov   a,b
             mov   b,#10                   ;Zehnerstelle
             div   ab
             orl   a,#30h                  ;maskieren
             lcall lcd_zeichen
 
             mov   a,b                     ;Einerstelle
             orl   a,#30h                  ;Maskieren
             lcall lcd_zeichen
 
             pop   acc
             ret
;===================================================================================================

