;*****************Part 2*****************
; by: Eng'r Roland Michael A. dela Peña *
;****************************************

	LIST            P=16F84
	ERRORLEVEL      -302
	#INCLUDE P16F84.INC
;************************************************************
; REGISTER DEFINITIONS
;************************************************************
	CBLOCK	0CH
		SEC	  ; ONES FOR SECONDS
		SECT	  ; TENS FOR SECONDS
		MIN	  ; ONES FOR MINUTES
		MINT	  ; TENS FOR MINUTES
		HOUR	  ; ONES FOR HOURS
		HOURT	  ; TENS FOR HOURS
		DAY	  ; ONES FOR DAYS
		DAYT	  ; TENS FOR DAYS
		CLOCKVAR  ; VARIABLE REGISTER FOR DISPLAYING CLOCK
		ROLAND	  ; VARIABLE REGISTER (SEND CHARACTER TO LCD)
		BUFFER	  ; DATA BUFFER
		COUNT	  ; BIT COUNTER
		CALLS	  ; VARIABLE REGISTER FOR DISPLAYING CALLS
		DUR	  ; VARIABLE REGISTER FOR DISPLAYING DURATION
		CLOCK	  ; SHIFT COUNTER FOR ROTATING INSTRUCTIONS
		CLOCK1	  ; VARIABLE REGISTER FOR DISPLAYING CLOCK
		FADECHAR1 ; INDICATOR FOR BLINKING CHARACTER
		FADECHAR  ; INDICATOR FOR BLINKING CHARACTER
		FLASH	  ; INDICATOR FOR BLINKING CHARACTER
		ADDR	  ; VARIABLE REGISTER (LCD ADDRESS)
		SFTCNT	  ; SHIFT LOOP COUNTER
		LOOP	  ; DELAY LOOP COUNTER
		LOOPS	  ; DELAY LOOP COUNTER
		LOOPS2	  ; DELAY LOOP COUNTER
		LOOPS3	  ; DELAY LOOP COUNTER
	ENDC 
;************************************************************
; BIT DEFINITIONS
;************************************************************
	RS	EQU	3 ; LCD REGISTER SELECT CONTROL LINE
	RW	EQU	2 ; LCD READ/WRITE CONTROL LINE
	E	EQU	1 ; LCD ENABLE CONTROL LINE
	BUSY	EQU	4 ; BUSY BIT
	CLK	EQU	6 ; CLOCK BIT
	DAT	EQU	7 ; DATA BIT
;************************************************************************
;THIS PART INITIALIZES THE PORTS AND OTHER PHERIPERALS IN MICROCONTROLLER
;************************************************************************
	ORG 	0000h 		; SET POWER ON RESET VECTOR.
	CALL FORTY		; SET DD RAM ADDRESS TO 40h (FOR 2ND LINE).
	CLRF	DUR		; RESET THE SELECTED REGISTERS.
	CLRF	CLOCK
	CLRF	CLOCK1
	CLRF	CLOCKVAR
	BSF 	STATUS,RP0	; SET BANK = 1.
        BCF	OPTION_REG,7	; ENABLE BUILT-IN PULL-UP RESISTORS.
       	MOVLW 	b'11000000'	; SET RB6,RB7 TO INPUT
        MOVWF   TRISB           ; AND RB0,RB1,RB2,RB3,RB4,RB5 TO OUTPUT.
	MOVLW	b'00000000'	; SET RA0,RA1,RA2,RA3,RA4 TO OUTPUT.
	MOVWF	TRISA		
        BCF 	STATUS,RP0	; SET BANK = 0.
;**************************************************************
; THIS ROUTINE INITIALIZE LCD.
;**************************************************************
	MOVLW	d'15'
	MOVWF	LOOPS
	CALL WAIT		; WAIT FOR 15ms UNTIL Vcc RISES TO 4.5V.

	CLRF	PORTB		; CLEAR CONTROL LINES.
	CALL INITLCD

	MOVLW	d'5'
	MOVWF	LOOPS
	CALL WAIT		; WAIT FOR 5ms MORE.

	CALL INITLCD

	MOVLW	d'1'
	MOVWF	LOOPS
	MOVLW	d'20'
	MOVWF	LOOPS2
	CALL TOP		; WAIT FOR 100us MORE.

	CALL INITLCD

	CALL INITLCD

	MOVLW	b'00101000'
	CALL SENDCMD		; SEND COMMAND FOR 4-BIT INTERFACE.
	CALL INIT_LCD		; SEND COMMAND FOR DISPLAY-ON, RETURN HOME & 
	MOVLW	b'00000110'	; CLEAR DISPLAY.
	CALL SENDCMD		; SEND COMMAND FOR ENTRY MODE SET.
