> I would suggest you visit the following page. It has truck loads of info
> related to LCD's as well as source for the various aspects of LCD control
> including the busy flag.
>
>
http://www.iaehv.nl/users/pouweha/lcd2.htm
>
> ___________________________________________
> Wesley Moore
> RMIT - BEng/BApp.Sc. 1st Year
>
>
wmoore
KILLspamcs.rmit.edu.au
>
http://wmoore.tsx.org/
>
> On Mon, 25 Oct 1999, John Considine wrote:
>
> > I am having a problem when I try to check the busy flag coming from the
> > LCD display (BUSY_FLAG? subroutine shown below). It is always busy but
> > if I remove the busy flag check it runs fine, as long as I use a slow
> > clock (therefore the display must not be busy). Any suggestions why
> > this bit would be remaining high. the power supply is a 7805 (5+)
> > being supplied by a 1 amp 12v power supply (120V wall plug in). I have
> > a .1uf capacitor from +5 to ground and a .57uf cap from 12V to ground
> > (for decoupling so I think). All of this is on a breadboard along with
> > the PIC 16C84 and Noritake LCD display 4X20 display with selectable 4 or
> > 8 bit transfer.
> > Thanks.
> >
> > ;October 25, 1999
> > ;
> >
> >
> > LIST P=16C84, F=INHX8M, R=DEC
> > include <p16c84.inc>
> > __CONFIG _CP_OFF & _WDT_OFF & _RC_OSC
> >
> > DISP_ON EQU b'00001101'
> > CLR_DISP EQU b'00000001'
> > ENTRY_INC EQU b'00000110'
> > MSD EQU H'0C'
> > LSD EQU H'0D'
> > TEMP EQU H'0E'
> > TEMP1 EQU H'0F'
> > CHAR EQU H'10'
> > RESET_V EQU 0
> > LCD_DELAY_SET EQU H'FF'
> > DD_RAM_ADD EQU H'80'
> > E EQU 4 ; LCD Enable control line
> > RW EQU 3 ; LCD Read/Write control line
> > RS EQU 2
> > ;interupt routine varibles
> > INT_W EQU H'11'
> > INT_S EQU H'12'
> >
> > org 0
> > RESET goto START
> > org 4 ; RESET vector location
> >
> > Int
> > movwf INT_W
> > movf STATUS, 0
> > movwf INT_S
> >
> > START
> > ;pic 16c84 setup for initial state
> > movlw b'00000000'
> > movwf STATUS ;Clear Status
> > clrf INTCON ;Initialize INTCON Disable all interupts
> > ; bsf INTCON, 3 ;Makes interupt if RB<7:4> change state
> > bsf STATUS,RP0
> > movlw b'11000111'
> > movwf OPTION_REG ;Set Option Register
> > bcf STATUS,RP0
> >
> > clrf PORTA
> > clrf PORTB
> > bsf STATUS,RP0
> > CLRF TRISA
> > CLRF TRISB
> > bcf STATUS,RP0
> >
> > ;display initialize
> >
> > movlw H'20' ;four bit transfer =h'20' 8 = h'38'
> > movwf PORTB
> > bsf PORTA,E
> > bcf PORTA,E
> >
> > movlw DISP_ON
> >
> > nop
> > nop
> > nop
> > nop
> > nop
> > movwf PORTB
> > call CMD_SEND
> >
> > ; movlw CLR_DISP
> > ; call CMD_SEND
> >
> > ;send characters
> > movlw 'F'
> > call CHAR_REC
> > movlw 'I'
> > call CHAR_REC
> > movlw 'N'
> > call CHAR_REC
> > movlw 'A'
> > call CHAR_REC
> > movlw 'L'
> > call CHAR_REC
> >
> > goto $
> >
> >
> >
> > CMD_SEND
> > movwf CHAR ; Command to be sent is in W
> > call BUSY_FLAG? ; Wait for LCD to be ready
> > movf CHAR, 0
> > movwf PORTB ; Send data to LCD
> > bcf PORTA, RW ; Set LCD in read mode
> > bcf PORTA, RS ; Set LCD in command mode
> > bsf PORTA, E ; toggle E for LCD
> > bcf PORTA, E
> > ;send lower nibble
> > swapf CHAR, 0
> > movwf PORTB
> > bsf PORTA, E
> > bcf PORTA, E
> > RETURN
> >
> > CHAR_REC
> > movwf CHAR ; Command to be sent is in W
> > call BUSY_FLAG? ; Wait for LCD to be ready
> > movf CHAR, 0
> > movwf PORTB ; Send data to LCD
> > bcf PORTA, RW ; Set LCD in read mode
> > bsf PORTA, RS ; Set LCD in command mode
> > bsf PORTA, E ; toggle E for LCD
> > bcf PORTA, E
> > ;low nibble transfer
> > swapf CHAR,0
> > movwf PORTB
> > bsf PORTA, E
> > bcf PORTA, E
> > RETURN
> > ;
> > BUSY_FLAG?
> >
> > bsf STATUS,RP0 ; Select Register page 1
> > movlw 0xF0 ; Set port_B for input
> > movwf TRISB
> > bcf STATUS, RP0 ; Select Register page 0
> > bcf PORTA, RS ; Set LCD for command mode
> > bsf PORTA, RW ; Setup to read busy flag
> > bsf PORTA, E ; Set E high
> > bcf PORTA, E ; Set E low
> > movf PORTB, 0 ; Read busy flag, DDram address
> > andlw 0xF0
> > movwf TEMP
> > bsf PORTA, E
> > bcf PORTA, E
> > swapf PORTB, 0
> > andlw 0x0F
> > iorwf TEMP
> > btfsc TEMP,7
> > ; goto BUSY_FLAG?
> > nop
> > bsf STATUS, RP0
> > movlw 0x00
> > movwf TRISB
> > bcf STATUS, RP0
> > RETURN
> >
> > ; movwf
> > ; movwf TEMP
> > ; btfsc TEMP, 7
> > ; ; Check busy flag, high=busy
> > ; goto BUSY_FLAG?
> > ; bcf PORTA, RW
> > ; bsf STATUS, RP0 ; Select Register page 1
> > ; movlw H'00'
> > ; movwf TRISB ; Set port_B for output
> > ; bcf STATUS, RP0 ; Select Register page 0
> > ; RETURN
> >
> > end
> >