
;----------------------------------------------------------------------------
;
;
;  print messages on the lcd display.
;  Dptr-> message in rom terminated by 00h
;
;
;----------------------------------------------------------------------------
pstring
        clr     a
        movc    a,@a+dptr
        jz      lcdp_2
        lcall   lcd_data_wr
        inc     dptr
        sjmp    pstring
lcdp_2
        ret
;----------------------------------------------------------------------------
;
;
;  Print hex value in A to the lcd display
;
;
;----------------------------------------------------------------------------
phex
        push    a
        swap    a
        lcall   hex
        pop     a
hex
        anl     a,#0fh
        add     a,#30h
        cjne    a,#3ah,hex_1
hex_1
        jc      hex_2
        add     a,#7
hex_2
        lcall   lcd_data_wr
        ret
;----------------------------------------------------------------------------
;
;
;  Print packed bcd value in A to the lcd display
;
;
;----------------------------------------------------------------------------
pbcd    push    a
        swap    a
        anl     a,#0fh
        add     a,#'0'
        lcall   lcd_data_wr
        pop     a
        anl     a,#0fh
        add     a,#'0'
        ljmp    lcd_data_wr
;----------------------------------------------------------------------------
;
;
;  initialise the lcd display
;
;
;----------------------------------------------------------------------------
lcd_init
        mov     LCD_PORT,#0C0h
;
;  delay 150mS
;
        mov     a,#150
        lcall   delay_1ms
        mov     a,#3
        mov     LCD_PORT,#0C3h
        nop
        nop
        setb    LCD_DEN
        nop
        nop
        clr     LCD_DEN
;
;  delay 50mS
;
        mov     a,#50
        lcall   delay_1ms

        mov     LCD_PORT,#0C3h
        nop
        nop
        setb    LCD_DEN
        nop
        nop
        clr     LCD_DEN
;
;  delay 50mS
;
        mov     a,#50
        lcall   delay_1ms

        mov     LCD_PORT,#0C3h
        nop
        nop
        setb    LCD_DEN
        nop
        nop
        clr     LCD_DEN
;
;  delay 10mS
;
        mov     a,#10
        lcall   delay_1ms
        mov     LCD_PORT,#0C2h
        nop
        nop
        setb    LCD_DEN
        nop
        nop
        clr     LCD_DEN
;
;  delay 10mS
;
        mov     a,#10    ; 10 * 100uS =1mS
        lcall   delay_1ms
        mov     a,#2ch    ; 2 line mode
        lcall   lcd_comm_wr  ; write lcd command
;
;  delay 1mS
;
        mov     a,#100    ; 10 * 100uS =1mS
        lcall   delay_100u
        mov     a,#0ch    ; display on,cursor off
        lcall   lcd_comm_wr  ; write lcd command
;
;  delay 1mS
;
        mov     a,#10    ; 10 * 100uS =1mS
        lcall   delay_100u
        mov     a,#06h    ; auto inc,shift right
        lcall   lcd_comm_wr  ; write lcd command
        mov     a,#01h
        lcall   lcd_comm_wr  ; clear the display
;
;  delay 10mS
;
        mov     a,#1
        lcall   delay_1ms
        ret
;----------------------------------------------------------------------------
;
;  Locate the lcd cursor. lcd_comm_wr routine must follow below!
;  Cursor position in A
;  zaps: A,B
;
;
;----------------------------------------------------------------------------
locate_cursor
        cjne    a,#16,lc_1
lc_1
        jc      lc_2            ; if location < 16 (line #1)
        add     a,#30h          ; else add offset for 2nd line
lc_2
        setb    a.7             ; set bit 7 for locate cursor cmd
;----------------------------------------------------------------------------
;
;
;  send a command to the lcd display. command in A
;  Zaps: A,B
;
;----------------------------------------------------------------------------
lcd_comm_wr
        clr     LCD_RS
        mov     b,a             ;save the command
        swap    a               ;get hi nibble into low nibble
        anl     a,#0fh
        mov     c,a.0
        mov     P0.0,c
        mov     c,a.1
        mov     P0.1,c
        mov     c,a.2
        mov     P0.2,c
        mov     c,a.3
        mov     P0.3,c
        nop
        nop
        setb    LCD_DEN
        nop
        nop
        clr     LCD_DEN
        mov     a,b
        anl     a,#0fh
        mov     c,a.0
        mov     P0.0,c
        mov     c,a.1
        mov     P0.1,c
        mov     c,a.2
        mov     P0.2,c
        mov     c,a.3
        mov     P0.3,c
        nop
        nop
        setb    LCD_DEN
        nop
        nop
        clr     LCD_DEN
;
;  delay for lcd controller
;
        mov     b,#25      ;at least 40uS
ldrw_1
        djnz    b,ldrw_1    ;waste some time
        ret
;******************************************************************************
;
;
;  send data to the lcd display. command in A
;  zaps: A,B
;
;
;******************************************************************************
lcd_data_wr
        mov     b,a      ;save the command
        swap    a      ;get hi nibble into low nibble
        anl     a,#0fh
        mov     c,a.0
        mov     P0.0,c
        mov     c,a.1
        mov     P0.1,c
        mov     c,a.2
        mov     P0.2,c
        mov     c,a.3
        mov     P0.3,c
        setb    LCD_RS
        nop
        nop
        setb    LCD_DEN
        nop
        nop
        clr     LCD_DEN
        mov     a,b
        anl     a,#0fh
        mov     c,a.0
        mov     P0.0,c
        mov     c,a.1
        mov     P0.1,c
        mov     c,a.2
        mov     P0.2,c
        mov     c,a.3
        mov     P0.3,c
        setb    LCD_RS
        nop
        nop
        setb    LCD_DEN
        nop
        nop
        clr     LCD_DEN
;
;  delay for lcd controller
;
        mov     b,#25      ;at least 40uS
ldrw_2
        djnz    b,ldrw_2    ;waste some time
        ret
;----------------------------------------------------------------------------
;
;
;  Delay routine. A has # of 100 microseconds to delay
;  zaps: A,B
;
;
;----------------------------------------------------------------------------
delay_100u
        mov     b,#54      ;@12.xxx mhz approx!
dly_1
        djnz    b,dly_1
        djnz    a,delay_100u
        ret
;----------------------------------------------------------------------------
;
;
;  Delay routine. A has # of 1 milliseconds to delay
;  zaps: A,B
;
;
;----------------------------------------------------------------------------
delay_1ms
        mov     b,#120      ;@12.xxx mhz approx!
dly_2
        nop
        nop
        nop
        nop
        nop
        nop
        djnz    b,dly_2
        djnz    a,delay_1ms
        ret