;*************************************************************
; CHARACTER GENERATOR
; THIS ROUTINE DRAW A TELEPHONE TO THE LCD
;*************************************************************
	MOVLW	b'01000000'
	CALL SENDCMD		; SEND CG RAM ADDRESS.
	CALL CHARGEN6		; SEND FIRST CHARACTER.
	CALL CHARGEN5	
	CALL CHARGEN4
	MOVLW	b'00001000'
	CALL SENDCHAR
	MOVLW	b'00010000'
	CALL SENDCHAR
	MOVLW	b'00010001'
	CALL SENDCHAR	
	CALL CHARGEN1
	CALL CHARGEN12
	CALL CHARGEN2		; SEND SECOND CHARACTER.
	CALL CHARGEN2		; SEND THIRD CHARACTER.
	CALL CHARGEN6		; SEND FORTH CHARACTER.
	CALL CHARGEN9	
	CALL CHARGEN4
	CALL CHARGEN12
	CALL CHARGEN16
	MOVLW	b'00010001'
	CALL SENDCHAR
	CALL CHARGEN1
	CALL CHARGEN13
	CALL CHARGEN12		; SEND FIFTH CHARACTER.
	CALL CHARGEN10
	CALL CHARGEN5
	CALL CHARGEN14		; SEND SIXTH CHARACTER.
	CALL CHARGEN1
	CALL CHARGEN14
	CALL CHARGEN1
	CALL CHARGEN14	
	CALL CHARGEN8
	CALL CHARGEN15		; SEND SEVENTH CHARACTER.
	CALL CHARGEN1
	CALL CHARGEN15
	CALL CHARGEN1
	CALL CHARGEN15
	CALL CHARGEN8
	CALL CHARGEN13		; SEND EIGHTH CHARACTER.
	CALL CHARGEN10
	CALL CHARGEN9
