#INCLUDE <p18f45k20.inc>
CONFIG FOSC = INTIO67
CONFIG WDTEN = OFF, LVP = OFF, MCLRE = OFF
CBLOCK 000H
led_count: 1
switch_delay: 1
table_num: 1
CNT1: 1
CNT2: 1
count125: 1
ENDC
ORG 0
GOTO main
ORG 08H
GOTO interrupt
interrupt
BTFSS INTCON,INT0IF
RETFIE FAST
time_loop
RCALL loop125
NOP
DECFSZ switch_delay
BRA time_loop
BCF INTCON,INT0IF
BTFSC PORTB,RB0
RETFIE FAST
RCALL table
NOP
RETFIE FAST
;**************************************************************
;**************************************************************
main
CLRF led_count
MOVLW 01H
MOVWF switch_delay
MOVWF table_num
MOVLW 125
MOVWF count125
;init I/O
CLRF TRISD
BSF TRISE,TRISE0
BCF INTCON2,RBPU
BSF WPUB,WPUB0
;set initial clock speed
MOVF table_num,W
RCALL table
NOP
;init switch and turn on interrupts
BCF INTCON2,INTEDG0
BCF INTCON,INT0IF
BSF INTCON,INT0IE
BCF RCON,IPEN
BSF INTCON,PEIE
BSF INTCON,GIE
loop
INCF led_count,F
MOVFF led_count,LATD
RCALL TIM10M
NOP
BRA loop
;*******************************************************************
;*******************************************************************
loop125
DECFSZ count125
BRA loop125
MOVLW 125
MOVWF count125
RETURN
; 100usec?????????
TIM100
MOVLW 0C7H ;??199??
MOVWF CNT1 ;???????
LOOP1
NOP ;???NOP
NOP ;(2+3)*199-1=994 cycle
DECFSZ CNT1,F ;??????
BRA LOOP1 ;????
RETURN ;2+994+2=998 cycle
;*********
; 10msec?????????
TIM10M
MOVLW 064H ;??100??
MOVWF CNT2 ;???????
LOOP2
CALL TIM100 ;100usec????
DECFSZ CNT2,F ;??????
BRA LOOP2 ;????
RETURN ;??????
table
ADDWF table_num,W
ADDWF PCL,F
NOP
GOTO C_250kHz
GOTO C_4MHz
GOTO C_64MHz
C_250kHz
MOVLW 10H
MOVWF OSCCON
BCF OSCTUNE,PLLEN
MOVLW 02H
MOVWF table_num
MOVLW 01H
MOVWF switch_delay
RETURN
C_4MHz
MOVLW 50H
MOVWF OSCCON
BCF OSCTUNE,PLLEN
MOVLW 03H
MOVWF table_num
MOVLW 16H
MOVWF switch_delay
RETURN
C_64MHz
MOVLW 70H
MOVWF OSCCON
BSF OSCTUNE,PLLEN
MOVLW 01H
MOVWF table_num
MOVLW 255
MOVWF switch_delay
RETURN
END