# **微算機學習筆記** **lab1** 助教給的instruction參考網址: http://technology.niagarac.on.ca/staff/mboldin/18F_Instruction_Set/ 小提醒: 如果想要打註解,不能用`//`而必須使用`;` # Basic Instruction Introduction: **MOVLW(Load WREG)** 用法: MOVLW k 其中k可以為0x00(hexidecimal)、D'0'(decimal)、b'00000000'(binary),三種類別。這條指令會把k值丟入WREG(working register)內。 **MOVWF(Write File)** 用法: MOVWF k 經測試,k和MOVLW一樣可以有三種輸入方式,其功能是將WREG內的數值移動到k所代表的File Register記憶體空間。 ps. File Register的記憶體位置表示明明是用12bits(0x000)來表示,但我們在輸入時卻只輸入8bits(0x00),其原因**是因為Instruction的參數k最多只能輸入8bits**,所以若想控制剩下的4bits則需要其他指令(Access Bank、BSR)。 **CLRF** 用法: CLRF k 經測試,k和MOVLW一樣可以有三種輸入方式,其功能是將File Register的位置k內的數值清空。**若將k改成WREG,則可將WREG清空。** **INCF** 用法: INCF k 這條指令會將k位置的值加一。**使用前建議先用CLRF k清空,以免有殘留值。** **DECF** 用法: DECF k 這條指令會將k位置的值減一。 **ADDWF** 用法: ADDWF k 這條指令等同於File[k] += WREG。 ADDWF k, d 若d=0 or d=w,則這條指令等同於WREG += File[k]。 若d=1,則等同於ADDWF k。 **MOVF** 用法: MOVF k 等於沒做事。把k位置的東西移到k位置。 MOVF k, d 若d=0 or d=w,則會將k位置的東西覆蓋到WREG上。 # 迴圈製作教學 首先要知道GOTO這個Instruction: GOTO k 其中k為你要前往的label(自己隨便設),然後當你的程式執行到這一行他就會**跳到label的下一行** 範例的簡單無限迴圈: ``` List p=18f4520 #include<p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x00 intial: CLRF 0x00 start: INCF 0x00 GOTO start end ``` 如果想要有條件中止怎麼辦? 那可以用DECFSZ(Decrecement F, Skip if Zero) 這東西有點像for迴圈內那個`i--`,如果`i==0`則會跳過下一條指令。 使用方法如下: ``` List p=18f4520 #include<p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x00 intial: CLRF 0x00 CLRF 0x01 MOVLW 0x04 MOVWF 0x01 start: INCF 0x00 DECFSZ 0x01 GOTO start end ``` 其中的i我放在0x01,初始值為4。當整個迴圈執行一次0x01內的值就會減一,直到內部值為0時他就會**跳過他的下一條指令,也就是GOTO start**。當這份程式執行完後我們可以在0x00內得到4這個值。 # 條件判斷式 指令介紹: **CPFSEQ(Equal)** 用法: CPFSEQ k 這條指令會判斷**k位置的數值是否和WREG內一樣**?若相同則會跳過下一行指令。 **CPFSGT(Greater Than)** 用法: CPFSGT k 這條指令會判斷**k位置的數值是否大於WREG**?若`>`則會跳過下一行指令。 **CPFSLT(Less Than)** 用法: CPFSLT k 這條指令會判斷**k位置的數值是否小於WREG**?若`<`則會跳過下一行指令。 用CPFSEQ來做迴圈的例子: ``` List p=18f4520 #include<p18f4520.inc> CONFIG OSC = INTIO67 CONFIG WDT = OFF org 0x00 intial: CLRF 0x00 MOVLW 0x04 start: INCF 0x00 CPFSEQ 0x00 ;如果0x00等於4就跳出迴圈,否則加一 GOTO start end ``` # 特別的指令 指令介紹: **RRNCF(Rotate Right)** 用法: RRNCF k 這條指令就是把所有bit往右移一格,如果到了最右邊則自動移到最左邊。 例如0x00內有一個值`00101001`,當執行一次RRNCF則會變成`10010100`。 **BTFSS** 用法: BTFSS k, b 這條指令是用來檢查k的特定bit是否為1,如果為1則跳過下一條指令的執行。其中b則用來決定要檢查的bit是哪一個。如果**b=0為檢查最右側bit,b=7為檢查最左側bit**。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up