;*************************************************************
; INTRODUCTION
; THIS ROUTINE DISPLAY THE INTRODUCTION
; YOU WILL SEE THE TELEPHONE ICON AND THE TITLE OF THE
; PROJECT "PREV. CALL MONITORING
; AFTER 3 SEC. OF DELAY THE NAMES OF THE ENGINEERS OF THIS
; PROJECT APPEARS "  By: Jermyn,
;	           Joseph, Rico and"
;*************************************************************
	CALL ADDRESS0		; SEND DD RAM ADDRESS (1ST LINE).
	CALL CHARGEN6		; DISPLAY ONE PART OF THE TELEPHONE DRAWING.
	CALL CHARGEN16		; DISPLAY ONE PART OF THE TELEPHONE DRAWING.
	CALL CHARGEN12		; DISPLAY ONE PART OF THE TELEPHONE DRAWING.
	CALL CHARGEN5		; DISPLAY ONE PART OF THE TELEPHONE DRAWING.
	CALL CHARGEN11		; DISPLAY ASCII CHARATER " ".
	CALL P			; DISPLAY ASCII CHARACTER "P".
	CALL R			; DISPLAY ASCII CHARACTER "R".
	MOVLW	'E'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "E".
	MOVLW	'V'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "V".
	CALL PERIOD		; DISPLAY ASCII CHARACTER ".".
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	MOVLW	'C'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "C".
	MOVLW	'A'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "A".
	MOVLW	'L'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "L".
	MOVLW	'L'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "L".
	MOVLW	b'11000000'
	CALL SENDCMD		; SEND DD RAM ADDRESS (2ND LINE). 
	CALL CHARGEN4		; DISPLAY ONE PART OF THE TELEPHONE DRAWING.
	CALL CHARGEN20		; DISPLAY ONE PART OF THE TELEPHONE DRAWING.
	CALL CHARGEN17		; DISPLAY ONE PART OF THE TELEPHONE DRAWING.
	MOVLW	b'00000111'
	CALL SENDCHAR		; DISPLAY ONE PART OF THE TELEPHONE DRAWING.
	CALL CHARGEN11		; DISPLAY ASCII CHARATER " ".
	MOVLW	'M'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "M".
	MOVLW	'O'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "O".
	MOVLW	'N'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "N".
	MOVLW	'I'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "I".
	MOVLW	'T'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "T".
	MOVLW	'O'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "O".
	CALL R			; DISPLAY ASCII CHARACTER "R".
	MOVLW	'I'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "I".
	MOVLW	'N'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "N".
	MOVLW	'G'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "G".
	CALL WAIT1		; WAIT FOR 3 SEC.
	CALL INIT_LCD		; RESET THE LCD.
	MOVLW	b'10000010'
	CALL SENDCMD		; SEND DD RAM ADDRESS (1ST LINE).
	MOVLW	'B'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "B".
	CALL y			; DISPLAY ASCII CHARACTER "y".
	CALL COLON		; DISPLAY ASCII CHARACTER ":".
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	MOVLW	'J'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "J".
	CALL e			; DISPLAY ASCII CHARACTER "e".
	CALL r			; DISPLAY ASCII CHARACTER "r".
	CALL m			; DISPLAY ASCII CHARACTER "m".
	CALL y			; DISPLAY ASCII CHARACTER "y".
	CALL n			; DISPLAY ASCII CHARACTER "n".
	MOVLW	','
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER ",".
	CALL ADDRESS1		; SEND DD RAM ADDRESS (2ND LINE). 
	MOVLW	'J'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "J".
	CALL o			; DISPLAY ASCII CHARACTER "o".
	CALL s			; DISPLAY ASCII CHARACTER "s".
	CALL e			; DISPLAY ASCII CHARACTER "e".
	CALL p			; DISPLAY ASCII CHARACTER "p".
	CALL h			; DISPLAY ASCII CHARACTER "h".
	MOVLW	','
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER ",".
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	CALL R			; DISPLAY ASCII CHARACTER "R".
	CALL i			; DISPLAY ASCII CHARACTER "i".
	CALL c			; DISPLAY ASCII CHARACTER "c".
	CALL o			; DISPLAY ASCII CHARACTER "o".
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	CALL and		; DISPLAY "and".
	CALL WAIT1		; WAIT ANOTHER 3 SEC.
;*************************************************************
; CHARACTER GENERATOR
; THIS ROUTINE DRAW A FACE TO THE LCD
;*************************************************************
	MOVLW	b'01000000'
	CALL SENDCMD		; SEND CG RAM ADDRESS.
	CALL CHARGEN16		; SEND FIRST CHARACTER.
	CALL CHARGEN17
	CALL CHARGEN18
	MOVLW	b'00001100'
	CALL SENDCHAR	
	MOVLW	b'00011001'
	CALL SENDCHAR
	CALL CHARGEN19
	MOVLW	b'00011100'
	CALL SENDCHAR
	CALL CHARGEN9
	CALL CHARGEN9		; SEND SECOND CHARACTER.
	CALL CHARGEN17
	CALL CHARGEN14
	MOVLW	b'00011101'
	CALL SENDCHAR
	CALL CHARGEN5
	CALL CHARGEN1
	MOVLW	b'00011011'
	CALL SENDCHAR
	CALL CHARGEN20
	MOVLW	b'00011100'
	CALL SENDCHAR		; SEND THIRD CHARACTER.
	CALL CHARGEN19
	CALL CHARGEN17
	CALL CHARGEN17
	CALL CHARGEN12
	CALL CHARGEN12
	CALL CHARGEN5
	CALL CHARGEN12
	CALL CHARGEN16		; SEND FORTH CHARACTER.
	CALL CHARGEN20
	CALL CHARGEN12
	CALL CHARGEN19
	CALL CHARGEN4
	MOVLW	b'00010100'
	CALL SENDCHAR
	MOVLW	b'00001100'
	CALL SENDCHAR
	CALL CHARGEN4
