Hi,

I currently have a matrix keypad and lcd connected to a PIC18F4620 running a 20MHz external crystal. When a key is pressed the number of the key is displayed on the lcd and also sent out via the serial port. Everything works as it should providing I have DEFINE OSC 8. As soon as I try to set it to 20, I get jibber out of the serial port.

I am sure I have an error in my configuation and would appreciate any help on this one.

Andy

Code:
;----- CONFIG1H Options --------------------------------------------------
'_OSC_LP_1H           EQU  H'F0'    ; LP
'_OSC_XT_1H           EQU  H'F1'    ; XT
'_OSC_HS_1H           EQU  H'F2'    ; HS
'_OSC_RC_1H           EQU  H'F3'    ; RC
'_OSC_EC_1H           EQU  H'F4'    ; EC-OSC2 as Clock Out
'_OSC_ECIO6_1H        EQU  H'F5'    ; EC-OSC2 as RA6
'_OSC_HSPLL_1H        EQU  H'F6'    ; HS-PLL Enabled
'_OSC_RCIO6_1H        EQU  H'F7'    ; RC-OSC2 as RA6
'_OSC_INTIO67_1H      EQU  H'F8'    ; INTRC-OSC2 as RA6, OSC1 as RA7
'_OSC_INTIO7_1H       EQU  H'F9'    ; INTRC-OSC2 as Clock Out, OSC1 as RA7

'_FCMEN_OFF_1H        EQU  H'BF'    ; Disabled
'_FCMEN_ON_1H         EQU  H'FF'    ; Enabled

'_IESO_OFF_1H         EQU  H'7F'    ; Disabled
'_IESO_ON_1H          EQU  H'FF'    ; Enabled

;----- CONFIG2L Options --------------------------------------------------
'_PWRT_ON_2L          EQU  H'FE'    ; Enabled
'_PWRT_OFF_2L         EQU  H'FF'    ; Disabled

'_BOREN_OFF_2L        EQU  H'F9'    ; Disabled
'_BOREN_ON_2L         EQU  H'FB'    ; SBOREN Enabled
'_BOREN_NOSLP_2L      EQU  H'FD'    ; Enabled except SLEEP, SBOREN Disabled
'_BOREN_SBORDIS_2L    EQU  H'FF'    ; Enabled, SBOREN Disabled

'_BORV_46_2L          EQU  H'E7'    ; 4.6V
'_BORV_43_2L          EQU  H'EF'    ; 4.3V
'_BORV_28_2L          EQU  H'F7'    ; 2.8V
'_BORV_21_2L          EQU  H'FF'    ; 2.1V

;----- CONFIG2H Options --------------------------------------------------
'_WDT_OFF_2H          EQU  H'FE'    ; Disabled
'_WDT_ON_2H           EQU  H'FF'    ; Enabled

'_WDTPS_1_2H          EQU  H'E1'    ; 1:1
'_WDTPS_2_2H          EQU  H'E3'    ; 1:2
'_WDTPS_4_2H          EQU  H'E5'    ; 1:4
'_WDTPS_8_2H          EQU  H'E7'    ; 1:8
'_WDTPS_16_2H         EQU  H'E9'    ; 1:16
'_WDTPS_32_2H         EQU  H'EB'    ; 1:32
'_WDTPS_64_2H         EQU  H'ED'    ; 1:64
'_WDTPS_128_2H        EQU  H'EF'    ; 1:128
'_WDTPS_256_2H        EQU  H'F1'    ; 1:256
'_WDTPS_512_2H        EQU  H'F3'    ; 1:512
'_WDTPS_1024_2H       EQU  H'F5'    ; 1:1024
'_WDTPS_2048_2H       EQU  H'F7'    ; 1:2048
'_WDTPS_4096_2H       EQU  H'F9'    ; 1:4096
'_WDTPS_8192_2H       EQU  H'FB'    ; 1:8192
'_WDTPS_16384_2H      EQU  H'FD'    ; 1:16384
'_WDTPS_32768_2H      EQU  H'FF'    ; 1:32768

