list p=16f84 #include p16f84.inc RAMA equ 0x0c ; 時間造りのときに割り当て番地に0CH,0DHを使用します。 RAMB equ 0x0d ; 番地と同じ意味(EQU)、判りやすくしています. ORG 0 ; 0番地から始めます. GOTO INISET ;STARTへ飛ぶ INISET BSF STATUS,RP0 ;レジスタSTATUSを1にする(ページ1)/裏舞台の1ページに設定します。 MOVLW B'11100000' ;11100000BをレジスタWに入れる, 0が出力, 1が入力を意味する MOVWF TRISA ;TRISAにレジスタWのデータ-を移動/A ポートの設定 MOVLW B'11110011' ;11110011BをレジスタWに入れる, 0が出力, 1が入力を意味する MOVWF TRISB ;TRISBにレジスタWのデータ-を移動/Bポートの設定 BCF OPTION_REG,7 ;入力をプルアップ(目玉の部分) BCF STATUS, RP0 ;レジスタSUTATUSを0にすなわちページを表舞台の0ページに戻しておく MOVLW B'00011111' MOVWF PORTA ; 停止スタンバイ MOVLW B'11110011' MOVWF PORTB GOTO START START CALL DTIME_1 ; 時間稼ぎ GOTO MAIN ;MAINへ行こう MAIN ; MOVLW B'00000110' ; forward movlw B'00001010' ; rotate MOVWF PORTA ;いざ前進(1、4ビット目0で右,左前L/,2,3ビット目右後,左後Hn CALL DTIME_1 ; 時間稼ぎ MOVLW B'00001111' MOVWF PORTA ;  停止(1から4ビット全てHで動作せず)上の回路を眺めながら理解 CALL DTIME_1 ;  時間稼ぎ GOTO MAIN DTIME_1 ; call delay routine call TIME_1 ; 0.1[s] x 5 call TIME_1 call TIME_1 call TIME_1 call TIME_1 ; 0.1秒の遅延時間の作成。10Mhzクロックの計算、これが厄介ですが、 TIME_1 MOVLW 0x44 ; 16*4+4=68 16進数 MOVWF RAMA ; RAMA にいれる(0CH番地に)。 TIME_11 CLRF RAMB ; (256*3*68+68*4)*0.4=20.998ms TIME_12 ; このチップが8ビットなのでmax256回まで(4hzで0.4usが1語命令) DECFSZ RAMB,1 ;(MOVLW、MOVWF,CLRFが1命令計3命令/DECFSZ,が1命令 GOTO TIME_12 ;GOTOが2命令、RETURNが2命令です。)後は考えてみてください。 DECFSZ RAMA,1 GOTO TIME_11 TIME_13 MOVLW 0X00 MOVWF RAMA TIME_14 CLRF RAMB ; (256*3*256+256*4)*0.4=79.053ms TIME_15 DECFSZ RAMB,1 GOTO TIME_15 DECFSZ RAMA,1 GOTO TIME_14 RETURN ; 20.998+79.053=100.51ms    すなわち約0.1秒が出来ました。 end