;*************************************************************
; 3 SEC. DELAY THE FACE DRAWING APPEARS 
; WITH THE PROGRAMMER'S NAME " Roland
;				 Michael"
; THEN ANOTHER 3 SEC. DELAY THE INSTRUCTION APPEARS 
; "Press "*" to display calls" 
;*************************************************************	
	CALL INIT_LCD		; RESET THE LCD.
	MOVLW	b'10011001'
	CALL SENDCMD		; SEND DD RAM ADDRESS (1ST LINE).
	CALL CHARGEN6		; DISPLAY ONE PART OF THE FACE DRAWING.
	CALL CHARGEN16		; DISPLAY ONE PART OF THE FACE DRAWING.
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	CALL R			; DISPLAY ASCII CHARACTER "R".
	CALL o			; DISPLAY ASCII CHARACTER "o".
	CALL l			; DISPLAY ASCII CHARACTER "l".
	CALL and		; DISPLAY "and".
	MOVLW	b'11011001'
	CALL SENDCMD		; SEND DD RAM ADDRESS (2ND LINE). 
	CALL CHARGEN12		; DISPLAY ONE PART OF THE FACE DRAWING.
	CALL CHARGEN5		; DISPLAY ONE PART OF THE FACE DRAWING.
	CALL DOUBLE		; DISPLAY "  ".
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	MOVLW	'M'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "M".
	CALL i			; DISPLAY ASCII CHARACTER "i".
	CALL c			; DISPLAY ASCII CHARACTER "c".
	CALL h			; DISPLAY ASCII CHARACTER "h".
	CALL a			; DISPLAY ASCII CHARACTER "a".
	CALL e			; DISPLAY ASCII CHARACTER "e".
	CALL l			; DISPLAY ASCII CHARACTER "l".
	MOVLW	d'19'
	MOVWF	SFTCNT
SHIFTRIGHT
	CALL SFTRIGHT		; SHIFT TO THE RIGHT.
	CALL WAIT4
	DECFSZ	SFTCNT
	GOTO SHIFTRIGHT
	CALL SFTLEFT		; SHIFT TO THE LEFT.
	CALL WAIT4
	CALL SFTLEFT		; SHIFT TO THE LEFT.
	CALL WAIT4
	CALL SFTLEFT		; SHIFT TO THE LEFT.
	CALL WAIT5
	CALL SFTLEFT		; SHIFT TO THE LEFT.
	CALL WAIT5
	CALL SFTRIGHT		; SHIFT TO THE RIGHT.
	CALL WAIT6
	CALL SFTRIGHT		; SHIFT TO THE RIGHT.
	CALL WAIT6
	CALL SFTRIGHT		; SHIFT TO THE RIGHT.
	CALL WAIT7
	CALL SFTLEFT		; SHIFT TO THE LEFT.
	CALL WAIT7
	CALL SFTLEFT		; SHIFT TO THE LEFT.
	CALL WAIT8
	CALL SFTRIGHT		; SHIFT INSTRUCTION TO THE RIGHT.
	CALL WAIT2		; WAIT ANOTHER 3 SEC.
	CALL FIRST		; DISPLAY "Press "*" to display calls".
INTRO
	CALL CHECKCOM		; CHECK IF MAIN MICROCONTROLLER SEND COMMAND.
	GOTO INTRO
;*************************************************************
; SUB-ROUTINE FOR CONVERTING 2 MICROCONTROLLER INTERFACED 
; LANGUAGE TO ASCII CHARACTER
;*************************************************************
GETDATA
	MOVLW	d'1'
	MOVWF	PCLATH		; LATCH HIGH PROGRAM COUNTER TO 1ST PAGE. 
	MOVFW	BUFFER
	ADDWF	PCL
	RETLW	'0' 		; 0 
	RETLW	'1'		; 1
	RETLW	'2'		; 2
	RETLW	'3'		; 3
	RETLW	'4'		; 4
	RETLW	'5'		; 5
	RETLW	'6'		; 6
	RETLW	'7'		; 7
	RETLW	'8'		; 8
	RETLW	'9'		; 9
	RETLW	' '		; BLANK
;*************************************************************
; DELAY ROUTINE
; THIS ROUTINE TAKES THE VALUE IN ‘LOOPS’
; AND MULTIPLIES IT TIMES 1 MILLISECOND TO
; DETERMINE DELAY TIME
;*************************************************************
WAIT
	MOVLW	d'250'		; TIMING ADJUSTMENT VARIABLE.
	MOVWF	LOOPS2