;----- CONFIG3H Options --------------------------------------------------
'_MCLRE_OFF_3H        EQU  H'7F'    ; Disabled
'_MCLRE_ON_3H         EQU  H'FF'    ; Enabled

'_LPT1OSC_OFF_3H      EQU  H'FB'    ; Disabled
'_LPT1OSC_ON_3H       EQU  H'FF'    ; Enabled

'_PBADEN_OFF_3H       EQU  H'FD'    ; Port B<4:0> digital on RESET
'_PBADEN_ON_3H        EQU  H'FF'    ; Port B<4:0> analog on RESET

'_CCP2MX_PORTBE_3H    EQU  H'FE'    ; Muxed with RB3
'_CCP2MX_PORTC_3H     EQU  H'FF'    ; Muxed with RC1

;----- CONFIG4L Options --------------------------------------------------
'_STVREN_OFF_4L       EQU  H'FE'    ; Disabled
'_STVREN_ON_4L        EQU  H'FF'    ; Enabled

'_LVP_OFF_4L          EQU  H'FB'    ; Disabled
'_LVP_ON_4L           EQU  H'FF'    ; Enabled

'_XINST_OFF_4L        EQU  H'BF'    ; Disabled
'_XINST_ON_4L         EQU  H'FF'    ; Enabled

'_DEBUG_ON_4L         EQU  H'7F'    ; Enabled
'_DEBUG_OFF_4L        EQU  H'FF'    ; Disabled

;----- CONFIG5L Options --------------------------------------------------
'_CP0_ON_5L           EQU  H'FE'    ; Enabled
'_CP0_OFF_5L          EQU  H'FF'    ; Disabled

'_CP1_ON_5L           EQU  H'FD'    ; Enabled
'_CP1_OFF_5L          EQU  H'FF'    ; Disabled

'_CP2_ON_5L           EQU  H'FB'    ; Enabled
'_CP2_OFF_5L          EQU  H'FF'    ; Disabled

'_CP3_ON_5L           EQU  H'F7'    ; Enabled
'_CP3_OFF_5L          EQU  H'FF'    ; Disabled

;----- CONFIG5H Options --------------------------------------------------
'_CPB_ON_5H           EQU  H'BF'    ; Enabled
'_CPB_OFF_5H          EQU  H'FF'    ; Disabled

'_CPD_ON_5H           EQU  H'7F'    ; Enabled
'_CPD_OFF_5H          EQU  H'FF'    ; Disabled

;----- CONFIG6L Options --------------------------------------------------
'_WRT0_ON_6L          EQU  H'FE'    ; Enabled
'_WRT0_OFF_6L         EQU  H'FF'    ; Disabled

'_WRT1_ON_6L          EQU  H'FD'    ; Enabled
'_WRT1_OFF_6L         EQU  H'FF'    ; Disabled

'_WRT2_ON_6L          EQU  H'FB'    ; Enabled
'_WRT2_OFF_6L         EQU  H'FF'    ; Disabled

'_WRT3_ON_6L          EQU  H'F7'    ; Enabled
'_WRT3_OFF_6L         EQU  H'FF'    ; Disabled

;----- CONFIG6H Options --------------------------------------------------
'_WRTB_ON_6H          EQU  H'BF'    ; Enabled
'_WRTB_OFF_6H         EQU  H'FF'    ; Disabled

'_WRTC_ON_6H          EQU  H'DF'    ; Enabled
'_WRTC_OFF_6H         EQU  H'FF'    ; Disabled

'_WRTD_ON_6H          EQU  H'7F'    ; Enabled
'_WRTD_OFF_6H         EQU  H'FF'    ; Disabled

;----- CONFIG7L Options --------------------------------------------------
'_EBTR0_ON_7L         EQU  H'FE'    ; Enabled
'_EBTR0_OFF_7L        EQU  H'FF'    ; Disabled

'_EBTR1_ON_7L         EQU  H'FD'    ; Enabled
'_EBTR1_OFF_7L        EQU  H'FF'    ; Disabled

