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

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
05/01/08 18:49
Modified:
  05/01/08 18:51

Read: times


 
#154269 - Some help
Responding to: ???'s previous message


;PROCESSOR: Atmel 89S8253
;CRYSTAL: 12 MHz
;FILENAME: LCD-TEST.A51
;DATE: 17/10/07
;REVISIONS: 0.2
;AUTHOR: BRUCE MONEY
;HARDWARE REQUIREMENTS: LCD AT89S8253 WITH DEBUG LED and 40 x 2 lcd.
$INCLUDE (REG8252.INC)

;LED EQUATES
LED	equ	P3.7

;************** Hardware Equates ******************
EN	EQU	P2.7			;LCD ENABLE
RW	EQU	P2.6			;LCD READ/WRITE
RS	EQU	P2.5			;LCD REGISTER SELECT
BUSY	EQU	P0.7			;LCD BUSY PORT (0.7)
LCDDATA	EQU	P0			;LCD DATA PORT (0)

;************** Memory Equates ******************
LEDTICK	equ	40H
LCDTICK	equ	41H
;KEYPADTICK	equ	42h
;LOCK	equ	43h	
MCOUNT	EQU	45h			;LCD DIGIT COUNTER


;************** Vector Addresses ******************
	org	0000h
	sjmp	start
	org	000Bh
	jmp	TIMER0			;TIMER 0 ISR

;************** Initital Setup ******************
start:
	LCALL	INIT_LCD		;INITIAL LCD
	mov	TMOD,#01H		;16BIT TIMER MODE
	mov	TH0,#3Ch		;MOVE C3AF INTO THLO FOR 50ms tick
	mov	TL0,#10101111B		;10101111B - AF (SEE ABOVE) BUT HEX VALUE DOESNT WORK?
	mov	IE,#10000010B		
	SETB	TR0		
	MOV	LEDTICK,#10d		;UPDATE LED EVERY 10 TICKS 10 * 50ms = 500ms
	MOV	LCDTICK,#2d		;UPDATE LCD EVERY 2 TICKS 2 * 50ms = 100ms

	sjmp	$

;************** ISR For Timer 0 ******************
TIMER0:
	clr	TR0		;DISABLE TIMER 0
	mov	TH0,#3Ch		;RESET OF TIMER AFTER TICK
	mov	TL0,#10101111B		;RESET OF TIMER AFTER TICK
	SETB	TR0			;ENABLE TIMER 0
	jmp	TASK_SCHEDULER		;CALL TASK SCHEDULER

;************** Task Scheduler ******************
TASK_SCHEDULER:
LED_TICK:
	DJNZ	LEDTICK,LCD_TICK	;CHECK LEDTICK IF NOT ZERO MOVE TO LCD_TICK
	CPL	LED			;CHANGE LED STATE
	MOV	LEDTICK,#10d		;RELOAD LEDTICK
LCD_TICK:
	DJNZ	LCDTICK, RETURN		;CHECK LCDTICK IF NOT ZERO MOVE TO RETURN
	CALL	TEST			;CALL LCD TEST WRITE
	MOV	LCDTICK,#2d		;RELOAD LCDTICK
RETURN:	RETI

;************** Welcome Message ******************
TEST:	
	ORG	0200h
	db	'BRUCE RULES'
	MOV	MCOUNT,#0Bh
	MOV	DPTR,#0200h
	LCALL	WRITE_LCD
	RETI
	
;************** LCD SUB ROUTINES ******************

WRITE_LCD:
	LCALL	CLEAR_LCD 
LCD_NEXT:
	CLR	A
	MOVC	A,@A+DPTR
	LCALL	WRITE_LCD_TEXT
	INC	DPTR
	DJNZ	MCOUNT,LCD_NEXT
	RET
WAIT_LCD:
        CLR	RS
        SETB	RW
	SETB	EN
	MOV	LCDDATA, #0FFh
	MOV	A,LCDDATA 
	JB	P0.7,WAIT_LCD	 <--- You can't check busy flag until after init 
	CLR	EN
	CLR	RW
	RET
