Po připojení napájení se na displeji zobrazuje zpráva odpovídající stisknutému tlačítku.
$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
Soubor .asm ke stažení najdete v sekci download.