***********************************************
          *   Ime programa:lcd_4bit.asm
*
          *  Ovaj listing je vlasništvo časopisa mikroElektronika.
          *  Dozvoljeno je kopiranje i korišćenje programa u 
          *  njegovom izvornom obliku 
          *  © Copyright 1998,99 mikroElektronika
*
*  Autor:Tomislav Ratić
************************************************
* OPIS: - Program za testiranje Smart LCD-a pomocu 4-bitnog
*             data interfejsa.
* NAPOMENE: - Program NE koristi proveravanje Busy-ja
* LCD-a vec softverska kasnjenja
*************************************************
Poc_adresa equ 8000h
 
org Poc_adresa
ljmp Inic
*************************************************
* Inicijalizacija sistema
************************************************* 
org Poc_adresa+100h
Inic: lcall LCD_inic ;Inicijalizcija LCD-a
*************************************************
* Glavni program
*************************************************
START: mov a,#LCD_Start_I_red ;Poc. mesto prvog reda na
lcall LCD_status ;LCD-u za ispis.
mov a,#’M’ ;Slovo ‘M’ za ispis.
lcall LCD_putc ;Poziv ppr. za ispis na LCD
mov a,#’i’ ;Slovo ‘i’ za ispis.
lcall LCD_putc
mov a,#’k’ ;Slovo ‘k’ za ispis.
lcall LCD_putc
mov a,#’r’ ;Slovo ‘r’ za ispis.
lcall LCD_putc
mov a,#’o’ ;Slovo ‘o’ za ispis.
lcall LCD_putc
mov a,#’e’ ;Slovo ‘e’ za ispis.
lcall LCD_putc
mov a,#’l’ ;Slovo ‘l’ za ispis.
lcall LCD_putc
mov a,#’e’ ;Slovo ‘e’ za ispis.
lcall LCD_putc
mov a,#LCD_Start_II_red ;Poc. mesto drugog reda na
;LCD-u za ispis.
lcall LCD_status
mov a,#’k’ ;Slovo ‘k’ za ispis.
lcall LCD_putc
mov a,#’t’ ;Slovo ‘t’ za ispis.v
lcall LCD_putc
mov a,#’r’ ;Slovo ‘r’ za ispis.
lcall LCD_putc
mov a,#’o’ ;Slovo ‘o’ za ispis.
lcall LCD_putc
mov a,#’n’ ;Slovo ‘n’ za ispis.
lcall LCD_putc
mov a,#’i’ ;Slovo ‘i’ za ispis.
lcall LCD_putc
mov a,#’k’ ;Slovo ‘k’ za ispis.
lcall LCD_putc
mov a,#’a’ ;Slovo ‘a’ za ispis.
lcall LCD_putc
mov r0,#20d ;Kasnjenje (20x10ms)
lcall Delay_10ms ;
mov dptr,#LCD_DB ;Display clear
mov A,#6d ;
lcall LCD_inic_status ;
mov r0,#10d ;Kasnjenje (10x10ms)
lcall Delay_10ms ;
sjmp START
 