TOP	 			
	NOP			; SIT AND WAIT.
	NOP
	NOP
	NOP
	NOP	
	DECFSZ 	LOOPS2 		; INNER LOOPS COMPLETE?
	GOTO TOP		; NO, GO AGAIN.
	DECFSZ	LOOPS 		; OUTER LOOPS COMPLETE?
	GOTO WAIT 		; NO, GO AGAIN.
	RETLW 	d'0' 		; YES, RETURN FROM SUB.
WAIT0
	MOVLW	d'250'		; TIMING ADJUSTMENT VARIABLE.
	MOVWF	LOOPS2
TOP0	 			
	NOP			; SIT AND WAIT.
	NOP
	CALL CHECKCOM		; CHECK IF MAIN MICROCONTROLLER SEND COMMAND.	
	DECFSZ 	LOOPS2 		; INNER LOOPS COMPLETE?
	GOTO TOP0		; NO, GO AGAIN.
	DECFSZ	LOOPS 		; OUTER LOOPS COMPLETE?
	GOTO WAIT0 		; NO, GO AGAIN.
	RETLW 	d'0' 		; YES, RETURN FROM SUB.
WAIT1
	MOVLW	d'12'		; SET 3 SECONDS DELAY.		
	MOVWF	LOOP
TOP1
	CLRF	LOOPS	
	CALL WAIT0
	DECFSZ	LOOP
	GOTO TOP1
	RETLW	d'0'
WAIT2
	MOVLW	d'20'		; SET 5 SECONDS DELAY.		
	MOVWF	LOOP
	GOTO TOP1
WAIT3
	MOVLW	d'250'		; SET 250 msec DELAY.		
	GOTO GOTOWAIT
WAIT4
	MOVLW	d'50'		; SET 50 msec DELAY.
	GOTO GOTOWAIT
WAIT5
	MOVLW	d'80'		; SET 80 msec DELAY.
	GOTO GOTOWAIT
WAIT6
	MOVLW	d'160'		; SET 160 msec DELAY.
	GOTO GOTOWAIT
WAIT7
	MOVLW	d'200'		; SET 200 msec DELAY.
	GOTO GOTOWAIT
WAIT8
	MOVLW	d'220'		; SET 220 msec DELAY.
GOTOWAIT
	MOVWF	LOOPS
	GOTO WAIT0
;*************************************************************
; SENDS CHARACTER TO LCD
; THIS ROUTINE SPLITS THE CHARACTER INTO THE UPPER AND LOWER
; NIBBLES AND SENDS THEM TO THE LCD, UPPER NIBBLE FIRST 
; THE DATA IS TRANSMITTED ON THE PORTA RA3:RA0 PINS
;*************************************************************
FILLALL
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	MOVLW	b'10100101'
SENDCHAR
	CALL SEND
	BSF	PORTB,RS	; SET LCD TO DATA MODE.
	GOTO SEND1
SEND
	MOVWF	ROLAND		; CHARACTER TO BE SENT IS IN W REGISTER.
	MOVLW	d'2'		; DELAY FOR SENDING DATA TO LCD.
	MOVWF	LOOPS
	MOVLW	d'5'		; DELAY FOR SENDING DATA TO LCD.
	MOVWF	LOOPS2
	CALL WAIT		; WAIT LCD TO BE READY.
	SWAPF	ROLAND,0
	ANDLW	b'00001111'	; GET UPPER NIBBLE.
	MOVWF	PORTA		; SEND DATA TO LCD.
	BCF	PORTB,RW	; SET LCD TO READ.
	RETLW	d'0'
;*************************************************************
; SENDS COMMAND TO LCD
; THIS ROUTINE SPLITS THE COMMAND INTO THE UPPER AND LOWER
; NIBBLES AND SENDS THEM TO THE LCD, UPPER NIBBLE FIRST 
; THE DATA IS TRANSMITTED ON THE PORTA RA3:RA0 PINS
;*************************************************************
ADDRESS0
	MOVLW	b'10000000'	; SEND DD RAM ADDRESS (1ST LINE).
SENDCMD
	CALL SEND
	BCF	PORTB,RS	; SET LCD TO COMMAND MODE.
SEND1
	CALL TOGGLE		; TOGGLE E FOR LCD.
	MOVFW	ROLAND
	ANDLW	b'00001111'	; GET LOWER NIBBLE.
	MOVWF	PORTA		; SEND DATA TO LCD.
