Hello. I have PIC16F1939 with the following code running.
The LCD is common 1602 LCD, at 4 or 8mhz oscillator speed it works just fine. However, it does not work at 16mhz speed - either shows garbage symbols on screen, or some letters are missing, or nothing is shown.
I found that changing value of DEFINE LCD_DATAUS 44 from default 44 to say 88 or 100 partially improves situation - screen works 50% times now, but still not a solution. Increasing this value more, or changing DEFINE LCD_COMMANDUS 1500 to another value does nothing.
The only workaround I found is to switch oscillator speed before using LCD to 8mhz and then back to 16 mhz, but I don't think this is right.

Any ideas?

Here's the reference code.

Code:
;----[16F1939 Hardware Configuration]-------------------------------------------
#IF __PROCESSOR__ = "16F1939"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg1 = _FOSC_INTOSC           ; INTOSC oscillator: I/O function on CLKIN pin
cfg1&= _WDTE_OFF              ; WDT disabled
cfg1&= _PWRTE_OFF             ; PWRT disabled
cfg1&= _MCLRE_ON             ; MCLR/VPP pin function is digital input
cfg1&= _CP_ON                 ; Program memory code protection is enabled
cfg1&= _CPD_OFF               ; Data memory code protection is disabled
cfg1&= _BOREN_OFF             ; Brown-out Reset disabled
cfg1&= _CLKOUTEN_OFF          ; CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin
cfg1&= _IESO_ON               ; Internal/External Switchover mode is enabled
cfg1&= _FCMEN_ON              ; Fail-Safe Clock Monitor is enabled
  __CONFIG _CONFIG1, cfg1


cfg2 = _WRT_OFF               ; Write protection off
cfg2&= _VCAPEN_OFF            ; All VCAP pin functionality is disabled
cfg2&= _PLLEN_OFF             ; 4x PLL disabled
cfg2&= _STVREN_ON             ; Stack Overflow or Underflow will cause a Reset
cfg2&= _BORV_19               ; Brown-out Reset Voltage (Vbor), low trip point selected.
cfg2&= _LVP_OFF               ; High-voltage on MCLR/VPP must be used for programming
  __CONFIG _CONFIG2, cfg2


#ENDCONFIG


#ENDIF


;----[Verify Configs have been specified for Selected Processor]----------------
;       Note: Only include this routine once, after all #CONFIG blocks
#IFNDEF MCU_FOUND
  #ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF


'nixie led clock electronics direct drive


DEFINE LCD_DREG PORTC  
DEFINE LCD_DBIT 4  
DEFINE LCD_RSREG PORTD  
DEFINE LCD_RSBIT 6  
DEFINE LCD_EREG PORTC  
DEFINE LCD_EBIT 3  
DEFINE LCD_BITS 4  
DEFINE LCD_LINES 2  
DEFINE LCD_COMMANDUS 1500  
DEFINE LCD_DATAUS 44
DEFINE ADC_BITS 10       ' Set number of bits in result
DEFINE ADC_CLOCK 3     ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds 


 
ADCON1=%11110011 'enable adc internal reference and justify
FVRCON=%11001111   'set internal reference to 4.096V
OSCCON=%111111111   'SET INTOSC TO 16MHZ
ANSELE=%00000000 'enable adc input porte.2
ANSELA=%00001111 'disable ADC on A except 4
ANSELB=%00000000 'disable ADC on B
ANSELD=%00000000 'disable ADC on D
TRISC=%00000000 'set PORTC as output all
TRISD=%00000000 'set PORTD as output all
TRISB=%00000000 'set PORTB as output all
TRISA=%00001111 'set PORTA part as input
TRISE=%00000000  'set PORTE as output all
WPUB=%00000000 'DISABLE B PULL UPS
OPTION_REG=%100000000 'disable all pull ups
LCDCON=%00000000  'disable LCD controller pins
LCDSE0=%00000000
LCDSE1=%00000000
LCDSE2=%00000000




DEFINE OSC 16 'set oscillator speed  


pause 1000
lcdout $fe, $1, "test"
pause 1000
stop