	DSP  EQU P1
	EEP  EQU P3
	SJ   BIT DSP.4
	SD   BIT DSP.5
	SS   BIT DSP.6
	ST   BIT DSP.7
	PREN BIT EEP.2
	EMOD BIT EEP.4
	PB0  BIT EEP.3
	PB1  BIT EEP.5
	SCL  BIT EEP.6
	SDA  BIT EEP.7

 	POC EQU 50
	JED EQU 51
	DES EQU 52
	STO EQU 53
	TIS EQU 54
	
;*******************************************************************************
;*******************************************************************************

	JMP INIT

	ORG 00BH
	JMP DISPL

;****************************************************************************

INIT:	MOV SP,#80

	MOV R0,#127		;nulovani pameti
CLEAR:	MOV @R0,#0
	DJNZ R0,CLEAR
	
	MOV SCON,#10000000B	;casovac pro displej
	MOV TMOD,#00000001B
	MOV TCON,#01010000B
	MOV PCON,#10000000B
	MOV IE,#10000010B
		
	CLR PREN		;nastaveni EEPROM
	CLR PB0
	CLR PB1
	
;	CALL ZAPIS		
	CALL CTENI	
	JMP $

;****************************************************************************
;****************************************************************************
	
CTENI:	MOV R1,#JED		;pocatecni adresa
	MOV R2,#00H		;dolnich 8 bitu adresy EEPROM
	MOV R3,#00H		;horni 3 bity adresy EEPROM
	MOV R4,#4		;kolik bitu zapsat
	CALL RDADRE		;cteni z EEPROM
	RET

;****************************************************************************
		
ZAPIS:	MOV JED,#4		;nejaka data
	MOV DES,#3
	MOV STO,#2
	MOV TIS,#1

	MOV R1,#JED		;pocatecni adresa
	MOV R2,#00H		;dolnich 8 bitu adresy EEPROM
	MOV R3,#00H		;horni 3 bity adresy EEPROM
	MOV R4,#4		;kolik bitu zapsat
	CALL WRADRE		;zapis do EEPROM
	RET
		
;****************************************************************************
;****************************************************************************
;****** PROGRAMY PRO EEPROM 24C16 *******************************************
;nici	R1 - ukazatel do RAM, vraci hodnotu posledni adresy + 1
;nici	R2 - ukazatel do EEPROM, vraci hodnotu posledni adresy + 1
;necha	R3 - horni 3 bity adresy
;nici	R4 - pocet bytu, nuluje
;nici   R5 - vnitrni pocitadlo, nuluje

WRADRE: CLR EMOD		;rezim PAGEWRITE
	ACALL STARTE		;START podminka
	ACALL EADRS		;vyber pameti pro zapis adresy
	ACALL WBYTEE		;zapis
	JC WRADRE		;opakuj je BUSY
	MOV A,R2		;zapis adresy
	ACALL WBYTEE		;zapis
OPKWBE:	MOV A,@R1		;zapis dat z adresy R1 v RAM
	ACALL WBYTEE		;zapis
	MOV A,R2		;posledni zapsana adresa do A
	INC R1			;dalsi adresa
	INC R2			;aktualizuje R2
TEST4:	DJNZ R4,ROW		;dalsi byte
	ACALL STOPE		;STOP podminka
	RET

ROW:	ANL A,#0FH		;radek = 16 bytu
	CJNE A,#0FH,OPKWBE	;test konce radku
	ACALL STOPE		;zapis radek
	SJMP WRADRE		;dalsi byty

;****************************************************************************

RDADRE: ACALL STARTE		;START podminka
	ACALL EADRS		;vyber pameti pro zapis adresy
	ACALL WBYTEE		;zapis
	JC RDADRE		;opakuj je BUSY
	MOV A,R2		;zapis adresy
	ACALL WBYTEE		;zapis
	ACALL STARTE		;restart
	ACALL EADRS		;inicializace pameti
	SETB ACC.0		;pro cteni
	ACALL WBYTEE		;zapis
OPKRBE:	CLR C			;potvrzuje se pouze R4-1 bitu
	CJNE R4,#1,ACKE		;posledni bit se nepotvrzuje
	SETB C
ACKE:	ACALL RBYTEE		;cteni bytu
	MOV @R1,A		;zapis do RAM
	INC R1			;dalsi adresa
	INC R2			;aktualizuje R2
	DJNZ R4,OPKRBE		;dalsi byte
	ACALL STOPE		;STOP podminka
	RET

