年に 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 )以上だと とんでもないことになる. 事前に確認をしておいた方が安全 |