	.NOLIST	
	.INCLUDE "2313def.inc"	
	.LIST	
				
	.CSEG	;kódový segment	
	.DEF REG=R16	;pracovní registr
	.DEF CNT1=R17	;čítače průchodů
	.DEF CNT2=R18	;pro čekací
	.DEF CNT3=R19	;rutiny
	.EQU E=2	;signály
	.EQU RS=1	;pro řízení
	.EQU UCC=0	;LCD
	.EQU DDR=DDRD	;řízení směru
	.EQU PORT=PORTD	;port
		
START:	LDI REG,RAMEND	
	OUT SPL,REG	;nastavení SP
	RCALL LCDINI	;inicializace
	LDI R30,LOW(ADRR1)	;text
	LDI R31,HIGH(ADRR1)	;pro výpis
	RCALL LCDPIS
	LDI R30,LOW(ADRTXT)	;text
	LDI R31,HIGH(ADRTXT)	;pro výpis
SMYCKA:	RCALL CEKVYP
	LDI REG,$C0
	RCALL WRCMD
	RCALL LCDPIS
	ADIW R30,2
	LPM
	MOV REG,R0
	CPI REG,$A0
	BRNE SMYCKA
	RJMP START
		;zobrazí řetězec
LCDPIS:LPM	;nahraj znak
	MOV REG,R0	;do REG
	CPI REG,$A0	;testuj konec
	BREQ PKONEC
	CPI REG,$FE	;testuj zlom
	BREQ PZLOM
	RCALL WRDATA	;obyčejný znak
PDAL:	ADIW R30,1	;na další znak
	BRNE LCDPIS
PKONEC:RET	;konec
PZLOM:	ADIW R30,1	;přečti pozici
	LPM
	MOV REG,R0	;do REG
	RCALL WRCMD	;nastav ji
	RJMP PDAL	;a pokračuj
		;inicializace LCD
LCDINI:	LDI REG,$00	
	OUT PORT,REG	;výchozí hodnoty
	LDI REG,$7F	
	OUT DDR,REG	;výstup režim

	SBI PORT,UCC	;vypni napájení
	RCALL CEKVYP	;počkej
	CBI PORT,UCC	;zapni napájení

	RCALL CEK15M	;čekej 15ms
	CBI PORT,RS	;RS=0
	SBI PORT,E	;E=1
	LDI REG,$1B	;DATA=$30
	OUT PORT,REG	
	CBI PORT,E	;E=0
	RCALL CEK4M1	;počkej 4,1ms
	SBI PORT,E	;E=1
	CBI PORT,E	;E=0
	RCALL CEK100	;počkej 100us
	SBI PORT,E	;E=1
	CBI PORT,E	;E=0
	RCALL CEK40	;čekej 40us
	LDI REG,$20	;4bitová komunikace
	RCALL WRCMD	
	LDI REG,$28	;nastavanení funkce
	RCALL WRCMD	
	LDI REG,$01	;smazání displeje
	RCALL WRCMD	
	LDI REG,$08	;vypnutí kurzoru
	RCALL WRCMD	
	LDI REG,$0C	;zapnutí displeje
	RCALL WRCMD	
	LDI REG,$06	;režim inkrementace
	RCALL WRCMD	
	RET	
		;čeká CNT1*us
CEK:	DEC CNT1	
	NOP	
	NOP	
	NOP	
	NOP	
	NOP	
	NOP	
	NOP	
	BRNE CEK	
	RET	
		;čeká 40us
CEK40:	LDI CNT1,40	
	RCALL CEK	
	RET	
		;čeká 100us
CEK100:	LDI CNT1,100	
	RCALL CEK	
	RET	
		;čeká CNT2*100us
CEKM:	RCALL CEK100	
	DEC CNT2	
	BRNE CEKM	
	RET	
		;čeká 1,6ms
CEK1M6:	LDI CNT2,16	
	RCALL CEKM	
	RET	
		;čeká 4,1ms
CEK4M1:	LDI CNT2,41	
	RCALL CEKM	
	RET	
		;čeká 15ms
CEK15M:	LDI CNT2,150	
	RCALL CEKM	
	RET	
		;čeká asi 2s
CEKVYP:	LDI CNT1,100	
	LDI CNT2,0	
	LDI CNT3,0	
CEKV0:	DEC CNT3	
	BRNE CEKV0	;smyčka 1
	DEC CNT2	
	BRNE CEKV0	;smyčka 2
	DEC CNT1	
	BRNE CEKV0	;smyčka 3
	RET	
		;zapíše data/příkaz REG
WRDATA:	SET	;T=1
	SBI PORT,RS	;RS=1
	RJMP WR1
WRCMD:	CLT	;T=0
	CBI PORT,RS	;RS=0
WR1:	MOV CNT2,REG	;schovej REG
	SBI PORT,E	;E=1
	ANDI REG,$F0	;vymaskuj horní bity
	LSR REG	;>>1
	ORI REG,$04	;přidej E=1
	BLD REG,RS	;přidej RS(T)
	OUT PORT,REG	;vystav
	CBI PORT,E	;E=0
	SBI PORT,E	;E=1
	MOV REG,CNT2	;obnov REG
	ANDI REG,$0F	;vymaskuj dolní bity
	SWAP REG	;dej na místo horních
	LSR REG	;>>1
	ORI REG,$04	;přidej E=1
	BLD REG,RS	;přidej RS(T)
	OUT PORT,REG	;vystav
	CBI PORT,E	;E=0
	RCALL CEK40	;počkej 40us
	BRTS WREND	;pokud T=1, konec
	MOV REG,CNT2	;obnov REG
	CPI REG,$01	;pro $01, $02, $03
	BREQ WR2	;čekej 1,6ms
	CPI REG,$02	
	BREQ WR2	
	CPI REG,$03	
	BREQ WR2	
WREND:	RET	
WR2:	RCALL CEK1M6	
	RET	
		;první řádek:
RADEK1:	.DB "BEN nabizi:",$A0	
	.EQU ADRR1=2*RADEK1	;adresa 1. řádku
		;text:
TEXT:	.DB "ELEKTRONIKA     ",$A0
	.DB "Oper. zesilovace",$A0
	.DB "Postavte si PC  ",$A0
	.DB "Napajeci zdroje ",$A0
	.DB "Mikroproc. 8051 ",$A0
	.DB "Programovani PIC",$A0
	.DB "Obvody rady TTL ",$A0
	.DB "Obvody rady CMOS",$A0
	.DB "C++ Builder     ",$A0
	.DB "Udelejte si z PC",$A0
	.DB "Cislic. technika",$A0
	.DB $A0
	.EQU ADRTXT=2*TEXT	;adresa textu
	