RS_LCD          EQU     P3.7            ; instruct or data command LCD
RW_LCD          EQU     P3.0            ; read or write command LCD
CS_LCD          EQU     P3.1            ; chip select LCD

DATA_BUS        EQU     P1              ; 8 bit data bus

                ORG     0

main:           call    initialize

                mov     a,#0            ; set cursor to addr 0
                acall   goto_lcd
                mov     dptr,#str1      ; string 1
                acall   put_str

                mov     a,#40h          ; set curser to addr 40h
                acall   goto_lcd
                mov     dptr,#str2      ; string 2
                acall   put_str

                sjmp    $


initialize:     call    init_lcd        ; Initial LCD
                ret


                ;initialize character LCD ,5*7 dot,4 line

init_lcd:       mov     a,#15           ; delay 15 ms when power on
                acall   delay_ms

                mov     a,#38h          ; function set
                acall   write_ins_lcd
                mov     a,#5            ; delay 5 ms when power on
                acall   delay_ms

                mov     a,#38h          ; function set
                acall   write_ins_lcd
                mov     a,#1            ; delay 1 ms when power on
                acall   delay_ms

                mov     a,#38h          ; function set
                acall   write_ins_lcd
                acall   busy_lcd

                mov     a,#38h          ; function set
                acall   write_ins_lcd
                acall   busy_lcd

                mov     a,#0ch          ; display on/off
                acall   write_ins_lcd
                acall   busy_lcd

                mov     a,#06h          ; entry mode set
                acall   write_ins_lcd
                acall   busy_lcd

                acall   clr_lcd         ; clr display
                ret


                ; Write ADCII to LCD the value in the accumulator.

write_lcd:      push    acc
                setb    RS_LCD          ; data reg. (DR)
                clr     RW_LCD          ; write data
                setb    CS_LCD          ; enable strobe

                mov     DATA_BUS,acc    ; write data
                clr     CS_LCD          ; disable LCD
                acall   delay_40us      ; wait for excution time 40 uS

                acall   busy_lcd        ; chack busy
                pop     acc
                ret


                ; Read busy flag LCD

busy_lcd:       clr     RS_LCD          ; instruction reg. (IR)
                setb    RW_LCD          ; read data
                setb    CS_LCD          ; eanble strobe

wait_bl:        mov     a,#0ffh         ; clear data bus
                mov     a,DATA_BUS      ; read command
                jb      acc.7,wait_bl   ; wait BF flag is clr

                clr     CS_LCD          ; disable LCD
                ret


                ; clear display and set DD ram address 0

clr_lcd:        mov     a,#1            ; clear command
                acall   write_ins_lcd   ; write instruct

                mov     a,#2            ; delay 2 mS
                acall   delay_ms

                acall   busy_lcd        ; chack busy
                ret


                ; cursor on

cur_on:         mov     a,#00fh         ; D=1, C=1, B=1;
                acall   write_ins_lcd   ; write instruct

                mov     a,#2            ; delay 2 mS
                acall   delay_ms

                acall   busy_lcd        ; check busy
                ret


                ; cursor on

cur_off:        mov     a,#00ch         ; D=1, C=1, B=1;
                acall   write_ins_lcd   ; write instruct

                mov     a,#2            ; delay 2 mS
                acall   delay_ms

                acall   busy_lcd        ; check busy
                ret


                ; set DD ram address 0

return_home_lcd:mov     a,#2            ; return home command
                acall   write_ins_lcd   ; write instruct

                mov     a,#2            ; delay 2 mS
                acall   delay_ms

                acall   busy_lcd        ; check busy
                ret


                ; set DD ram address the value in the accumulator.

goto_lcd:       setb    acc.7           ; set DD ram command
                acall   write_ins_lcd   ; write instruct
                acall   delay_40us      ; wait for excution time 40 uS

                acall   busy_lcd        ; check busy
                ret

 

write_ins_lcd:  clr     RS_LCD          ; instruction reg. (IR)
                clr     RW_LCD          ; write data
                setb    CS_LCD          ; eanble strobe

                mov     DATA_BUS,acc    ; write commnad
                clr     CS_LCD          ; disable LCD
                ret


                ; Delay for one mS times the value in the accumulator. X'TAL 12 MHz

delay_ms:       push    acc             ; 2 uS
                push    b               ; 2 uS

                mov     b,#241          ; 2 uS
dm:             djnz    b,$             ; 2 uS ,248 * 2 = 496
                mov     b,#249          ; 2 uS
                djnz    b,$             ; 2 uS ,249 * 2 = 498
                mov     b,#248          ; 2 uS
                djnz    acc,dm          ; 2 uS

                pop     b               ; 2 uS
                pop     acc             ; 2 uS

                ret                     ; 2 uS


                ; Delay for 40 uS timers the value in the accumulator. X'TAL 12 MHz

delay_40us:     push    acc             ; 2 uS
                mov     a,#15           ; 2 uS

                djnz    acc,$           ; 2 uS ,15 * 2 = 30

                pop     acc             ; 2 uS
                ret                     ; 2 uS


                ; Write LCD in program momory
                ; Input dptr = data pointer

put_str:        acall   goto_lcd

put_str1:       clr     a               ; clear accumulator
                movc    a,@a+dptr       ; get charecter into accumulator
                jz      end_put_str     ; jump if charecter is end of file (00h)
                acall   write_lcd       ; put charecter to LCD
                inc     dptr
                sjmp    put_str1        ; next charecter

end_put_str:    inc     dptr
                ret

str1:           DB      "* Test LCD *",0
str2:           DB      "dh_servis",0

                END

Vytisknout stránku

Zpátky Zpátky
© DH servis 2002 -