;Written by Peter Averill
;LCD demo program
;Victoria University
;Electronics Technology
;
$mod2051 
CR          EQU   0dh          ; carriage return
LF          EQU   0ah          ; line feed
;lcd equates
rs          equ   p1.2
en          equ   p1.3
db4         equ   p1.4
db5         equ   p1.5
db6         equ   p1.6
db7         equ   p1.7
count       equ   r0
datcom      bit   0
            DSEG  AT 0020H
            ORG   0030H        ; stack origin
stack:      DS    20H          ; stack depth
;
            CSEG
            ORG   0000H        ; power on/reset vector
            Jmp   cold_start
            ORG   0003H        ; external interrupt 0 vector
            Reti               ; undefined
            ORG   000BH        ; timer 0 overflow vector
            reti
            ORG   0013H        ; external interrupt 1 vector
            Reti               ; undefined
            ORG   001BH        ; timer 1 overflow vector
            reti               ; undefined
            ORG   0023H        ; serial I/O interrupt vector
            reti
;
            ORG   40H          ; begin constant data space
setup:      DB    033h,032h,028h,00eh
            db    002h,001h,0ffh
mess:       db    'Victoria Uni',0ffh
mess1:      db    'Electronics',0ffh
;
;
            USING  0           ; register bank zero
cold_start:
            mov   sp, #(stack-1) ; initialize stack pointer
            mov   a,#0ffh
            call  delay_ms
            clr   datcom       ;send commands
            mov   dptr, #setup ;lcd setup string
            call  send_string
            setb  datcom       ;send data
            mov   dptr, #mess
            call  send_string
            mov   a,#0c0h      ;select second row of lcd
            clr   datcom       ;send command
            call  send_char
            mov   dptr, #mess1
            setb  datcom       ;send data
            call  send_string
repeat:
            jmp   repeat
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
send_string:
; Transmit string pointed to by DPTR.
; String may be of any length, but must be null-terminated.
            Push  acc
            push  dpl
            push  dph
ss1:
            clr   a
            movc  a, @a+dptr  ; get character
            inc   a
            jz    ss2          ; check for terminator
            dec   a
            call  send_char    ; send character
            inc   dptr         ; point to next character
            jmp   ss1
ss2:
            pop   dph
            pop   dpl
            pop   acc
            ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
send_char:  mov   c,datcom
            mov   rs,c
            clr   en
            mov   c,acc.4
            mov   db4,c
            mov   c,acc.5
            mov   db5,c
            mov   c,acc.6
            mov   db6,c
            mov   c,acc.7
            mov   db7,c
            setb  en
            clr   en
            push  acc
            mov   a,#4h
            call  delay_ms
            pop   acc
            mov   c,acc.0
            mov   db4,c
            mov   c,acc.1
            mov   db5,c
            mov   c,acc.2
            mov   db6,c
            mov   c,acc.3
            mov   db7,c
            setb  en
            clr   en
            mov   a,#4h
            call  delay_ms
            ret
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay_ms:
; Delay for one mS times the value in the accumulator.
            Push  acc
            push  b
            mov   b, #0
dd:
            djnz  b, $         ; 500 uS @ 12 MHz
            djnz  b, $         ; 500 uS @ 12 MHz
            djnz  acc, dd
            pop   b
            pop   acc
            ret
;
            end
