- ***********************************************
- *
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
|