'_EBTR2_ON_7L         EQU  H'FB'    ; Enabled
'_EBTR2_OFF_7L        EQU  H'FF'    ; Disabled

'_EBTR3_ON_7L         EQU  H'F7'    ; Enabled
'_EBTR3_OFF_7L        EQU  H'FF'    ; Disabled

;----- CONFIG7H Options --------------------------------------------------
'_EBTRB_ON_7H         EQU  H'BF'    ; Enabled
'_EBTRB_OFF_7H        EQU  H'FF'    ; Disabled



DEFINE OSC 8 '20

'-- Defines for LCD -----------------
' Set LCD data port
DEFINE  LCD_DREG     PORTD 
' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE  LCD_DBIT     4
' Set LCD Register Select (RS) port
DEFINE  LCD_RSREG    PORTD
' Set LCD Register Select (RS) bit 
DEFINE  LCD_RSBIT    2
' Set LCD Enable port
DEFINE  LCD_EREG     PORTD
' Set LCD Enable bit
DEFINE  LCD_EBIT     3
' Set LCD bus size (4 or 8) bits
DEFINE  LCD_BITS     4
' Set number of lines on LCD
DEFINE  LCD_LINES    2
' Set command delay time in uS
DEFINE LCD_COMMANDUS 1500
' Set data delay time in uS    
DEFINE LCD_DATAUS     44
'------------------------------------

'-- Defines for Keypad --------------

DEFINE KEYPAD_ROW        2        ' 2 ROW keypad       
DEFINE KEYPAD_ROW_PORT   PORTB    ' ROW port = PORTB
DEFINE KEYPAD_ROW_BIT    4        ' ROW0 = PORTB.4
DEFINE KEYPAD_COL        6        ' 6 COL keypad
DEFINE KEYPAD_COL_PORT   PORTC    ' COL port = PORTC
DEFINE KEYPAD_COL_BIT    0        ' COL0 = PORTB.0
DEFINE KEYPAD_DEBOUNCEMS 100      ' debounce delay = 100 mSec
DEFINE KEYPAD_AUTOREPEAT 1        ' use auto-repeat feature (Yes=1, No=0)
'------------------------------------

'-- Defines for USART ---------------
' Set receive register for receiver enabled
define HSER_RCSTA 90h
' Set transmit register for transmitter enabled
define HSER_TXSTA 20h
' Set baud rate
Define HSER_BAUD 9600


'------------------------------------

@ __config _CONFIG1H, _OSC_HS_1H 
@ __config _CONFIG2L, _PWRT_ON_2L & _BOREN_SBORDIS_2L & _BORV_28_2L
@ __config _CONFIG2H, _WDT_OFF_2H
@ __config _CONFIG3H, _PBADEN_OFF_3H & _MCLRE_ON_3H
@ __config _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L   


ByteA   var byte

    
    OSCCON.6 = 1 ' Internal Oscillator Frequency Select bits
    OSCCON.5 = 1
    OSCCON.4 = 1
    
    OSCCON.1 = 0 ' System Clock Select bits
    OSCCON.0 = 0
    
    CMCON.0 = 1    ' Turn comparators OFF
    CMCON.1 = 1
    CMCON.2 = 1

    ADCON0.0 = 0        ' A/D Coverter Module On bit. 1=enabled, 0=disabled  

    clear
    
    TRISA = 111111    ' 
    TRISB = 001111    ' 
    TRISC = 111111    '
    TRISD = 001111    '
    
    include "KeyPad.bas"
 
    pause 500 ' wait one half second for LCD to initialise
    
  
Init:
    lcdout $FE,1,"Press any Key"

Start:
    gosub KeypadScan ' is an include file
    if Key then      '
        lcdout $FE,1,"Key=",dec Key 'display value of pressed key on LCD        
        hserout ["Key= ",dec Key,13,10] 'send value out serial port 
        Key = 0
        pause 500
        goto init
    endif
    goto start