;program pre 4-bitove ovladanie LCD modulu s controllerom HD44780 p30 .EQU $0B0 ; p31 .EQU $0B1 ; p32 .EQU $0B2 ; p33 .EQU $0B3 ; p34 .EQU $0B4 ; p35 .EQU $0B5 ; p37 .EQU $0B7 ; p10 .EQU $90 rs .EQU $90 ;RS vstup 0-instrukcia 1-data rw .EQU $91 ;R/W vstup 0-zapis 1-citaj e .EQU $92 ;E vstup 0-neakt 1-aktiv p13 .EQU $93 ; db4 .EQU $94 ;DB4-datovy vodic db5 .EQU $95 ;DB5 db6 .EQU $96 ;DB6 db7 .EQU $97 ;DB7 tl0 .EQU $8A ;8 bitov citaca 0 th0 .EQU $8C ;8 bitov citaca 0 tl1 .EQU $8B ;8 bitov citaca 1 th1 .EQU $8D ;8 bitov citaca 1 tmod .EQU $89 ;nastavenie rezimu citacov tcon .EQU $88 ;nastavenie priznakov preruseniod citacov ie .EQU $0A8 ;nastavenie preruseni ip .EQU $0B8 ;priorita preruseni tr0 .EQU $8C ;spust/zastav citac 0 tr1 .EQU $8E ;spust/zastav citac 1 b .EQU $0F0 acc .EQU $0E0 psw .EQU $0D0 ;stavove slovo procesora sp .EQU $81 ;zasobnik C .EQU $0D7 ;Carry out_d .EQU $00 ;vystupne data in_d .EQU $01 ;vstupne data znak .EQU $02 ;kod zobrazeneho znaku v ASCII adrs .EQU $03 ;adresa na displeji kom_8b .equ 00110000b ;komunikacny rezim 8 bit kom_4b .equ 00100000b ;komunikacny rezim 4 bit rez_1r .equ 00000000b ;rezim 1 riadkovy rez_2r .equ 00001000b ;rezim 2 riadkovy fon_5x7 .equ 00000000b ;fonty 5x7 bodov fon_5x10 .equ 00000100b ;fonty 5x10 bodov dis_off .equ 00001000b ;display nezobrazuje dis_on .equ 00001100b ;display zobrazuje cur_off .equ 00001000b ;cursor nezobrazit cur_on .equ 00001010b ;cursor zobrazit blk_off .equ 00001000b ;pismeno neblika blk_on .equ 00001001b ;pismeno blika clr_dis .equ 00000001b ;zmaz displej ddr_inc .equ 00000110b ;DDRAM increm. pri zapise (posuv vp) ddr_dec .equ 00000100b ;DDRAM decrem. pri zapise (posuv vl) shf_off .equ 00000100b ;posuv zn. ak dojde na kraj vypnuty shf_on .equ 00000101b ;posuv zn. ak dojde na kraj zapnuty scrol .equ 00011000b ;posuva cely riadok bez zmeny dat cursor .equ 00010000b ;posuva kurzor bez zmeny dat right .equ 00010100b ;do prava left .equ 00010000b ;do lava home_cur .equ 00000010b ;navrat kur. vlavo hore DDRAM ostava ddram .equ 10000000b ;adresa DDRAM cgram .equ 01000000b ;adresa CGRAM ;$16 ;$15 ;$14 ;$13 ;$12 ;$11 ;$10 ;zaciatok programu .ORG 0000h AJMP RUN .ORG 0030H RUN: mov sp,#50h mov p10,#00h mov p30,#0ffh mov adrs,#00h acall wait ;cakat 15 ms ; mov out_d,#kom_8b ; acall nastav ;najpr je nutne nastavit z 8 bitoveho rezimu ; mov out_d,#kom_8b ; acall nastav ;najpr je nutne nastavit z 8 bitoveho rezimu mov out_d,#kom_8b acall nastav ;najpr je nutne nastavit z 8 bitoveho rezimu mov out_d,#kom_4b ;do 4 bitoveho rezimu acall nastav ;nastavenie rezimu modulu 2riadky, znak 5 x 7 mov out_d,#(kom_4b | rez_2r | fon_5x7) ; | je za OR acall zap_ins ;vypnutie displeja,kurzora,blikania mov out_d,#(dis_off | cur_off | blk_off) acall zap_ins ;zapnutie displeja mov out_d,#(dis_on | cur_off | blk_off) acall zap_ins ;zmazanie displeja mov out_d,#(clr_dis) acall zap_ins ;nastavenie vstupneho rezimu,kurzor vpravo,DDRAM na 0 mov out_d,#(ddr_inc | shf_off) acall zap_ins ;toto je kompletna inicializacia modulu ;moze nasledovat samotny program ci data mov dptr,#txt mov r4,#0 zasa mov b,#8 zas inc r4 mov a,r4 movc a,@a+dptr mov znak,a acall zap_dat djnz b,zas mov a,r4 xrl a,#16 jz tu mov a,#(40h | ddram) mov out_d,a acall zap_ins sjmp zasa ; clr p34 tu jb p35,tu ajmp RUN zap_dat: ; mov a,adrs ;vysli adresu poziciu znaku na displ. ; orl a,#ddrm ;je potrebne vyslat ked chceme konkretne na nejaku ; mov out_d,a ;poziciu vyslat znaky alebo ak chceme do noveho riadku ; inc adrs ;staci len 40h a uz ci to sam inkementuje ; acall zapis ; acall citaj ; acall busy mov out_d,znak setb rs acall zap_ins clr rs acall busy ret ;15 ms pre 12MHz wait: push b mov b,#15 cy2 push b mov b,#0c6h cy1 nop nop nop djnz b,cy1 pop b djnz b,cy2 pop b ret wait2: mov b,#200 cy3 acall wait djnz b,cy3 ret ;nastavenie 4 bitovej komunikacie nastav: mov p10,out_d ;data pre 4 bit.komun setb e ;nastav E cc2 clr e setb rw ;r/w 1 cita z modulu setb e ;E -1 setb db7 ;nastav pre citanie jb db7,cc2 ;ak trva busy urob impulz clr e clr rw ret ;navrat, modul prijal instr. ;zapis do LCD data su v $00 zap_ins: clr rw ;nuluj R/W anl p10,#0fh ;priprav port mov a,out_d anl a,#0f0h orl p10,a ;zapis data na vystup acall clk_e anl p10,#0fh ;priprav port mov a,out_d swap a anl a,#0f0h orl p10,a ;zapis data na vystup acall clk_e acall busy ret ;citanie z LCD do adresy $01 citaj: setb rw orl p10,#%11110000 ;nastavit pre citanie setb e mov a,p10 ;do A daj port 0 clr e anl a,#0f0h ;odstran komunikacne bity mov in_d,a ;presun data setb e mov a,p10 anl a,#0f0h swap a ;otoc data orl in_d,a ;presun data, teraz su v $01 kompletne data od LCD clr rw ret ;je modul busy busy: clr p33 setb db7 setb rw q1 setb e jnb db7,nobusy clr e setb e clr e sjmp q1 nobusy clr e clr rw setb p33 ret clk_e: setb e ;nastav e do 1 clr e ;nastav e do 0 ret .org 0200h txt .text " Tx 145650MHz S27" .end