色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 專題 > 干貨分享:PIC單片機(jī)常用指令介紹與指令功能分類表

          干貨分享:PIC單片機(jī)常用指令介紹與指令功能分類表

          作者: 時(shí)間:2016-08-19 來(lái)源:網(wǎng)絡(luò) 收藏

          [導(dǎo)讀]源程序的編寫主要就是用這些基本的實(shí)現(xiàn)你的控制任務(wù)。但為了增加源程序的可讀性和可維護(hù)性,我們引入了偽的概念。偽本身不會(huì)產(chǎn)生可執(zhí)行的匯編指令,但它們可以幫組“管理”你編寫的程序,其實(shí)用性和必要性絕不亞于 35 條正真的匯編指令。

          本文引用地址:http://cafeforensic.com/article/201608/295769.htm

          關(guān)鍵詞:PIC單片機(jī)單片機(jī)

          源程序的編寫主要就是用這些基本的指令實(shí)現(xiàn)你的控制任務(wù)。但為了增加源程序的可讀性和可維護(hù)性,我們引入了偽指令的概念。偽指令本身不會(huì)產(chǎn)生可執(zhí)行的匯編指令,但它們可以幫組“管理”你編寫的程序,其實(shí)用性和必要性絕不亞于 35 條正真的匯編指令。我們?cè)诖酥亟榻B最常用的幾種偽指令。

          PIC單片機(jī)最常用的幾種指令介紹

          #include 或 include

          #include 偽指令的作用是把另外一個(gè)文件的內(nèi)容全部包含復(fù)制到本偽指令所在的位置。被包含復(fù)制的文件可以是任何形式的文本文件,當(dāng)然文件中的內(nèi)容和語(yǔ)法結(jié)構(gòu)必須是MPASM 能夠識(shí)別的。最經(jīng)常被“include”的是針對(duì) PIC 單片機(jī)內(nèi)部特殊寄存器定義的包 含 頭 文 件 , 在MPLAB安裝 后 它 們 全 部 放 在 路 徑 “ C:ProgramFilesMPLAB IDEMCHIP_Tools”下,每一個(gè)型號(hào)的 PIC 單片機(jī)都有一個(gè)對(duì)應(yīng)的預(yù)定義包含頭文件,擴(kuò)展名是“.inc”。除了一些符號(hào)預(yù)定義文件,你也可以把現(xiàn)有的其它程序文件作為一個(gè)代碼模塊直接“包含”進(jìn)來(lái)作為自己程序的一部分。見(jiàn)例 3-01。

          #include 把預(yù)定義的 PIC16F877A 寄存器符號(hào)包含到此處

          #include”math.asm” 把現(xiàn)有的程序文件包含進(jìn)來(lái)作為自己代碼的一部分

          例 3-01

          請(qǐng)注意被包含文件的引用方式。一種是《》尖括號(hào)引用,這種引用意味著讓編譯器去默認(rèn)的路徑下尋找該文件,MPASM默認(rèn)的寄存器預(yù)定義文件存放路徑即為上面提及的MPLAB 安裝后的目錄;另一種是””雙引號(hào)引用,這種引用方式的意思是指示編譯器從引號(hào)中指定的全程文件路徑下尋找該文件。例3-01 中”math.asm”沒(méi)有指定路徑,即意味著在當(dāng)前項(xiàng)目路徑下尋找 math.asm 文件。如果編譯器找不到被包含的文件,將會(huì)有錯(cuò)誤信息告知。請(qǐng)?jiān)谀愕脑闯绦蛑斜M量用 MPLAB 標(biāo)準(zhǔn)頭文件定義的寄存器符號(hào)。一來(lái)這些被定義的寄存器符號(hào)和芯片數(shù)據(jù)手冊(cè)上的描述一一對(duì)應(yīng),理解起來(lái)即直觀又容易;二來(lái)如果用你自己定義符號(hào)就缺乏一個(gè)大家能一起交流的標(biāo)準(zhǔn)平臺(tái),其他人要解讀你的代碼時(shí)將費(fèi)時(shí)費(fèi)力。故例3-01 中的首行#include 包含引用偽指令可以說(shuō)是 PIC 單片機(jī)程序編寫時(shí)的標(biāo)準(zhǔn)必備。

          list

          list 偽指令可以設(shè)定程序編譯時(shí)的一些信息,例如所選單片機(jī)的型號(hào),編譯時(shí)選擇的缺省數(shù)制等。例如:

          list p=16f877a, r=DEC 單片機(jī)型號(hào)為 PIC16F877A,無(wú)特別指明的數(shù)字為十進(jìn)制數(shù)

          例 3-02

          如果程序開(kāi)發(fā)時(shí)使用項(xiàng)目管理的模式,則所有 list偽指令可以描述的參數(shù)項(xiàng)都可以在項(xiàng)目的設(shè)定選項(xiàng)中通過(guò)對(duì)話框的形式設(shè)定并保存。在此只需對(duì) list 偽指令稍作了解即可。

          __config

          此偽指令的重要作用是把芯片的配置字設(shè)定在源程序中,請(qǐng)參閱 2.5 節(jié)的詳細(xì)說(shuō)明。建議大家盡量用此偽指令把芯片的配置字寫在程序中。

          __idlocs

          PIC 單片機(jī)中有一處非常特殊的標(biāo)記單元。它獨(dú)立于任何其它存儲(chǔ)器,唯一的作用就是作為一個(gè)標(biāo)記。此標(biāo)記值無(wú)法用軟件讀到,讀取和寫入的方法只有通過(guò)編程器實(shí)現(xiàn)。此標(biāo)記值沒(méi)有讀保護(hù),你可以利用它存放程序的版本或日期等信息。如果需要,則可以用偽指令 __idloc 在程序中定義具體的值。

          __idloc 0x1234

          設(shè)定芯片的標(biāo)記值為 0x1234,注意前面有兩個(gè)下劃線符

          例 3-03

          和__config 偽指令定義的配置字一樣,用__idloc 定義的芯片標(biāo)記值在最后也會(huì)存放在HEX 文件中,這就要求編程器能夠解析它。

          errorlevel

          errorlevel 的用途是控制編譯信息的輸出顯示。編譯器在編譯你的源程序時(shí)會(huì)提供很多信息,有些信息是你必須要處理的,例如錯(cuò)誤信息(Error),只要有錯(cuò)誤信息存在,你的程序?qū)⒂肋h(yuǎn)無(wú)法完成編譯;有些可能只需要關(guān)注,例如警告信息(Warning);也有一些可能你根本就不感興趣,它們只是一些提示信息(Message)而已。注意出現(xiàn)警告和提示信息時(shí)將不會(huì)中止編譯器的編譯工作,你的程序?qū)⒈痪幾g并最終產(chǎn)生 HEX 文件。圖 3-14 中顯示了一個(gè)程序編譯后的各種信息實(shí)例,其中既有錯(cuò)誤信息,也有警告和提示信息。我們可以用errorlevel 偽指令來(lái)控制輸出信息的級(jí)別,或刻意關(guān)閉/打開(kāi)一些提示信息。

          編譯信息的輸出顯示級(jí)別有三種,分別是 0、1 和 2。級(jí)別 0 代表顯示所有信息,包括各種錯(cuò)誤、警告和提示信息,如圖 3-14 所示;級(jí)別 1 代表顯示錯(cuò)誤和警告信息,忽略提示信息;級(jí)別 3 代表只顯示錯(cuò)誤信息而忽略警告和提示信息。在任何一個(gè)大的級(jí)別上還可以對(duì)某些信息單獨(dú)設(shè)定顯示或關(guān)閉。每個(gè)信息都有一個(gè)識(shí)別標(biāo)號(hào),見(jiàn)圖 3-14 中信息項(xiàng)“[]”中的數(shù)字,打開(kāi)或關(guān)閉某類信息只需在 errorlevel 偽指令中引用信息識(shí)別標(biāo)號(hào),并在其前面用“+”或“-”號(hào),即代表打開(kāi)或關(guān)閉這一類信息,例如:

          errorlevel 0, -302, -305 顯示所有信息,但不需要 302 和 305 這兩類提示信息

          errorlevel 1, +305 顯示錯(cuò)誤和警告信息,但同時(shí)還要關(guān)注 305 類的提示信息

          #define / #undefine 例 3-04

          #define 的作用是定義常數(shù)符號(hào),即用一個(gè)符號(hào)變量替換另一個(gè)符號(hào)串或變量。被替換的可以是任意字母數(shù)字組成的符號(hào)但替換者本身不能是一個(gè)純數(shù)字。例如:

          #define DELAY_TIME1000 定義常數(shù)符號(hào),即用 DELAY_TIME 符號(hào)代替 1000

          #define KEY1 PORTB,7 用KEY1 符號(hào)代替端口 PORTB 的第 7 引腳例 3-05

          用#define 偽指令定義符號(hào)后,可使程序中的變量或指令變得更具實(shí)際意義,也使程序變得更易維護(hù)。

          指令“btfss PORTB,7”和“btfss KEY1”在事先用了例 3-05 中的#define 后編譯的結(jié)果是一樣的,但明顯地后者看起來(lái)更容易理解,一看就知道這是在測(cè)試編號(hào)為KEY1 的一個(gè)按鍵。

          PIC指令分類表

          類型 助記符 操作說(shuō)明 命令說(shuō)明

          傳 送 類 MOVF F,dF→d 將F寄存器的內(nèi)容傳送到F本身(d=1)或W(d=0)(影響狀態(tài)位)Z

          MOVWF FW→F 將W寄存器的內(nèi)容傳送到F,W內(nèi)容不變-

          MOVLW KK→W 將8位立即數(shù)傳送到W寄存器-

          SWAPF F,dF半字節(jié)交換→dF寄存器的高4位和低4位交換位置后,結(jié)果存入F本身(d=1)或W(d=0)中-

          算 術(shù) 運(yùn) 算 類 ADDWF F,dF+W→dW寄存器的內(nèi)容和F寄存器的內(nèi)容相加,結(jié)果存入F(d=1)或W(d=0)中C,DC,Z

          ADDLW F,dK+W→WW寄存器的內(nèi)容和8位立即數(shù)相加,結(jié)果存入WC,DC,Z

          INCF F,dF+1→dF寄存器的內(nèi)容加1后,結(jié)果存入W(d=0)或F(d=1)中Z

          SUBWF F,dF-W→dF寄存器的內(nèi)容減去W寄存器的內(nèi)容,結(jié)果存入W(d=0)或F(d=1)中C,DC,Z

          SUBLW KK-W→W8位立即數(shù)減掉W寄存器的內(nèi)容,結(jié)果存入WC,DC,Z

          DECF F,dF-1→dF寄存器的內(nèi)容減1后,結(jié)果存入W(d=0)或F(d=1)中Z

          邏 輯 運(yùn) 算 類 ANDWF F,dF∧W→dW寄存器的內(nèi)容和F寄存器的內(nèi)容相與,結(jié)果存入F(d=1)或W(d=0)中Z

          ANDLW KK∧W→WW寄存器的內(nèi)容和8位立即數(shù)相與,結(jié)果存入WZ

          IORWF F,dF∨W→dW寄存器的內(nèi)容和F寄存器的內(nèi)容相或,結(jié)果存入F(d=1)或W(d=0)中Z

          IORLW KK∨W→WW寄存器的內(nèi)容和8位立即數(shù)相或,結(jié)果存入WZ

          XORWF F,dF⊕W→dW寄存器的內(nèi)容和F寄存器的內(nèi)容相異或,結(jié)果存入F(d=1)或W(d=0)中Z

          XORLW KK⊕W→WW寄存器的內(nèi)容和8位立即數(shù)相異或,結(jié)果存入WZ

          COMF F,dF取反→dF寄存器的內(nèi)容取反后,結(jié)果存入F(d=1)或W(d=0)中Z

          CLRF F0→F,寄存器復(fù)位F寄存器的內(nèi)容被清為全0Z

          CLRW -0→W,寄存器復(fù)位W寄存器的內(nèi)容被清為全0Z

          RLF F,dF帶C循環(huán)左移→d將F寄存器帶C循環(huán)左移,結(jié)果存入F本身(d=1)或W(d=0)。C

          RRF F,dF帶C循環(huán)右移→d將F寄存器帶C循環(huán)右移,結(jié)果存入F本身(d=1)或W(d=0)。C

          BCF F,B將F中第B位清0將寄存器的第B位清為0-

          BSF F,B將F中第B位置1將寄存器的第B位置1-

          程 序 跳 轉(zhuǎn) 類 INCFSZ F,dF+1→d,結(jié)果若為0則跳一步F寄存器的內(nèi)容加1后,結(jié)果存入F本身(d=1)或W(d=0)。如結(jié)果為0則跳過(guò)下一條指令,否則順序執(zhí)行-

          DECFSZ F,dF-1→d,結(jié)果若為0則跳一步F寄存器的內(nèi)容減1后,結(jié)果存入F本身(d=1)或W(d=0)。如結(jié)果為0則跳過(guò)下一條指令,否則順序執(zhí)行-

          BTFSC F,BF中第B位為0,則跳一步測(cè)試F寄存器的第B位。若F(B)=0,則跳過(guò)下一條指令,否則順序執(zhí)行-

          BTFSS F,BF中第B位為1,則跳一步測(cè)試F寄存器的第B位。若F(B)=1,則跳過(guò)下一條指令,否則順序執(zhí)行-

          CALL K調(diào)用子程序首先將PC+1推入堆棧,然后將11位常數(shù)K送入PC(10~0),同時(shí)將PCLATH(4,3)→PC(12,11),從而使PC=子程序入口地址-

          GOTO K 無(wú)條件跳轉(zhuǎn)將11位常數(shù)K送入PC(10~0),同時(shí)將PCLATH(4,3)→PC(12,11),從而使PC=新地址-

          RETURN -從子程序返回將堆棧頂端單元的內(nèi)容彈出并送入PC,從而返回主程序斷點(diǎn)處-

          RETLW KW帶參數(shù)子程序返回將堆棧頂端單元的內(nèi)容彈出并送入PC,同時(shí)8位常數(shù)K→W,從而帶著參數(shù)返回主程序斷點(diǎn)處-

          RETFIE -從中斷服務(wù)子程序返回將堆棧頂端單元的內(nèi)容彈出并送入PC,從而返回主程序斷點(diǎn)處,同時(shí)將全局中斷使能位GIE置1,從新開(kāi)放中斷-

          控 制 類SLEEP -進(jìn)入睡眠方式該指令執(zhí)行后,單片機(jī)進(jìn)入低功耗睡眠模式,時(shí)基電路停振TO,PD

          CLRWDT -0→WDT將WDT寄存器和分配給它的預(yù)分頻器同時(shí)清為全0TO,PD

          NOP -空操作空操作

           



          關(guān)鍵詞: PIC單片機(jī) 指令 功能

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