INIT_LCD:
	MOV	A,#3Ch
	LCALL	LCD_COMMAND
	MOV	A,#0Fh
	LCALL	LCD_COMMAND
        LCALL	CLEAR_LCD
	MOV	A,#06h
	LCALL	LCD_COMMAND
	RET
LCD_COMMAND:
	CLR	RS		;RS LOW TO INDICATE A COMMAND
	CLR	RW		;RW LOW TO INDICATE WRITE
	MOV	LCDDATA,A	;MOVE COMMAND IN ACCUMULATOR TO DATA PORT
	SETB	EN		;RAISE EN TO INITIATE LCD COMMAND
	NOP			;WAIT 4 CYCLES TO GIVE LCD TIME TO PROCESS
	NOP
	NOP
	NOP
	CLR	EN		;LOWER EN LINE
	LCALL	WAIT_LCD	;WAIT FOR THE PREVIOUS COMMAND TO EXECUTE
	RET			;RETURN TO CALLING PROGRAM CODE
CLEAR_LCD:
	MOV	A,#01h		;SET ACCUMULATOR TO CLEAR SCREEN COMMAND
	LCALL	LCD_COMMAND	;EXECUTE COMMAND
	RET
WRITE_LCD_TEXT:
	SETB	RS		;RS HIGH TO INDICATE TEXT DATA
	CLR	RW		;RW LOW TO INDICATE WRITE
	MOV	LCDDATA,A	;MOVE CHARACTER IN ACCUMULATOR TO DATA PORT
	SETB	EN		;RAISE EN TO INITIATE LCD COMMAND
	NOP			;WAIT 4 CYCLES TO GIVE LCD TIME TO PROCESS
	NOP
	NOP
	NOP
	CLR	EN		;LOWER EN LINE
	LCALL	WAIT_LCD	;WAIT FOR THE PREVIOUS COMMAND TO EXECUTE
	RET			;RETURN TO CALLING PROGRAM CODE
	
	end



In your initialization of the LCD, you are calling the routine LCD_COMMAND, which in turn is calling WAIT_LCD. In the WAIT_LCD routine you are checking the busy flag and you can't do that until after the initialization is mostly completed.

Start by removing all the extra code that has nothing to do with the display and get it working first. Like this:

;PROCESSOR: Atmel 89S8253
;CRYSTAL: 12 MHz
;FILENAME: LCD-TEST.A51
;DATE: 17/10/07
;REVISIONS: 0.2
;AUTHOR: BRUCE MONEY
;HARDWARE REQUIREMENTS: LCD AT89S8253 WITH DEBUG LED and 40 x 2 lcd.
$INCLUDE (REG8252.INC)

;LED EQUATES
LED	equ	P3.7

;************** Hardware Equates ******************
EN	EQU	P2.7			;LCD ENABLE
RW	EQU	P2.6			;LCD READ/WRITE
RS	EQU	P2.5			;LCD REGISTER SELECT
BUSY	EQU	P0.7			;LCD BUSY PORT (0.7)
LCDDATA	EQU	P0			;LCD DATA PORT (0)

;************** Memory Equates ******************
;MCOUNT	EQU	45h			;LCD DIGIT COUNTER

;************** Vector Addresses ******************
	org	0000h
	sjmp	start

;************** Initital Setup ******************
start:
        CALL    TEST
	sjmp	$
;************** Welcome Message ******************
;	ORG	0200h             <--- unnecessary waist of space
TEST:	db	'BRUCE RULES',0   <--- note the extra zero at the end
;	MOV	MCOUNT,#0Bh       <--- there's a better way
	MOV	DPTR,#TEST
	LCALL	WRITE_LCD
	RET
	
;************** LCD SUB ROUTINES ******************

WRITE_LCD:
	LCALL	CLEAR_LCD 
