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 __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