TOGGLE
	BSF	PORTB,E		; SET E HIGH.
	BCF	PORTB,E		; SET E LOW.
	RETURN
;**************************************************************
; THIS SUB ROUTINE INITIALIZE LCD.
;**************************************************************
INIT_LCD
	MOVLW	b'00000001'
	CALL SENDCMD		; SEND COMMAND FOR CLEAR DISPLAY.
	MOVLW	b'00000010'
	CALL SENDCMD		; SEND COMMAND FOR RETURN HOME.
	MOVLW	b'00001100'
	CALL SENDCMD		; SEND COMMAND FOR DISPLAY ON.
	CALL FORTY		; RESET ADDRESS.
	CLRF 	CLOCK
	CLRF 	CLOCKVAR
	RETLW	d'0'
;*************************************************************
; THIS SUB-ROUTINES SENDS THE CUSTOM CHARACTERS TO THE LCD
;*************************************************************
CHARGEN1
	MOVLW	b'00011111'
	GOTO SENDCHAR	
CHARGEN2
	CALL CHARGEN1	
	CALL CHARGEN6	
	CALL CHARGEN6
	CALL CHARGEN19	
	CALL CHARGEN18
	MOVLW	b'00011011'
	CALL SENDCHAR			
	CALL CHARGEN6
	GOTO CHARGEN1
CHARGEN3
	MOVLW	'#'
	GOTO SENDCHAR
CHARGEN4
	MOVLW	b'00000100'
	GOTO SENDCHAR
CHARGEN5
	MOVLW	b'00000011'
	GOTO SENDCHAR
CHARGEN6
	MOVLW	b'00000000'
	GOTO SENDCHAR
CHARGEN7
	CALL CHARGEN18	
	GOTO CHARGEN1
CHARGEN8
	CALL CHARGEN1
	CALL CHARGEN6
	GOTO CHARGEN1
CHARGEN9
	MOVLW	b'00011000'
	GOTO SENDCHAR
CHARGEN10
	CALL CHARGEN4
	CALL CHARGEN4
	CALL CHARGEN4
	CALL CHARGEN4
	CALL CHARGEN4
	GOTO CHARGEN4
CHARGEN11
	MOVLW	' '
	GOTO SENDCHAR
CHARGEN12
	MOVLW	b'00000010'
	GOTO SENDCHAR
CHARGEN13
	MOVLW	b'00001000'
	GOTO SENDCHAR
CHARGEN14
	MOVLW	b'00010010'
	GOTO SENDCHAR
CHARGEN15
	MOVLW	b'00001001'
	GOTO SENDCHAR
CHARGEN16
	MOVLW	b'00000001'
	GOTO SENDCHAR
CHARGEN17
	MOVLW	b'00000110'
	GOTO SENDCHAR
CHARGEN18
	MOVLW	b'00001010'
	GOTO SENDCHAR
CHARGEN19
	MOVLW	b'00001110'
	GOTO SENDCHAR
CHARGEN20
	MOVLW	b'00000101'
	GOTO SENDCHAR
;*************************************************************
; THIS SUB-ROUTINES SENDS THE SOME CHARACTERS AND WORDS 
; (TO SAVE SOME PROGRAM MEMORY)
;*************************************************************
STAR
	MOVLW	'*'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "*".
QOUTATION
	MOVLW	'"'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER """.
COLON
	MOVLW	':'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER ":".
PERIOD
	MOVLW	'.'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER ".".
R
	MOVLW	'R'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "R".
e
	MOVLW	'e'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "e".
r
	MOVLW	'r'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "r".
m
	MOVLW	'm'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "m".
y
	MOVLW	'y'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "y".
n
	MOVLW	'n'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "n".
o
	MOVLW	'o'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "o".
s
	MOVLW	's'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "s".
p
	MOVLW	'p'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "p".
i
	MOVLW	'i'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "i".
c
	MOVLW	'c'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "c".
l
	MOVLW	'l'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "l".
a
	MOVLW	'a'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "a".
d
	MOVLW	'd'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "d".
t
	MOVLW	't'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "t".
u
	MOVLW	'u'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "u".
h
	MOVLW	'h'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "h".
P
	MOVLW	'P'
	GOTO SENDCHAR		; DISPLAY ASCII CHARACTER "P".
DOUBLE
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	GOTO CHARGEN11		; DISPLAY ASCII CHARACTER " ".
PRESS
	CALL INIT_LCD		; RESET THE LCD.
	CALL DOUBLE		; DISPLAY "  ".
	CALL PRESS2		; DISPLAY "Press ".
	GOTO QOUTATION		; DISPLAY ASCII CHARACTER """.
