.include "C:\Program Files\Atmel\AVR Tools\Library\LCD.inc"
.CSEG 
Lcd4Init:     rcall LcdDelay1s
              ldi   rmp, cLcdWrite
			  out   pLcdDdr, rmp
              ldi   rmp, CLcdDummy
			  rcall Lcd4Set
			  rcall LcdDelay5ms
			  ldi   rmp, cLcdDummy
			  rcall Lcd4Set
			  rcall LcdDelay5ms
			  ldi   rmp, cLcdDummy
			  rcall Lcd4Set
			  rcall LcdDelay5ms
			  ldi   rmp, 0b00101000  ;function set to 4 bit 2rows 5x7
			  rcall Lcd4Ctrl
			  ldi   rmp, 0b00010100   ;Cursor display shift right
			  rcall Lcd4Ctrl
			  ldi   rmp, 0b00001100   ;Lcd-On Cursor-Off Blinking-Off 
			  rcall Lcd4Ctrl
			  ldi   rmp, 0b00000100   ;Entry mode R/L
			  rcall Lcd4Ctrl

Lcd4Clear:    ldi   rmp, 0b00000001   ;Set Lcd clear
              rcall Lcd4Ctrl

Lcd4Home:     ldi   rmp, 0b00000010   ;SetLcd Home Position

Lcd4Ctrl:     push  rmp               ;save data
              andi  rmp, mLcdData     ;mask off uneeded
			  rcall Lcd4Set           ;send upper nibble
			  pop   rmp               ;restore data 
			  swap  rmp               ;swap nibbles.
			  andi  rmp, mLcdData     ;mask off uneeded  
			  rcall Lcd4Set           ;send lower nibble
			  rjmp  LcdDelay5ms       ;procees command in LCD
			  

Lcd4PBcd:     push  rmp
              swap  rmp
			  rcall Lcd4PBcd1
			  pop   rmp
Lcd4PBcd1:    andi  rmp, mLcdData
              ori   rmp, 0x30

Lcd4Char:     push  rmp             ;save .. send upper nibble
              andi  rmp, mLcdData   ;mask off uneeded data
			  sbr   rmp, bLcdRs     ;set RS
			  rcall Lcd4Set         ;sent to Lcd
			  pop   rmp             ;restore
			  swap  rmp             ;get     send lower nibble
			  andi  rmp, mLcdData   ;mask off uneeded data
			  sbr   rmp, bLcdRs     ;set RS
			  rcall Lcd4Set         ;sent to Lcd 
			  cbi   pLcdPort, bLcdRs ;clear RS
			  rjmp  LcdDelay50us     ;wait for command to complete

			     
Lcd4Set:      out   pLcdPort, rmp    ;write data to LCD
              nop
			  sbi   pLcdPort, bLcdEn ;strobe LCD
			  enactive               ;small delay
			  cbi   pLcdPort, bLcdEn  
			  nop
			  ret
              

LcdDelay1s:   ldi  rmp, c1s
LcdDelay1s1:  rcall LcdDelay5ms
              dec   rmp
			  brne  LcdDelay1s1
			  ret


LcdDelay5ms:  push  ZH
              push  ZL
			  ldi   ZH, High(c5ms)
			  ldi   ZL, Low(c5ms)
LcdDelay5ms1: sbiw  ZL, 1
              brne  LcdDelay5ms1
			  pop   ZL
			  pop   ZH
			  ret


LcdDelay50us: ldi   rmp, c50us
LcdDelay50us1:nop
              dec rmp
			  brne  LcdDelay50us1
			  ret



Lcd4Txt:      sbr rmp, 0b10000000  ;display data ram
              rcall    Lcd4Ctrl
Lcd4Txt1:     lpm
              tst      R0
              breq     Lcd4Txtr
			  mov      rmp,R0
			  rcall    Lcd4Char
			  adiw     ZL, 1
			  rjmp     Lcd4Txt1
Lcd4Txtr:     ret

Lcd4RTxt:     mov      R0, rmp
Lcd4RTxt1:    ld       rmp, Z+
              rcall    Lcd4Char
			  dec      R0
			  brne     Lcd4RTxt1
			  ret

LcdMsg:       push rmp       ;save rmp
LcdMsg1:      lpm            ;get data in z
              mov rmp,r0 
              cpi rmp, 0x7e  ;is character eom '~' 
			  breq LcdDone   ;yes done
			  rcall Lcd4Char ;display character
			  adiw ZL, 1     ;move index 
			  rjmp LcdMsg1   ;do again
LcdDone:      pop rmp        ;restore rmp
              ret
 
