Quote Originally Posted by Terry View Post
Paul,
Clever code, if the crystal oscillator is running at 20 MHz instead of 4 MHz, how would the code be modified, thanks.
Terry
Ok I know this is an old thread, but having just modified the code to run on an 18F4520 using a 20 Mhz crystal I thought I would post the code here. It also uses a parallel LCD (20 x 4) so hopefully answers one of the other questions raised. The LCD display needs some tidying up to overwrite previous digits (other wise you get 29,39,49 etc until 10 seconds turns over) but then that should be a simple matter to sort out

Code:
ASM 
  __CONFIG    _CONFIG1H, _OSC_HS_1H
  __CONFIG    _CONFIG2L, _PWRT_ON_2L  
  __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
  __CONFIG    _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H  
  __CONFIG    _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
ENDASM

DEFINE  OSC 20  ; 48 was old config settings 18F4520, 20mhz crystal
ADCON1 = $0F
clear


DEFINE LCD_DREG  PORTB           ' LCD Data port
DEFINE LCD_DBIT  0               ' starting Data bit (0 or 4)
DEFINE LCD_EREG  PORTB           ' LCD Enable port
DEFINE LCD_EBIT  5               '     Enable bit  (on EasyPIC 5 LCD)
DEFINE LCD_RSREG PORTB           ' LCD Register Select port
DEFINE LCD_RSBIT 4               '     Register Select bit   (on EasyPIC 5 LCD)
DEFINE LCD_BITS  4               ' LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 4               ' number of lines on LCD
DEFINE LCD_COMMANDUS 2000        ' Command delay time in us 
DEFINE LCD_DATAUS 50             ' Data delay time in us 

LED var portA.7



CMCON=7                'all digital 
T0CON = %11000111
INTCON=0               'interrupts off
'**********************************************************
HzTimer VAR Word         '1/2 second counter (2 Hz)    
HH VAR Byte  ' Hours 0-23
MM VAR ByTE  ' Minutes 0-59
SS VAR Byte  ' Seconds 0-59
col VAR Byte  ' colon 1=on, 0=0ff

HzTimer=$7A12        'for 1/2 Sec
HH=12:MM=0:SS=0:col=0 'initial conditions (12:00 O'clock noon)
'**********************************************************

LCDOUT $FE,1:FLAGS=0:PAUSE 250:LCDOUT $FE,1:PAUSE 250 ' Initialize LCD 

Main:

ClockLoop: IF intcon.2=0 THEN ClockLoop	'Poll for TMRO overflow
INTCON.2=0 ' Clear TMRO overflow flag

HzTimer=HzTimer-$1000	'decrement timer count

IF HzTimer < $1000  THEN
    IF Col=10 THEN    ' update time'
        SS=SS+1
        LED =0    ' Turn off GP1
        IF SS=60 THEN   ' minute
            SS=0 
            MM=MM+1
            IF MM=60 THEN    ' hour            
                MM=0
                HH=HH+1
                IF HH=24 THEN HH=0
                IF HH=20 then LED = 1    ' Turn on GP0 at 8:00pm
               LED =1    ' Turn On  GP1 for 1 second on the hour
            ENDIF                           ' Adjust these to meet your needs
            if MM=15 then LED = 0        ' Turn off GP0 at 8:15pm  
        ENDIF
    ENDIF
    Col=Col+1

    HzTimer=HzTimer+$7A12	' Add 0.5 seconds to count
ELSE
    ' Do something here but must be less than 65.5 mSec
ENDIF
      if Col=11 then 
    Col=1
    endif
   
    LCDOut $FE,$D4,#HH,":",#MM,":",#SS
    
GOTO  Main 'forever
' **************************************************************
END