PRESS1
	CALL QOUTATION		; DISPLAY ASCII CHARACTER """.
	GOTO to			; DISPLAY " to".
PRESS2
	CALL Pre		; DISPLAY "Pre".
	CALL s			; DISPLAY ASCII CHARACTER "s".
	CALL s			; DISPLAY ASCII CHARACTER "s".
	GOTO CHARGEN11		; DISPLAY ASCII CHARACTER " ".
Pre
	CALL P			; DISPLAY ASCII CHARACTER "P".
	CALL r			; DISPLAY ASCII CHARACTER "r".
	GOTO e			; DISPLAY ASCII CHARACTER "e".
DISP
	CALL d			; DISPLAY ASCII CHARACTER "d".
	CALL i			; DISPLAY ASCII CHARACTER "i".
	CALL s			; DISPLAY ASCII CHARACTER "s".
	CALL p			; DISPLAY ASCII CHARACTER "p".
	CALL l			; DISPLAY ASCII CHARACTER "l".
	CALL a			; DISPLAY ASCII CHARACTER "a".
	CALL y			; DISPLAY ASCII CHARACTER "y".
	GOTO CHARGEN11		; DISPLAY ASCII CHARACTER " ".
all
	CALL a			; DISPLAY ASCII CHARACTER "a".
	CALL l			; DISPLAY ASCII CHARACTER "l".
	GOTO l			; DISPLAY ASCII CHARACTER "l".
scroll
	CALL s			; DISPLAY ASCII CHARACTER "s".
	CALL c			; DISPLAY ASCII CHARACTER "c".
	CALL r			; DISPLAY ASCII CHARACTER "r".
	CALL o			; DISPLAY ASCII CHARACTER "o".
	CALL l			; DISPLAY ASCII CHARACTER "l".
	CALL l			; DISPLAY ASCII CHARACTER "l".
	GOTO CHARGEN11		; DISPLAY ASCII CHARACTER " ".
adjust
	CALL a			; DISPLAY ASCII CHARACTER "a".
	CALL d			; DISPLAY ASCII CHARACTER "d".
	MOVLW	'j'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "j".
	CALL u			; DISPLAY ASCII CHARACTER "u".
	CALL s			; DISPLAY ASCII CHARACTER "s".
	GOTO t			; DISPLAY ASCII CHARACTER "t".
shift
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	CALL s			; DISPLAY ASCII CHARACTER "s".
	CALL h			; DISPLAY ASCII CHARACTER "h".
	CALL i			; DISPLAY ASCII CHARACTER "i".
	MOVLW	'f'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "f".
	GOTO t			; DISPLAY ASCII CHARACTER "t".
ime
	CALL i			; DISPLAY ASCII CHARACTER "i".
	CALL m			; DISPLAY ASCII CHARACTER "m".
	GOTO e			; DISPLAY ASCII CHARACTER "e".
and
	CALL a			; DISPLAY ASCII CHARACTER "a".
	CALL n			; DISPLAY ASCII CHARACTER "n".
	GOTO d			; DISPLAY ASCII CHARACTER "d".
to
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	CALL t			; DISPLAY ASCII CHARACTER "t".
	GOTO o			; DISPLAY ASCII CHARACTER "o".
CALLNO
	CALL INIT_LCD
	CALL DOUBLE		; DISPLAY "  ".
	MOVLW	'C'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "C".
	CALL all		; DISPLAY "all ".
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	GOTO CHARGEN3		; DISPLAY ASCII CHARACTER "#".
;*************************************************************
; THIS SUB-ROUTINES SENDS THE INSTRUCTIONS TO BE 
; DISPLAYED IN LCD
;*************************************************************
FIRST
	CALL PRESS
	CALL STAR		; DISPLAY ASCII CHARACTER "*".
	GOTO FIRST2
FIRST1
	CALL PRESS
	CALL CHARGEN3		; DISPLAY ASCII CHARACTER "#".
FIRST2
	CALL PRESS1
	CALL ADDRESS2		; SEND DD RAM ADDRESS (2ND LINE). 
	CALL DISP		; DISPLAY "display ".
	CALL c			; DISPLAY ASCII CHARACTER "c".
	CALL all		; DISPLAY "all".
	GOTO s			; DISPLAY ASCII CHARACTER "s".
SECOND
	CALL PRESS		; DISPLAY "Press "".		
	CALL CHARGEN3		; DISPLAY ASCII CHARACTER "#".
	CALL PRESS1		; DISPLAY "" to".
	CALL ADDRESS1		; SEND DD RAM ADDRESS (2ND LINE). 
	CALL DISP		; DISPLAY "display ".
	CALL d			; DISPLAY ASCII CHARACTER "d".
	CALL u			; DISPLAY ASCII CHARACTER "u".
	CALL r			; DISPLAY ASCII CHARACTER "r".
	CALL a			; DISPLAY ASCII CHARACTER "a".
	CALL t			; DISPLAY ASCII CHARACTER "t".
	CALL i			; DISPLAY ASCII CHARACTER "i".
	CALL o			; DISPLAY ASCII CHARACTER "o".
	GOTO n			; DISPLAY ASCII CHARACTER "n".
THIRD
	CALL PRESS		; DISPLAY "Press "".
	MOVLW	'0'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "0".
	CALL PRESS1		; DISPLAY "" to".
	CALL ADDRESS2		; SEND DD RAM ADDRESS (2ND LINE). 
	CALL scroll		; DISPLAY "scroll ".
	CALL d			; DISPLAY ASCII CHARACTER "d".
	CALL o			; DISPLAY ASCII CHARACTER "o".
	MOVLW	'w'	
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "w".
	GOTO n			; DISPLAY ASCII CHARACTER "n".
FORTH
	CALL PRESS		; DISPLAY "Press "".
	MOVLW	'8'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "0".
	CALL PRESS1		; DISPLAY "" to".
	MOVLW	b'11000011'	
	CALL SENDCMD		; SEND DD RAM ADDRESS (2ND LINE). 
	CALL scroll		; DISPLAY "scroll ".
	CALL u			; DISPLAY ASCII CHARACTER "u".
	GOTO p			; DISPLAY ASCII CHARACTER "p".
FIFTH
	CALL PRESS
	CALL STAR		; DISPLAY ASCII CHARACTER "*".
	CALL PRESS1
	CALL ADDRESS1		; SEND DD RAM ADDRESS (2ND LINE). 
	CALL adjust		; DISPLAY "adjust".	
	CALL CHARGEN11		; DISPLAY ASCII CHARACTER " ".
	CALL d			; DISPLAY ASCII CHARACTER "d".
	CALL a			; DISPLAY ASCII CHARACTER "a".
	CALL t			; DISPLAY ASCII CHARACTER "t".
	CALL e			; DISPLAY ASCII CHARACTER "e".
	MOVLW	'/'
	CALL SENDCHAR		; DISPLAY ASCII CHARACTER "/".
	CALL t			; DISPLAY ASCII CHARACTER "t".
	GOTO ime		; DISPLAY "ime".
;*************************************************************
; THIS SUB-ROUTINES SENDS THE DD RAM ADDRESS
;*************************************************************
ADDRESS1
	MOVLW	b'11000000'	
	GOTO SENDCMD		; SEND DD RAM ADDRESS (2ND LINE). 
ADDRESS2
	MOVLW	b'11000010'	
	GOTO SENDCMD		; SEND DD RAM ADDRESS (2ND LINE). 
ADDRESS3
	MOVLW	b'10010100'
	GOTO SENDCMD		; SEND DD RAM ADDRESS (1ST LINE).
INITLCD
	MOVLW	b'00000010'
	MOVWF	PORTA
	GOTO TOGGLE
SFTRIGHT
	MOVLW	b'00011100'
	GOTO SENDCMD		; SHIFT INSTRUCTION TO THE RIGHT.
SFTLEFT
	MOVLW	b'00011000'
	GOTO SENDCMD		; SHIFT INSTRUCTION TO THE LEFT.


	END




    Source: geocities.com/ece23314/prog

               ( geocities.com/ece23314)