LCD_NEXT:
	CLR	A
	MOVC	A,@A+DPTR
        JZ      WRITE_END          <--- This is looking for the extra zero at the end of string
	LCALL	WRITE_LCD_TEXT
	INC	DPTR
        AJMP    LCD_NEXT
;	DJNZ	MCOUNT,LCD_NEXT
WRITE_END:
	RET
WAIT_LCD:
        CLR	RS
        SETB	RW
	SETB	EN
	MOV	LCDDATA, #0FFh
	MOV	A,LCDDATA 
;	JB	P0.7,WAIT_LCD	 <--- You can't check busy flag until after init 
        MOV     R0,#255          <--- simply delay
        DJNZ    R0,$
	CLR	EN
	CLR	RW
	RET
INIT_LCD:
	MOV	A,#3Ch
	LCALL	LCD_COMMAND
	MOV	A,#0Fh
	LCALL	LCD_COMMAND
        LCALL	CLEAR_LCD
	MOV	A,#06h
	LCALL	LCD_COMMAND
	RET
LCD_COMMAND:
	CLR	RS		;RS LOW TO INDICATE A COMMAND
	CLR	RW		;RW LOW TO INDICATE WRITE
	MOV	LCDDATA,A	;MOVE COMMAND IN ACCUMULATOR TO DATA PORT
	SETB	EN		;RAISE EN TO INITIATE LCD COMMAND
	NOP			;WAIT 4 CYCLES TO GIVE LCD TIME TO PROCESS
	NOP
	NOP
	NOP
	CLR	EN		;LOWER EN LINE
	LCALL	WAIT_LCD	;WAIT FOR THE PREVIOUS COMMAND TO EXECUTE
	RET			;RETURN TO CALLING PROGRAM CODE
CLEAR_LCD:
	MOV	A,#01h		;SET ACCUMULATOR TO CLEAR SCREEN COMMAND
	LCALL	LCD_COMMAND	;EXECUTE COMMAND
	RET
WRITE_LCD_TEXT:
	SETB	RS		;RS HIGH TO INDICATE TEXT DATA
	CLR	RW		;RW LOW TO INDICATE WRITE
	MOV	LCDDATA,A	;MOVE CHARACTER IN ACCUMULATOR TO DATA PORT
	SETB	EN		;RAISE EN TO INITIATE LCD COMMAND
	NOP			;WAIT 4 CYCLES TO GIVE LCD TIME TO PROCESS
	NOP
	NOP
	NOP
	CLR	EN		;LOWER EN LINE
	LCALL	WAIT_LCD	;WAIT FOR THE PREVIOUS COMMAND TO EXECUTE
	RET			;RETURN TO CALLING PROGRAM CODE
	
	end


I've not assembled this, so no guarantees. Hope it helps.

Jon

List of 21 messages in thread
TopicAuthorDate
Damaged LCD?            01/01/70 00:00      
   Some code comments first.            01/01/70 00:00      
      Thanks...            01/01/70 00:00      
         Well if you need it later...            01/01/70 00:00      
            Hmmpf.            01/01/70 00:00      
               Multiple Problems            01/01/70 00:00      
                  My Bad!!!            01/01/70 00:00      
                  :) some improvement            01/01/70 00:00      
               try to initialise at startup            01/01/70 00:00      
                  Wahey...... O not quite            01/01/70 00:00      
                     Hex value            01/01/70 00:00      
                     Check your soldering.            01/01/70 00:00      
                     Oops            01/01/70 00:00      
                        Wahey..... o not AGain            01/01/70 00:00      
                           Leading 0            01/01/70 00:00      
                           Leading zero            01/01/70 00:00      
                     Some help            01/01/70 00:00      
                        Cheers guys, all working now            01/01/70 00:00      
                           Why You Were Content Dependant            01/01/70 00:00      
   The filled in blocks indicate..            01/01/70 00:00      
   No hardware but software problem            01/01/70 00:00      

Back to Subject List