;****** PRIME CTENI Z ROM DO EEPROM *****************************************
;nici	R2 - ukazatel do EEPROM, vraci hodnotu posledni adresy + 1
;necha	R3 - horni 3 bity adresy
;nici	R4 - pocet bytu, nuluje
;nici   R5 - vnitrni pocitadlo, nuluje
;nici	DPTR - ukazatel do pameti programu

WRADRR: CLR EMOD		;rezim PAGEWRITE
	ACALL STARTE		;START podminka
	ACALL EADRS		;vyber pameti pro zapis adresy
	ACALL WBYTEE		;zapis
	JC WRADRR		;opakuj je BUSY
	MOV A,R2		;zapis adresy
	ACALL WBYTEE		;zapis
OPKWBR: CLR A
	MOVC A,@A+DPTR		;zapis dat z adresy DPTR v ROM
	ACALL WBYTEE		;zapis
	MOV A,R2		;posledni zapsana adresa do A
	INC DPTR		;dalsi adresa
	INC R2			;aktualizuje R2
TEST5:	DJNZ R4,ROW2		;dalsi byte
	ACALL STOPE		;STOP podminka
	RET

ROW2:	ANL A,#0FH		;radek = 16 bytu
	CJNE A,#0FH,OPKWBR	;test konce radku
	ACALL STOPE		;zapis radek
	SJMP WRADRR		;dalsi byty

;****************************************************************************

EADRS:	MOV A,R3		;doplni horni 3 bity adresy
	RL A
	ANL A,#00001110B
	ORL A,#10100000B
	RET

;****************************************************************************

WBYTEE:	MOV R5,#8		;zapise jeden byte
LOOP1E:	
	RLC A			;do C ACC.7
	MOV SDA,C		;data na SDA
	SETB SCL		;clock
	NOP
	CLR SCL		;clock konec
	DJNZ R5,LOOP1E		;smycka
	SETB SDA		;cteni ACK
	SETB SCL		;potvrzeni
	MOV C,SDA		;do C stav ACK
	CLR SCL			;SCL do 0
	RET

;****************************************************************************

RBYTEE:	PUSH PSW		;schovej C        (SP)←(SP)+1  ((SP))←(adresa)
	SETB SDA		;pro cteni DAT - SDA do "H"
	MOV R5,#8		;pocitadlo
LOOP2E:	
	SETB SCL		;clock - SCL do "H"
	MOV C,SDA		;cteni SDA
	CLR SCL			;clock - SCL do "L"
	RLC A			;zapis na ACC.1
	DJNZ R5,LOOP2E		;smycka
	POP PSW			;obnoveni C          (adresa)←((SP))  (SP)←(SP)-1
	MOV SDA,C		;v C je potvrzovaci bit -vystup na SDA
	SETB SCL		;ACK clock - SCL do "H"
	NOP
	CLR SCL		;SCL do "L"
	RET

;****************************************************************************

STARTE:	SETB SDA		;SDA do 1
	NOP
	SETB SCL		;SCL do 1
	NOP
	CLR SDA			;SDA do 0
	NOP
	CLR SCL			;SCL do 0
	RET

STOPE:	CLR SDA			;SDA do 0
	NOP
	SETB SCL		;SCL do 1
	NOP
	SETB SDA		;SDA do 1
	RET

;****************************************************************************
;****************************************************************************
;DYNAMICKÝ 4 MISTNY DISPLEJ

DISPL:	MOV TL0,#000H		;400 Hz
	MOV TH0,#0F1H

	PUSH ACC
	PUSH PSW

	MOV A,POC
	CJNE A,#0,SK0
	ORL DSP,#0F0H
	MOV A,JED
	ORL A,#0F0H
	MOV DSP,A
	CLR SJ
	JMP SK3

SK0:	CJNE A,#1,SK1
	ORL DSP,#0F0H
	MOV A,DES
	ORL A,#0F0H
	MOV DSP,A
	CLR SD
	JMP SK3

SK1:	CJNE A,#2,SK2
	ORL DSP,#0F0H
	MOV A,STO
	ORL A,#0F0H
	MOV DSP,A
	CLR SS
	JMP SK3

SK2:	CJNE A,#3,SK3
	ORL DSP,#0F0H
	MOV A,TIS
	ORL A,#0F0H
	MOV DSP,A
	CLR ST
	JMP SK3

SK3:	INC POC
	ANL POC,#03H

	POP PSW
	POP ACC
	RETI

;*******************************************************************************
