
$MOD52
$TITLE(BYTE SIGNED MULTIPLY)
$PAGEWIDTH(132)
$DEBUG
$OBJECT
$NOPAGING

;VZOROVY PROGRAM PRO OBSLUHU DISPLEJE PRO 4 RADKOVOU KOMUNIKACI A TEST TLACITEK
;tlacitka pripojena vzdy mezi P1.0(spolecny) a P1.4, P1.5, P1.6 a P1.7 
 
;lcd equates
rs          equ   p1.2
en          equ   p1.3
db4         equ   p1.4
db5         equ   p1.5
db6         equ   p1.6
db7         equ   p1.7
count       equ   r0
datcom      bit   0
set_up	bit   1		;priznak pro nastaveni vetsiho zpozdeni v setupu displeje(popr. 					pro smazani displeje ap. dlouhe rutiny)


            Jmp   cold_start


            ORG   40H          		;nastaveni komunikace s displejem.typ interface, ap.
setup:      DB    033h,032h,028h,00Eh
            db    002h,001h,0ffh		;0ffh je naraznik

mess:      	db	'Testov',1H,'n',05H,0FFh	;misto ceskeho znaku je vzdy zadana jeho pozice v RAM
mess1:		db	'tla',0h,5H,'tek',0ffh	;podrobnosti viz popis fonty_init
mess2:	    	db	'Stisknuto',0ffh
mess3:	    	db	'tlacitko 1',0ffh
mess4:	    	db	'tlacitko 2',0ffh
mess5:	    	db	'tlacitko 3',0ffh
mess6:      	db	'tlacitko 4',0ffh
 
;ceske fonty
;pro editaci nebo pridani znaku jsou data usporadana takto(matice= bodu)
;1.hexa cislo je prvni radek v matici znaku,2.hexa cislo je druhy radek v matici znaku
;8.cislo je vzdy 0,je to pozice kurzoru(carky pod pismenem) a posledni hexa cislo ffH je terminator(zakoncovac,oznacuje zakonceni dat pro tento znak)
;pro editaci cisla preved do binarni formy,jednicky jsou svitici body

ce:	    db    0AH,04H,0EH,10H,10H,11H,0EH,0H,0ffH
aa:	    db    02H,04H,0EH,1H,0FH,11H,0FH,0H,0ffh
zet:	    db    0AH,04H,1FH,02H,04H,08H,1FH,0H,0ffh
r:	    db    0AH,04H,16H,19H,10H,10H,10H,0H,0ffh
ee:	    db    01H,02H,0EH,11H,1FH,10H,0EH,0H,0ffh
ii:	    db    02H,04H,0CH,04H,04H,04H,0EH,0H,0ffh
;

cold_start: setb 	set_up                   ;priznak pro nastaveni zpozdeni v komunikacni rutine
	    mov   a,#0ffh			;pro setup je zpozdeni trvale 4 msec
            call  delay_ms
            clr   datcom       		;vysli povel
 	    mov   dptr, #setup 		;lcd setup string
            call  send_string
            clr set_up				;pro ostatni prikazy krome smazani displeje a presunu 							kurzoru viz casovani v dokumentaci je ve vyslani 1. 							nibble zpozdeni preskoceno a v druhe po zapsani 2. 							
						;casti prikazu nebo dat je nastaveno na 50 mikrosekund

		lcall fonty_init			;zaved ceske fonty do pameti displeje





;*************TADY JE ZAPIS -mess-age do 1.radku, mess1 do 2.radku displeje***********************
	    mov   a,#80h       ;vyber 1. radek
            clr   datcom       ;vysli povel
            call  send_char
            setb  datcom       ;vysli data
            mov   dptr, #mess
            call  send_string
            mov   a,#0C0h      ;select second row of lcd
            clr   datcom       ;send command
            call  send_char
            mov   dptr, #mess1
            setb  datcom       ;send data
            call  send_string


repeat:	mov P1,#11110000b
		jnb P1.7,tla1
		jnb P1.6,tla2
		jnb P1.5,tla3
		jnb P1.4,tla4

		setb p1.0	;deaktivuj cteni tlacitek
		sjmp repeat
;------------------------------------------------------------

tla1:		setb p1.0
		mov   a,#80h      ;vyber 1. radek
            clr   datcom       ;vysli povel
            call  send_char

	   	mov   dptr, #mess2
            setb  datcom       ;send data
            call  send_string

		mov   a,#0C0h      ;vyber 2. radek
            clr   datcom       ;vysli povel
            call  send_char

 		mov   dptr, #mess3
            setb  datcom       ;send data
            call  send_string
		jmp repeat

;------------------------------------------------------------

tla2:	 	setb p1.0
		mov   a,#80h      ;vyber 1. radek
            clr   datcom       ;vysli povel
            call  send_char
	
	   	mov   dptr, #mess2
            setb  datcom       ;send data
            call  send_string

		mov   a,#0C0h      ;vyber 2. radek
            clr   datcom       ;vysli povel
            call  send_char

 		mov   dptr, #mess4
            setb  datcom       ;send data
            call  send_string

		jmp repeat
;------------------------------------------------------------

tla3: 		setb p1.0
		mov   a,#80h      ;vyber 1. radek
            clr   datcom       ;vysli povel
            call  send_char
	

	  	mov   dptr, #mess2
            setb  datcom       ;send data
            call  send_string

		mov   a,#0C0h      ;vyber 2. radek
            clr   datcom       ;vysli povel
            call  send_char

 		mov   dptr, #mess5
            setb  datcom       ;send data
            call  send_string
		jmp repeat
