PIC18F14K50は16ビットアーキテクチャを
持った次世代PICである。
メモリが大きいので C言語に向いている

LEDを点滅させてみよう
回路は下記である

さて LEDを点滅させて、KEY入力で オレンジと緑を切り替えている、簡単なプログラムである
LED7を点滅させておいて
KEY RB5が入力されると、フラグを立てる
フラグが立っているあいだは LED6が点滅している


LIST P=PIC18F14K50
INCLUDE "P18F14K50.INC"

; TODO INSERT CONFIG CODE HERE USING CONFIG BITS GENERATOR
CONFIG USBDIV = OFF ;USB CLOCK SELECTION BIT
CONFIG MCLRE = OFF ;MCLR PIN ENABLE BIT
CONFIG IESO = OFF ;Internal/External Oscillator Switchover bit
CONFIG FCMEN = OFF ;Fail-Safe Clock Monitor Enable bit
CONFIG FOSC = IRC ;OSCILLATOR SELECTION BITS
CONFIG PWRTEN = ON ;Power-up Timer Enable bit
CONFIG PLLEN = OFF ;X PLL ENABLE BIT(OSCILLATOR MULTIPLIED BY 4)
CONFIG PCLKEN = OFF ;PRIMARY CLOCK ENABLE BIT
CONFIG BOREN = OFF ;Brown-out Reset Enable bits
CONFIG LVP = OFF ;Single-Supply ICSP Enable bit
CONFIG CPUDIV=NOCLKDIV ;CPU SYSTEM CLOCK SELECTION BIT
CONFIG CP0 = OFF ;Code Protection bit
CONFIG CP1 = OFF ;Code Protection bit
CONFIG CPD = OFF ;Data EEPROM Code Protection bit
CONFIG CPB = OFF ;Boot Block Code Protection bit
CONFIG WDTEN = OFF ;Watchdog Timer Enable bit
CONFIG HFOFST = OFF,STVREN = OFF,BBSIZ = OFF,XINST = OFF
CONFIG EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF

tim1 EQU 21h
tim2 EQU 22h
mem1 EQU 23h
mem2 EQU 25h
;-----------------------------------------
RES_VECT CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program

; TODO ADD INTERRUPTS HERE IF USED

MAIN_PROG CODE ; let linker place main program

START


CLRF ANSEL
CLRF ANSELH
movlw B'01100010' ;内部8Mクロック
movwf OSCCON ;w---> OSCCON
movlw B'10000000' ;0= 出力
movwf TRISC
movlw B'00110000' ;1= 入力
movwf TRISB
movlw B'11111111' ;1= 入力
movwf TRISA


MAIN
bsf LATB,7 ;緑
bsf LATB,6 ;オレンジ
call t1s
bcf LATB,7
bcf LATB,6
call t1s

LOOP:

    bsf LATB,7;
    call t500ms
    bcf LATB,7
    call t500ms

    btfss PORTB,5    ;1ならば JMP次行?
    goto LOOP11
    nop
    GOTO LOOP

LOOP11:
    bsf LATB,6
    call t500ms
    bcf LATB,6
    call t500ms
    btfss PORTB,4
    goto LOOP
    nop
    goto LOOP11

GOTO MAIN    ; loop forever

;----------タイマー 10MHZの時---25サイクル(10us)-------------------
;16ビット対応なので PIC18は goto $+2   とすること
t10us:
   goto $+2 ;2サイクル
   goto $+2
   goto $+2
   goto $+2
   goto $+2

   goto $+2 ;2サイクル
   goto $+2
   goto $+2
   goto $+2
   goto $+2
   nop
   return

t500us:
   movlw D'50'    ;w <---89
   movwf tim1    ;レジスタを使用する
   t500us_1:
   call t10us
   decfsz tim1   ,f ;0でなければ次の行、違えば 次は飛ばす
   goto t500us_1
   nop
   return


t1ms:
   movlw D'89'    ;w <---89
   movwf tim1    ;レジスタを使用する
   t1ms_1:
   call t10us
   decfsz tim1,f    ;0でなければ次の行、違えば 次は飛ばす
   goto t1ms_1
   nop
   goto $+2
   return

;-------- 25000サイクル--------------
t10ms:
    movlw D'10'
    movwf tim2
t10ms_1:
    call t1ms
    decfsz tim2,f
    goto t10ms_1
    nop
    return

;-------- 250000サイクル--------------
t100ms:
    movlw D'10'
    movwf tim2
t100ms_1:
   call t1ms
   call t1ms
   decfsz tim2,f
   goto t100ms_1
   nop
   return

;-------- 1250000サイクル--------------
t500ms:
   movlw D'250'
   movwf tim2
   t500ms_1:
   call t1ms
   call t1ms
   decfsz tim2,f
   goto t500ms_1
   nop
   return
;----------------------
t1s:
   movlw D'250'
   movwf tim2
   t1s_1:
   call t1ms
   call t1ms
   call t1ms
   call t1ms
   decfsz tim2,f
   goto t1s_1
   nop
   return



END

PIC18F14KのLED点灯
アセンブラ

次に重要なのは、I/O設定である
LEDの点滅(出力)はできたが、KEY入力ができなかった。
PIC16と違って、I/Oを デジタルI/Oに設定しないと、KEYのON,OFFが検出できないのである

CLRF ANSEL
CLRF ANSELH

0=デジタルI/Oに割当


ラッチレジスタをもっているので、PORTではなくLATを使う

動作の基本
PIC18F14Kは内部クロックをもっているので、内部クロックを働かせよう

movlw B'01100010' ;内部8Mクロック
movwf OSCCON ;w  --->OSCCON = 0b01100010; // 内部クロック 8M

これで内部クロックが働く

工事中ーー