Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
02/21/04 07:44
Read: times


 
#65246 - Here is the full code
Responding to: ???'s previous message
Dear Eric,

Instead of reading your code and trying to debug, I have provided a full code which has been fully checked and found OK. You can use it as is by changing the port and bit defenitions or use it as a guide. (I have a doubt on the LCD init routines in the code posted by you)
; PROGRAM TO TEST THE HD44780 LCD MODULE INTERFACE.
	
	; Using 89c51RD2 with 6 MHz crsytal in 6 clock mode. Each machine cycle = 1us.
	
	; 10 Jan 2003 : Checked out OK with Elnix-0803 PCB
	
	;===========================================
	;LCD  hardware interface:
	;( Change as required based on your hardware interface )
	
	;P0 is used for LCD data bus
	
	REGISBIT	EQU	P1.0		; Data !Command register bit of LCD
	MODEBIT	EQU	P1.1		; Read !Write mode bit of LCD
	ENABIT	EQU	P1.2		; Enable bit of LCD
	
	;==========================================
	; LCD command bytes

	FSET 	EQU 38H ; L=1(8 BITS),N=1(2LINE) ; 001L N000
	DCB  	EQU 0CH ; DIS.ON=1,CUR.OFF=0,BLINK OFF=0; 0000 1DCB
	CLEAR EQU 01H ; Clear display; 0000 0001
	RH   	EQU 02H ; Return Home ; 0000 0010 
	SDD1 	EQU 80H ; Set DDRAM address line1; 1000 0000 
	SEM  	EQU 06H ; Entry mode; INC=1, SHIFT=0; 0000 01IS
	DCON 	EQU 18H ; DIS & CUR Control ; DIS SHIFT=1,LEFTWISE=0; 0001 SL00 

	
	;=========================================
	
	ORG 0000H
      		JMP 	BEGIN
       			
      ORG 100H
       	
      BEGIN:	NOP
      
      INITLCD: 	CALL 	LCDSET
      
	MAIN:  	MOV 	DPTR, #TXT 		    	; Display the Message
			CALL 	DISPLAY
						
	WAIT:		SJMP  $				; Wait here for reset . 
	
	;==========================================
	
	
	; DISPLAY routine arranges to display the 32 characters that are pointed at by the DPTR.
	; Call with DPTR pointing to  the message to be displayed.
	
     	DISPLAY:   	MOV 	A, #80H              	; Init display first line
			CALL 	LCDCOM
			MOV 	A, #CLEAR			; To clear the old message
			CALL  LCDCOM
			CALL  DLY10ms    		   	; Delay to complete the clear 
			CALL  SHOW              	; Display the first line now 
	NXTLIN:    	MOV 	A, #0C0H             	; Set address for 2nd line
			CALL  LCDCOM         		; Write to LCD
			CALL	SHOW              	; Display the second line.
			RET
	
			
	; SHOW routine arranges to move 16 charaters  to the LCD one by one.
	
	SHOW:      	MOV 	R2, #16              	; Counter for 16 Characters
	NXT_C:     	MOV 	A, #0
			MOVC 	A, @A+DPTR
			CALL 	LCDCHR
			INC 	DPTR              
			DJNZ 	R2, NXT_C
			RET                     	; DPTR now at next line beginning    
  	       	
	
	; LCDSET is a routine to initialize the Hitachi  HD44780 type LCD modules
	
	LCDSET:	CALL 	DLY15ms			; Give some time for Vcc to stabilize
			MOV  	A, #FSET			; Send FSET thrice in varying intervals
			CALL 	LCDCOM
			CALL 	DLY5ms
			MOV  	A, #FSET
			CALL 	LCDCOM
			CALL 	DLY500us
			MOV	A, #FSET
			CALL 	LCDCOM
			MOV	A, #DCB			; Set Display, Cursor and Blink options
			CALL 	LCDCOM
	DISPCLR:	MOV	A, #CLEAR
			CALL 	LCDCOM
			CALL	DLY10ms			; Init at times does not happen without this delay
			RET

	
	; LCDCOM is for sending a command byte to the LCD.
	
	LCDCOM:  	CLR   REGISBIT			; Select command register
        		CLR   MODEBIT			; So that you can Write
        		SETB  ENABIT			; Enable LCD
        		MOV 	P0, A				; Move the data to LCD port 
	DELAY:   	MOV 	R3, #50	          	; 100us Delay for each write. Works from 20us onwards
		  	DJNZ 	R3, $
			CLR   ENABIT			; Disable LCD
        		RET

	; LCDCHR is for sending one data byte to the LCD.
	
	LCDCHR:  	SETB  REGISBIT			; Select Data register
        		CLR  	MODEBIT			; So that you can Write
        		SETB 	ENABIT			; Enable LCD
        		MOV 	P0, A				; Move the data to LCD port 
        		CALL 	DELAY
        		CLR  	ENABIT			; Disable LCD
        		RET
        		

	; Fixed duration delay routines.
	
	DLY15ms:	MOV	R6, #30
			CALL	DLY500us
			RET
	
	
	DLY10ms:	MOV	R6, #20
			CALL	DLY500us
			RET
			

	DLY5ms:	MOV	R6, #10
			CALL	DLY500us
			RET

	    		
	; DLY500us causes a delay of 500us x R6 value when called. Call after loading R6 suitably
	
	DLY500us:	MOV R7,#250
			DJNZ R7,$
			DJNZ R6,DLY500us
			RET

	
	TXT:    	DB 'ABCDEFGHIJKLMNOP'   	; First line message
	TXT1:   	DB 'QRSTUVWYZ1234567'  	      ; Second line message
	
	
        			
        		END
       


Hope that helps.

Raghu

List of 10 messages in thread
TopicAuthorDate
keil evaluation board & lcd            01/01/70 00:00      
   RE: keil evaluation board & lcd            01/01/70 00:00      
   RE: keil evaluation board & lcd            01/01/70 00:00      
   RE: keil evaluation board & lcd            01/01/70 00:00      
      RE: keil evaluation board & lcd            01/01/70 00:00      
         RE: keil evaluation board & lcd            01/01/70 00:00      
            Here is the full code            01/01/70 00:00      
            RE: keil evaluation board & lcd            01/01/70 00:00      
            RE: keil evaluation board & lcd            01/01/70 00:00      
   RE: keil evaluation board & lcd            01/01/70 00:00      

Back to Subject List