PIC フレーズ集

[戻る]

年に 1,2 度程度の頻度でちょっとした電子回路を組む必要があります. 電子回路といっても, 速度がそんなに要らない部分は PIC を使ってごまかせる程度のものですが.

プログラム頻度がその程度だと, 命令なんて覚えきれません. 過去作ったプログラムから似たようなことをしていぶ部分を引っ張ってきて, 「たしかこんなことする命令あったよな〜」と早見表を見ながら適当に 書いていきます.

毎回そんなことするのもなんなんで, 良く使うフレーズを少しまとめてみました.

高級言語風表記フレーズ備考
nop (1cycle)   nop
nop (2cycle)   goto $+1
[W]=N   movlw N
[W]+=N   addlw N
[W]-=N   addlw -N
[W]=MEM   movf MEM,w
[W]+=MEM   addwf MEM,w
[W]-=MEM   subwf MEM,w
  sublw 0
C フラグを見ない場合
[W]-=MEM   movwf TMP
  movf MEM,w
  subwf TMP,w
C フラグを見る場合, TMP 要
MEM=0   clrf MEM
MEM=[W]   movwf MEM
MEM=N   movlw N
  movwf MEM
[W]破壊
MEM+=N   movlw N
  addwf MEM,f
[W]破壊
MEM-=N   movlw N
  subwf MEM,f
[W]破壊
MEM++   incf MEM,f C フラグは変化しない
MEM--   decf MEM,f C フラグは変化しない
MEM*=2   bcf STATUS,0
  rlf MEM,f
MEM/=2   bcf STATUS,0
  rrf MEM,f
MEM+=[W]   addwf MEM,f
MEM-=[W]   subwf MEM,f
if (MEM.B==1)
  XXX
  btfsc MEM, B
  XXX
if (MEM.B==0)
  XXX
  btfss MEM, B
  XXX
if (MEM.B==1){
  XXXs
}
  btfss MEM, B
  goto skip
  XXXs
skip
if (MEM.B==0){
  XXXs
}
  btfsc MEM, B
  goto skip
  XXXs
skip
if (MEM.B==1){
  XXXs
} else {
  YYYs
}
  btfss MEM, B
  goto skip1
  XXXs
  goto skip2
skip1
  YYYs
skip2
if (MEM == 0)
  XXX
  movf MEM,f
  btfsc STATUS,2
  XXX
if (MEM == N)
  XXX
  movlw N
  subwf MEM,w
  btfsc STATUS,2
  XXX
[W] 破壊
if (MEM != N)
  XXX
  movlw N
  subwf MEM,w
  btfss STATUS,2
  XXX
[W] 破壊
if (MEM < N)
  XXX
  movlw N
  subwf MEM,w
  btfss STATUS,0
  XXX
[W] 破壊
if (MEM <= N)
  XXX
  movf MEM,w
  sublw N
  btfsc STATUS,0
  XXX
[W] 破壊
if (MEM > N)
  XXX
  movf MEM,w
  sublw N
  btfss STATUS,0
  XXX
[W] 破壊
if (MEM >= N)
  XXX
  movlw N
  subwf MEM,w
  btfsc STATUS,0
  XXX
[W] 破壊
for(MEM = 0; MEM < 256; MEM++){
  XXXs
}
  clrf MEM
loop
  XXXs
  incfsz MEM,f
  goto loop
for(MEM = 256; MEM > 0; MEM--){
  XXXs
}
  clrf MEM
loop
  XXXs
  decfsz MEM,f
  goto loop
for(MEM = N1; MEM < N2; MEM++){
  XXXs
}
  movlw N1
  movwf TMP
loop
  XXXs
  movlw N2
  incf TMP,f
  subwf TMP,w
  btfss STATUS,0
  goto loop
[W]破壊
for(MEM = N1; MEM >= N2; MEM--){
  XXXs
}
  movlw N1
  movwf TMP
loop
  XXXs
  decf TMP,W
  movwf TMP
  sublw N2
  btfss STATUS,0
  goto loop
while(MEM==0){
  XXXs
}
loop
  movf MEM,w
  btfss STATUS,2
  goto skip
  XXXs
  goto loop
skip
while(MEM==N){
  XXXs
}
loop
  movf MEM,w
  sublw N
  btfsc STATUS,2
  goto skip
  XXXs
  goto loop
skip
do {
  XXXs
} while (MEM.B==1)
loop
  XXXs
  btfsc MEM, B
  goto loop
DIM ([W])=MEM   addlw DIM
  movwf FSR
  movf MEM,w
  movwf INDF
[W] 破壊,
DIM はバンク 0 に存在していること
DIM (MEM)=[W]   movwf TMP
  movlw DIM
  addwf MEM,w
  movwf FSR
  movf TMP,w
  movwf INDF
[W] 破壊, TMP 要,
DIM はバンク 0 に存在していること
MEM=DIM ([W])   addlw DIM
  movwf FSR
  movf INDF,w
  movwf MEM
[W] 破壊,
DIM はバンク 0 に存在していること
[W]=DIM (MEM)   movlw DIM
  addwf MEM,w
  movwf FSR
  movf INDF,w
DIM はバンク 0 に存在していること
{MEM1_H, MEM1_L}
  += {MEM2_H, MEM2_L}
  movf MEM2_L,w
  addwf MEM1_L,f
  btfsc STATUS,0
  incf MEM1_H
  movf MEM2_H,w
  addwf MEM1_H,f
[W] 破壊
{MEM1_H, MEM1_L}
  = MEM2 * MEM3
  clrf MEM1_L
  movlw 8
  movwf TMP
loop
  bcf STATUS,0
  rlf MEM1_L,f
  rlf MEM1_H,f
  rlf MEM3,f
  btfss STATUS,0
  goto skip
  movf MEM2,w
  addwf MEM1_L,f
  btfsc STATUS,0
  incf MEM1_H
skip
  decfsz TMP
  goto loop
[W], MEM3 破壊, TMP 要
[W]="pic16"([W])
return
  addwf pc,f
  retlw 'p'
  retlw 'i'
  retlw 'c'
  retlw '1'
  retlw '6'
[W] が要素数 (ここでは 5 )以上だと
とんでもないことになる.
事前に確認をしておいた方が安全
switch([W]){
  case 0: goto label1
  case 1: goto label2
  case 2: goto label3
  case 3: goto label4
  case 4: goto label5
}
  addwf pc,f
  goto label1
  goto label2
  goto label3
  goto label4
  goto label5
[W] が要素数 (ここでは 5 )以上だと
とんでもないことになる.
事前に確認をしておいた方が安全


2009.3