;------------------------------------------------------------
tla4: 		setb p1.0
		mov   a,#80h      ;vyber 1. radek
            clr   datcom       ;vysli povel
            call  send_char
	
	   	mov   dptr, #mess2
            setb  datcom       ;send data
            call  send_string

		mov   a,#0C0h      ;vyber 2. radek
            clr   datcom       ;vysli povel
            call  send_char

 		mov   dptr, #mess6
            setb  datcom       ;send data
            call  send_string
		jmp repeat

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
send_string:
; Transmit string pointed to by DPTR.
; String may be of any length, but must be null-terminated.
            Push  acc
            push  dpl
            push  dph
ss1:
            clr   a
            movc  a, @a+dptr  ; get character
            inc   a
            jz    ss2          ; check for terminator
            dec   a
            call  send_char    ; send character
            inc   dptr         ; point to next character
            jmp   ss1
ss2:
            pop   dph
            pop   dpl
            pop   acc
            ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
send_char:  mov   c,datcom
            mov   rs,c
            clr   en
	    mov   c,acc.4
            mov   db4,c
            mov   c,acc.5
            mov   db5,c
            mov   c,acc.6
            mov   db6,c
            mov   c,acc.7
            mov   db7,c
            setb  en
            clr   en
            push  acc
	    jnb set_up,noWait		;v setupu cekej 4 msec,jinak necekej
            mov   a,#4h
            call  delay_ms
noWait:     pop   acc
            mov   c,acc.0
            mov   db4,c
            mov   c,acc.1
            mov   db5,c
            mov   c,acc.2
            mov   db6,c
            mov   c,acc.3
            mov   db7,c
            setb  en
            clr   en
	    jnb set_up,Wait_1		;v setupu cekej 4 msec,jinak cekej djnz=2cykl x19H=50 mikrosec
            mov   a,#4h
            call  delay_ms

Wait_1:     mov r1,#19H
	    djnz r1,$
            ret


clr_disp:   setb set_up		;prodlouzit zpozdeni ve vyslani command,tento prikaz vyzaduje delsi cas na zpracovani
	    mov   a,#01h	;command 'clear display'
            clr   datcom	;send command
            call  send_char
	    clr set_up
	    ret




;*************TADY JE TESTOVANI************************

uziv_znak:  mov r2,#80H
	mov r3,#0H

op1:	clr datcom		;command
;	mov A,#10000000   
	mov A,R2    ;pozice v DD RAM / kam zapsat znak,tady zatim na pevno
	call  send_char
	setb datcom

	mov A,r3
	   ; mov A,#00H		;zobrazeni znaku z CG RAM na pozici v DD RAM /----^
	call  send_char

inc r2
inc r3
cjne r2,#86H,op1


	ret





;*************************************************************
fonty_init:			

;zavede ceske znaky do CG RAM,kde jsou pak pristupne jako zbytek znakove sady
;adresa uzivatelskeho znaku v CG RAM pro CG0=000h,CG1=008h,CG2=010h,CG3=018h,CG4=020h,CG5=028h,CG6=030h,CG7=038h 
;jsou pristupne pozicich 000h az 007h 
;adr. CG RAM = 00H/command 40H	znak  'ce'  pozice znaku 00H
;adr. CG RAM = 08H/command 48H	znak  'aa'	pozice znaku 01H
;adr. CG RAM = 10H/command 50H 	znak  'zet'	pozice znaku 02H
;adr. CG RAM = 18H/command 58H	znak  'r'	pozice znaku 03H			
;adr. CG RAM = 20H/command 60H	znak  'ee'	pozice znaku 04H
;adr. CG RAM = 28H/command 68H 	znak  'ii'	pozice znaku 05H


;1.znak
	    mov A,#40H   	;nastaveni adresy v CG RAM na znak CG0
	    mov dptr,#ce	;nastaveni pozice ceskeho znaku v ROM
	    lcall zapsat
;2.znak
	    mov A,#48H   	;nastaveni adresy v CG RAM na znak CG0
	    mov dptr,#aa	;nastaveni pozice ceskeho znaku v ROM
	    lcall zapsat
;3.znak
    	    mov A,#50H   	;nastaveni adresy v CG RAM na znak CG0
	    mov dptr,#zet	;nastaveni pozice ceskeho znaku v ROM
	    lcall zapsat
;4.znak
            mov A,#58H   	;nastaveni adresy v CG RAM na znak CG0
	    mov dptr,#r		;nastaveni pozice ceskeho znaku v ROM
	    lcall zapsat
;5.znak
            mov A,#60H   	;nastaveni adresy v CG RAM na znak CG0
	    mov dptr,#ee	;nastaveni pozice ceskeho znaku v ROM
	    lcall zapsat
;6.znak
            mov A,#68H   	;nastaveni adresy v CG RAM na znak CG0
	    mov dptr,#ii	;nastaveni pozice ceskeho znaku v ROM
	    lcall zapsat

	    ret	

zapsat:		clr   datcom        ;send command
         	call  send_char

	    	setb  datcom	;send data
	    	call send_string
	    	ret


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay_ms:
; Delay for one mS times the value in the accumulator.
            Push  acc
            push  b
            mov   b, #0
dd:
            djnz  b, $         ; 500 uS @ 12 MHz
            djnz  b, $         ; 500 uS @ 12 MHz
            djnz  acc, dd
            pop   b
            pop   acc
            ret

            end
