
;//THIS IS A PRGRAM THAT DISPLAYS THE NUMBER THAT IS PRESSED ON THE KEYPAD ON THE LCD
;//***********************************************************************************

;//==========================================
;	LCD IS USING PORT 1 & 2
;	KEYPAD IS USING PORT 3
;//==========================================
               			
	         ORG 0
		 LJMP MAIN	;BYPASS INTERRUPT VECTOR TABLE
		
		;///MAIN PROGRAM///
		
		ORG 100H
		
		RS EQU P2.0
		RW EQU P2.1
		EN EQU P2.2

				
MAIN:		MOV SP,#256-32	;DEFINE STACK 32BYTES
		MOV P3,#0FFh	; CONFIGURE LOWER NIBBLE OF P3
				
		;INITIALIZATION START FOR LCD
		MOV A,#038H             
                LCALL COMW
                MOV A,#00CH
                LCALL COMW
                MOV A,#001H
                LCALL COMW
                MOV A,#006H
                LCALL COMW
                MOV A,#083H
                LCALL COMW		      	
				;INITIALIZATION END FOR LCD

;=============================================================
;	KEYPAD PROGRAM
;=============================================================				
							
K1:		;TO ENSURE THAT ALL SWITCHES ARE OPEN
		MOV P3,#0											;%
		MOV A,P3
		ANL A,#00001111B	;DISABLE UPPER NIBBLE
		CJNE A,#00001111B, K1
		;
K2:		;CHECK SWITCHES TO SEE IF ONE IS CLOSED
		ACALL DELAY
		MOV A,P3
		ANL A,#00001111B
		CJNE A,#00001111B,OVER
		SJMP K2
		;
OVER:		ACALL DELAY
		MOV A,P3
		ANL A,#00001111B
		CJNE A,#00001111B,OVER1
		SJMP K2
		;
OVER1:		MOV P3,#11111110B								
		MOV A,P3
		ANL A,#00001111B
		CJNE A,#00001111B,ROW_0
		;
		MOV P3,#11111101B								
		MOV A,P3
		ANL A,#00001111B
		CJNE A,#00001111B,ROW_1
		;
		MOV P3,#11111011B								
		MOV A,P3
		ANL A,#00001111B
		CJNE A,#00001111B,ROW_2
		;
		MOV P3,#11110111B							
		MOV A,P3
		ANL A,#00001111B
		CJNE A,#00001111B,ROW_3
		;
		LJMP K2
		;
ROW_0:		MOV DPTR,#KCODE0
		SJMP FIND
		;
ROW_1:		MOV DPTR,#KCODE1
		SJMP FIND
		;
ROW_2:		MOV DPTR,#KCODE2
		SJMP FIND
		;		
ROW_3:		MOV DPTR,#KCODE3
		SJMP FIND
		;
		;
FIND:		RRC A
		JNC MATCH
		INC DPTR
		SJMP FIND
MATCH:		CLR A
		MOVC A,@A+DPTR
		ACALL DATAW, A 				;//ACALL DATAWRITE,A  TO SEND DATA FROM ACCUMULATOR TO LCD
		LJMP K1
		;
		;///DELAY SUB-ROUTINE///
		;
DELAY:		MOV R2,#5
HERE:		NOP
		DJNZ R3,HERE
		RET
		;
		;
KCODE0:		DB '7','8','9'
KCODE1:		DB '4','5','6'
KCODE2:		DB '1','2','3'
KCODE3:		DB ' ','0','='
								
				
				
;===========================================
;	LCD PROGRAM
;===========================================
				
		
		MOV      A,#0C1H
		ACALL    DISP_STRING
HAWN:  		SJMP     HAWN       

AGAIN:          SJMP AGAIN    	;endless loop
COMW:           MOV P1,A   		;command write sequence
                CLR RS			;RS=0 for command
                CLR RW			;R/W=0 to write to LCD
                SETB EN			;E=1 for H-to-L pulse
		CLR EN			;E=0 ,latch in
		LCALL DELAY2
                RET
				
DATAW:          MOV P1,A   		;data write sequence
                SETB RS			;RS=1 for data
                CLR RW			;R/W=0 to write to LCD
                SETB EN			;E=1 for H-to-L pulse
                CLR EN			;E=0 ,latch in
		LCALL DELAY2
                RET
				
DISP_STRING:	CLR      A                     ;A=0
		MOV      R5,#00H               ;R5=0
NEXT_CHAR:	INC      R5		       		   ;R5+1
		MOVC     A,@A+DPTR
		ACALL    DATAW
		MOV      A,R5
		CJNE     R5,#0EH,NEXT_CHAR
		RET

			
DELAY2:         MOV R6,#50    		;simple delay routine
HERE2:          MOV R7,#255  		;for 0.0124S or 124ms
HERE3:          DJNZ R7,HERE3
                DJNZ R6,HERE2
                RET
				
;=============================================================

				
                END


;=============================================================