*********************************************
* Rutina za kasnjenje (T= r0 x 10ms)
*********************************************
Delay_10ms: mov r5,00h ; 1+(1+(1+2*r7+2)*r6+2)*r5
mov r6,#100d ; priblizno (ako je r7>10)
mov r7,#100d ; 2*r5*r6*r7
djnz r7,* ; * oznacava tekucu naredbu.
djnz r6,*-4
djnz r5,*-6
ret
*********************************************
* POTPROGRAM: LCD_inic
* OPIS: Potprogram za inicijalizaciju smart LCD-a.
* (vazi za 4b interfejs, pod uslovom da DB4-7 LCD-a
* odgovaraju pinovima porta PX.4-7, na koji je LCD
* povezan, tj. koristi se gornji nibl porta.)
*
* ULAZ: Statusna rec - acc.
*
* NAPOMENE: U potprogramu je potrebno definisati pinove za
* kontrolu LCD-a - LCD_enable, LCD_read_write,
* LCD_reg_select, i port na koji se LCD prikljucuje.
* Potrebno je definisati i adrese pocetaka redova LCD-a.
* U potprogramu su definisane neke od mogucih statusnih
* reci koje se mogu menjati po zelji.
******************************************** 
LCD_enable .reg P1.3 ;Bit za kontrolu E pina na LCD-u.
LCD_reg_select .reg P1.2 ;Bit za kontrolu RS pina na LCD-u.
LCD_read_write .reg P1.1 ;Bit za kontrolu RW pina na LCD-u.
LCD_port .reg P1 ;Port na koji je prikacen LCD.
Busy .reg P1.7 ;Pin porta na kome je Busy.
LCD_Start_I_red .equ 80h ;Pocetak prvog reda na LCD-u.
LCD_Start_II_red .equ c0h ;Pocetak drugog reda na LCD-u.
LCD_DB: .db 00111000b ;0 -8b, 2 reda, 5x7 tacaka
.db 00101000b ;1 -4b, 2 reda, 5x7 tacaka
.db 00011000b ;2 -Shift display
.db 00001100b ;3 -Disp ON, cursor OFF, no blinking
.db 00000110b ;4 -Increment mod, freeze display
.db 00000010b ;5 -Display & cursor home
.db 00000001b ;6 -Display clear
.db 00001000b ;7 -Disp OFF, cursor OFF, no blinking
LCD_inic:*********************************** 
mov dptr,#LCD_DB
mov a,#00d ;Trostruka 8-bitna
call LCD_inic_status_8 ;inicijalizacija
mov a,#00d ;(zbog moguceg neuspesnog
lcall LCD_inic_status_8 ;reseta LCD-a pri
mov a,#00d ;ukljucenju uredjaja)
lcall LCD_inic_status_8 ;
mov a,#1d ;Prelaz sa 8-bitnog
lcall LCD_inic_status_8 ;interfejsa na 4-bitni.
mov a,#1d ;
lcall LCD_inic_status ;
mov a,#3d ;Nastavak inicijalizacije
lcall LCD_inic_status ;4-bitnim interfejsom.
mov a,#6d ;
lcall LCD_inic_status ;
mov a,#4d ;
lcall LCD_inic_status ;
ret
LCD_inic_status_8:****************************
push b
movc a,@a+dptr
clr LCD_reg_select ;RS=0 - Instruk. registar
clr LCD_read_write ;R/W=0 - Write
mov b,LCD_port ;Cuvanje donjeg nibla LCD porta.
orl b,#11110000b ;
orl a,#00001111b ;Setovanje donjeg nibla acc.
anl a,b ;Upis gornjeg nibla akumulatora.
mov LCD_port,a ;Posalji podatak na LCD_port
setb LCD_enable ;EN=1 - Generisanje opadajuce
clr LCD_enable ;EN=0 ivice na EN pinu LCD-a
mov b,#255d ;Kasnjenje zbog inicijalizacije
djnz b,* ;posle moguceg neuspesnog
djnz b,* ;reseta prilikom ukljucenja
djnz b,* ;napajanja.
pop b
ret
LCD_inic_status:**************************
movc a,@a+dptr
lcall LCD_status
ret
****************************************
* POTPROGRAM: LCD_status
* OPIS: Potprogram za odredjivanje statusa smart LCD-a.
*
* ULAZ: Statusna rec - acc.
* NAPOMENE: NE koristi se Busy vec softverska kasnjenja.
*****************************************
LCD_status: push b
mov b,#255d ;Kasnjenje zbog Busy-ja.
djnz b,*
djnz b,*
djnz b,*
clr LCD_reg_select ;RS=O - Instrukc. registar
call LCD_port_out
swap a ;Zamena nibla za ispis
djnz b,* ;Kasnjenje zbog Busy-ja.
djnz b,*
djnz b,*
clr LCD_reg_select ;RS=0 - Instrukc. registar
call LCD_port_out
pop b
ret
*************************************
* POTPROGRAM: LCD_putc
* OPIS: Potprogram za ispis karaktera na smart LCD-u.
*
* ULAZ: Podatak za ispis na display - acc.
* NAPOMENE: NE koristi se Busy vec softverska kasnjenja.
***************************************
LCD_putc: push b
mov b,#255d ;Kasnjenje zbog Busy-ja.
djnz b,*
setb LCD_reg_select ;RS=1 - Data registar
call LCD_port_out
swap a ;Zamena nibla za ispis
djnz b,* ;Kasnjenje zbog Busy-ja.
setb LCD_reg_select ;RS=1 - Data registar
call LCD_port_out
pop b
ret
***********************************
* POTPROGRAM: LCD_port_out
* OPIS: Potprogram za slanje podatka (instrukcije ili
* karaktera) ka smart LCD-u.
*
* ULAZ: Podatak za ispis na display - acc.
***********************************
LCD_port_out: push a
push b
mov b,LCD_port ;Cuvanje donjeg nibla LCD porta.
orl b,#11110000b ;
orl a,#00001111b ;Setovanje donjeg nibla acc.
anl a,b ;Upis gornjeg nibla akumulatora.
mov LCD_port,a ;Posalji podatak na LCD_port
 
setb LCD_enable ;EN=1 - Generisanje opadajuce
clr LCD_enable ;EN=0 ivice na EN pinu LCD-a
pop b
pop a
ret
end

C o p y r i g h t  1998 mikroElektronika. All Right Reserved. Za sva pitanja obratite se redakciji