PIC12C5XX單片機應用與設計_第1頁
PIC12C5XX單片機應用與設計_第2頁
PIC12C5XX單片機應用與設計_第3頁
PIC12C5XX單片機應用與設計_第4頁
PIC12C5XX單片機應用與設計_第5頁
已閱讀5頁,還剩78頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

僅供參考PIC12C5XX單片機應用與設計前言面向應用的嵌入式系統在我國方興未艾微控制器,也就是單片機〔MCU〕,在80年代進入中國。由于微控制器容易學、容易用,倍受青瞇。這種把中央處理器、存儲器、外設器件及I/O做在同一塊芯片上的器件總是作為應用系統中的控制部件使用。現在,做在微控制器芯片上的外設部件越來越多,功能不斷增強。針對具體的應用,利用微控制器可以設計出十分復雜的系統,這種系統稱作嵌入式系統。在杭州召開的’99全國單片微機學術交流會暨多國單片微機產品展覽會上,許多專家呼吁要提高對嵌入式系統的認識。

目前,在全世界,嵌入式系統帶來的工業年產值已超過1萬億美元。預計在美國,單是使用嵌入式電腦的全數字電視產品每年將產生1500億美元的新市場。美國未來學家尼葛洛龐帝曾預言,四、五年后,嵌入式智能工具將是繼PC和因特網后最偉大的發明。就目前國內微控制器的應用狀況,全國微機單片機學會理事長陳章龍教授說,從整體來講,在中國,微控制器的應用水平還不高,主要是用8位微控制器,用量也不大,絕大多數是用于IC卡設備等儀器儀表和控制領域中。嵌入式系統的核心部件是各種類型的嵌入式處理器,據不完全統計,全世界嵌入式處理器的品種已經過千,流行的結構有30多種,其中以我們熟悉的PIC系列結構的產品為最多。據中國單片機公共實驗室高級工程師呂京建介紹,嵌入式處理器分為兩大類,一類是以通用電腦中的CPU為基礎的嵌入式微控制器,另一類是微控制器。與微處理器相比,微控制器具有單片化、體積小、功耗低、可靠性高、芯片上的個設資源豐富等特點,目前已成為嵌入式系統的主流器件。嵌入式微處理器的軟件是實現嵌入式系統功能的關鍵,為了提高執行速度和系統的可靠性,嵌入式系統中的軟件一般都固化在存儲器芯片或微控制器中。

嵌入式系統是面向應用的,因此它可以應用在現代化工業的各個領域,如:航天、航空、軍事、家用消費商品、儀器儀表、各種控制系統及3C系統。尤其在國內主要應用于家電消費類產品、通信和電腦外設等。而福州高奇電子科技正在對MCU的廣泛應用起著強大的推動作用。高奇電子科技創辦于一九九三年十月,是一家專業的半導體集成電路授權代理商和專業集成電路應用、設計公司。目前代理、銷售多家著名半導體廠商的產品,如單片機、E2PROM、保安器件、電壓檢測器、LCD/VFD驅動器、來電識別〔CallerID〕以及交換機用的Switch、Codec芯片等等;同時,設有專業的研發部門,已經研制了一系列電子產品整機方案,這些方案包括完整的軟硬件設計資料及樣機,可提供應整機廠商直接采用生產。公司的工程部門還可以為客戶量身定做,增加和刪改功能以表達客戶的產品特色。高奇公司堅持“以專業的態度和水準,供優質產品、創名牌服務”的經營理念,將全部資源專注于半導體IC的應用設計、行業市場的專用IC〔ASIC〕設計以及IC市場營銷,并將不斷開拓出電子產品新領域,并縮短研發時間,使產品與下面就介紹一種簡單的PIC單片機系列。時代同步。

下面就介紹一種簡單的PIC單片機系列。第一章

PIC12C5XX功能原理PIC12C5XX是美國Microchip公司推出的8位單片機,也是世界上第一個8腳封裝的8位單片機系列。§1.1

功能特點一、高性能RISC結構CPU

·精簡指令集,僅33條單字節指令,易學易用

·除地址分支跳轉指令為雙周期指令外,其余所有指令皆為單周期指令

·執行速度:DC~1μs

·二級硬件堆棧

·直接、間接、相對三種尋址方式二、功能部件特性

·8位定時器/計數器TIMER0,帶8位預分頻器

·大驅動電流,I/O腳可直接驅動數碼管〔LED〕顯示

-每個I/O引腳最大控電流25mA

-每個I/O引腳最大灌電流20mA

·內置上電復位電路〔POR〕

·復位定時器,保障復位正常

·內部MCLR復位端加上拉電路,無需外接上拉

·內置自振式看門狗,防程序死鎖

·程序保密位,可防止程序代碼的非法拷貝

·低功耗睡眠功能

·I/O引腳可喚醒睡眠

·內置4MHzRC型振蕩源,可省外接振蕩

·可選外接振蕩

-RC:

低成本阻容振蕩

-XT:

標準晶體/陶瓷振蕩

-LP:

低速晶體,低功耗振蕩三、CMOS工藝特性

·低功耗

<2mA

@5V,4MHz

-15μA

@3V,32KHz

-<1μA

低功耗睡眠〔Sleep〕模式下

·全靜態設計

·寬工作電壓范圍:2.5V~5.5V

·寬工作溫度范圍:

商用級:

0℃~+70℃

-工業級:-40℃~+85℃

-汽車級:-40℃~+§1.2

型號及引腳介紹PIC12C5XX目前有二種型號,見下表:型

號振

蕩EPROMRAM定時器輸入線I/O線電壓范圍封裝〔DIP/SOIC〕12C508DC~4Mhz512×1225×81152.5V-5.5V812C509DC~4Mhz1024×1241×81152.5V-5.5V8表1.1

PIC12C5XX型號功能表各型號管腳圖如下:PDIP,SOIC,WindowedCERDIPVDD——>

GP5/OSC1/CLKIN<——>

GP4/OSC2<——>

GP3/MCLR/VPP——><——VSS

<——>GP0

<——>GP1

<——>GP2/T0CK1圖1.1

12C508/509引腳下表描述了各引腳的功能。引腳名引腳序號屬性緩沖類型功能GP07I/OTTL/ST雙向I/O口線,帶可編程弱上拉,并具電平變化喚醒睡眠功能GP16I/OTTL/ST雙向I/O口線,帶可編程弱上拉,并具電平變化喚醒睡眠功能GP2/T0CK15I/OST雙向I/O口線,并可設置為計數器TIMER0的外部信號輸入端GP3/MCLR4ITTL單向輸入口線,也可設置為芯片復位端。當設為復位端MCLR時,低電平有效。

當作為輸入口線時,帶可編程弱上拉及電平變化喚醒睡眠功能GP4/OSC23I/OTTL雙向I/O口線,〔使用片內RC振蕩源時,也可作為晶振輸出端〕GP5/OSC1/CLKIN2I/OTTL/ST雙向I/O口線,〔使用片內RC振蕩源時,也可作為晶振輸入端或外部振蕩輸入端〕VDD1電源—正電源VSS8電源—地注:ST─斯密特觸發器表1.2

PIC12C5XX引腳功能

從上表可看出,PIC12C5XX最多可以有5根I/O口線和1根輸入口線〔GP3〕。§1.3

PIC12C5XX內部結構

PIC12C5XX的總線結構采用的是數據總線〔8位〕和指令總線〔12位〕獨立分開的”哈佛結構”,所以它具有精簡指令集〔RISC〕的特點,速度快,效率高,并且功耗很低。

PIC12C5XX在一個芯片上集成了8位的算術邏輯運算單元〔ALU〕,0.5K~1K的12位程序存儲器,25~41個8位數據寄存器以及8位的計數器,上電復位電路,復位定時器,看門狗等等。圖1.2

PIC12C5XX內部結構§1.4

指令周期和流水作業

PIC12C5XX的指令周期被分頻成4個不重疊的節拍Q1~Q4,程序計數器PC在Q1節拍增1,而指令是在Q4節拍從程序存儲器中取出并置入指令譯碼器,并在下一個指令周期被執行,如下列圖所示:圖1.3

指令周期

指令的執行貫穿Q1~Q4節拍。

如上所述,當CPU在執行一條指令的同時,下一條指令的代碼也同時被取出置入指令譯碼器,準備在下一指令周期執行,這就是PIC的流水作業方式,也是RISC結構單片機的特點,這種特點使單片機的運行速度可以到達很高。除了地址分支跳轉指令的執行周期是2個指令周期外,其余所有指令都是單周期指令,見下列圖:圖1.4

流水作業

§1.5

程序存儲器和堆棧

PIC12C5XX的程序存儲器為12位長,其中PIC12C508為512字節,而PIC12C509為1024字節。復位向量為地址0,因為最后一個字節〔PIC12C508為地址1FFH,PIC12C509為地址3FFH〕存放有片內RC實際振蕩的校正系數,其形式為指令MOVLWXX,用戶不要使用這個字節,所以用戶的程序應從地址000H開始存放,注意這點和PIC16C5X有所不同。

圖1.5

程序存儲器和堆棧PIC12C5XX把程序存儲器以512字節為單位進行分頁管理,這樣PIC12C508有一個頁面程序區,而PIC12C509有2個頁面程序區,由狀態寄存器STATUS中的PA0位〔STATUS<5>〕確定程序區的頁面。這是因為PIC是RISC結構,所有指令都是單字節,在PIC12C5XX中,一條指令中所包含的地址信息只有9位,只能直接尋址一個頁面〔512字節〕;對于12C509,則還要由PA0位來輔助尋址2個頁面〔1024字節〕的程序空間,即程序當需從一個頁面跳轉到另一個頁面時〔CALL、GOTO指令〕,應事先根據要跳轉去的頁面,把PA0位置為相應的值,請參閱狀態寄存器的描述。PIC12C5XX的堆棧有2層,有自己獨立的空間,不占用程序存儲器。注意它只能容納二層子程序嵌套調用。堆棧的長度是12位,和PC長度一致,可以存放子程序調用時的PC值。對堆棧的壓入操作由子程序調用指令CALL完成,出棧操作則由子程序返回指令RETLW完成,請參閱第二章中這二條指令的詳介。§1.6

數據存儲器PIC12C5XX的數據存儲器〔RAM〕由一些寄存器組成,分為特殊寄存器和通用寄存器二種。在PIC單片機中,對任何部件的操作都表現為對某一寄存器的操作,所以編程非常簡單明了。

*:非實際存在的寄存器,參見§1.6.1中詳介。

圖1.6

寄存器結構從上圖可看到,00h~06h為特殊寄存器,其余為通用寄存器。PIC12C508有25個通用寄存器,而PIC12C509則有41個通用寄存器,其中25個在Bank0,另16個在Bank1,關于寄存器的Bank方式,請參閱§1.6.1的FSR寄存器描述。§1.6.1

特殊寄存器

一、INDF〔地址:00h〕──間址寄存器

INDF是一個物理上不存在的寄存器,只是一個邏輯寄存器,用來進行間接尋址,實際的尋址地址為FSR<4:0>的值。例:

MOVLW

10h

MOVWF

FSR

;實際地址10h〔F10寄存器〕→FSR

MOVLW

55h

MOVWF

INDF

;數據55h→F10

INCF

FSR

;FSR增1〔FSR=11h〕

MOVWF

INDF

;數據55h→F11

參閱后面FSR寄存器的描述。二、TMR0〔地址:01h〕──定時器/計數器寄存器二、TMR0〔地址:01h〕──定時器/計數器寄存器

TMR0對應于TIMER0,它是一個8位的定時器/計數器〔在PIC16C5X中稱其為RTCC〕,請參閱§1.8詳介。三、PCL〔地址:02h〕──程序計數器PC<7:0>PIC12C5XX程序計數器PC最多可尋址1K〔1024〕程序區:型

號PC長度尋址空間PC復位值PIC12C50895121FFhPIC12C5091010243FFh單片機一復位,PC值被置為全“1”指向程序區的最后一個字節。前面我們提過,這個地址存放的是芯片出廠時已放入的MOVLWXX指令〔其中XX是片內振蕩校正系數〕,所以單片機復位后會執行這條指令,然后PC馬上翻轉到000h,開始執行用戶的程序代碼。注意,頁面選擇位PA0復位時也被清零,所以這時頁面處于0頁,請參閱有關狀態寄存器STATUS的描述。對于“GOTO”指令,它的指令碼中含有跳轉地址的低9位,即PC<8:0>,對于PIC12C509來說,狀態寄存器的第5位〔STATUS<5>〕還會被置入PC<9>,以選擇程序頁面,從而尋址1K的程序空間。

圖1.7

GOTO指令尋址方式對于“CALL”指令或其他涉及會修改PCL的指令,它們的指令碼中僅包含目的地址的低8位,即PC<7:0>,而PC<8>總是會被硬件自動清零,狀態寄存器第5位〔STATUS<5>〕也會被置入PC<9>以選擇程序頁面〔對于PIC12C509而言〕。見下列圖:

圖1.8

CALL指令或修改PCL的指令尋址方式從上圖可看出,由于執行這些指令硬件總會清PC<8>=0,所以它們的起始地址都必須限于放在每個程序頁面的上半區,即頭上的256個字節空間內〔0h~FFh或200h~2FFh〕。四、STATUS〔地址:03h〕──狀態寄存器STATUS寄存器包含了ALU的算術狀態、芯片復位狀態、程序頁面位等信息。STATUS可以被讀/寫,但是其中的復位狀態位TO、PD不能由軟件設置,它們的狀態如何決定§1.12.7會有詳細描述。圖1.9

狀態寄存器在加法運算時,C是進位位;在減法運算時,C是借位的反。例a:

CLRF

F10

;F10=0

MOVLW

1

;W=1

SUBWF

F10

;F10-W=-1〔FFH〕,C=0〔運算結果為負〕例b:

MOVLW

1

;W=1

MOVWF

F10

;F10=1

CLRW

;W=0

SUBWF

F10

;F10-W=1,C=1〔運算結果為正〕PD和TO兩位可用來判斷芯片復位的原因,GPWUF位也是用來判斷芯片復位類型,請參閱§1.12.7描述。五、FSR〔地址:04h〕──選擇寄存器FSR和INDF寄存器〔地址:00h〕配合完成間接尋址,請參閱前面有關INDF寄存器的描述。FSR寄存器寬度為5位,FSR<4:0>用來間接尋址32個寄存器,FSR<5>則用來選擇寄存器體〔Bank〕,見下列圖:

圖1.10

直接/間接尋址方式

a、PIC12C508:不存在寄存器體選,FSR<5>恒為“1”。

b、PIC12C509:FSR<5>=1

Bank1,

FSR<5>=0

六、OSCCAL〔地址:05h〕──內部振蕩校正系數寄存器PIC12C5XX內部集成有RC振蕩供用戶選擇使用,OSCCAL<7:4>包含了該振蕩電路的校正系數,其上電初始值為“0111”,請參閱§1.11.4七、GPIO〔地址:06h〕──I/O寄存器PIC12C5XX有一個6位的I/O口,它在寄存器中的映像就是GPIO寄存器,GPIO<5:0>對應于I/O口線GP5:GP0,GPIO<7:6>未用,恒為“0”八、TRIS──I/O方向控制寄存器TRIS是GP口線方向控制寄存器,用戶不能直接尋址,必須通過執行“TRIS

6”指令來設置它。當執行“TRIS

6”指令后,W寄存器的內容即會被置入TRIS中。“1”將相應的I/O口線設為輸入態〔高阻態〕,“0例:

MOVLW

0Fh

;W=“00001111”

TRIS

6

;TRIS=“001111”,GP0:GP3為輸入態

GP4:GP5為輸出態各種復位都會置TRIS為全“1”。九、OPTION──參數定義寄存器OPTION用來定義一些芯片工作參數,見下列圖所示:

圖1.11

OPTION寄存器OPTION也是不能由用戶直接尋址的,必須由執行“OPTION”指令來把W寄存器中的內容置入OPTION寄存器,如下例:

MOVLW

7

;W=“00000111”

OPTION

;W→OPTION

各種復位都會置OPTION為全“1注意即使TRIS中相應的GP2方向位是“0”,如果將TOCS置為“1”,則GP2也會被強置為輸入態,即為T0CKI輸入線。有關OPTION各位的定義,請參閱各自相應的章節。十、W──工作寄存器W寄存器用來存放指令中的第二個操作數,或用來進行內部數據傳送,或存放運算結果,是最常用的寄存器。§1.6.2

通用寄存器

PIC12C508:07h─1Fh

;Bank0

PIC12C509:07h─1Fh

;Bank0

30h─3Fh

;Bank1通用寄存器在上電后的值是隨機的,所以它屬RAM性質。§1.7

I/O口PIC12C5XX只有一個I/O口,對應的映像寄存器為GPIO〔地址:06h〕,其中GPIO<5:0>對應GP5:GP0,GPIO<7:6>未用,永為“0”。注意,GP3僅可作為輸入,是單向I/O口線。另外,GP5、GP4、GP3及GP2還可以由用戶定義成各種特殊功能口線,一旦它們被用作特殊用途,則永遠讀為“0”。GP0、GP1和GP3還帶有可編程的弱上拉和“電平變化喚醒功能”〔即喚醒正處于睡眠狀態下的芯片〕,關于這點請參閱OPTION寄存器的描述。如果GP3被用戶定義為復位輸入端〔MCLR〕,則它的弱上拉自動有效,但“電平變化喚醒GPIO口線的方向由TRIS寄存器控制,詳情參見§1.6.1中有關TRIS寄存器的描述。§1.7.1

I/O口結構一根I/O口線的結構如下列圖所示:

圖1.12

I/O口結構除了GP3只能單向作為輸入口外,其余的GPIO口皆可由用戶定義為輸入/輸出態。作為輸入口時沒有鎖存,外部信號必須保持到讓CPU讀入為止〔例如:MOVF

GPIO,W〕。作為輸出則有鎖存,可以保持直到被新的值取代為止。I/O端的輸入/輸出態由TRIS寄存器的值控制,當TRIS將“1”置入I/O控制器時Q1和Q2都處于截止態,所以I/O端即呈高阻態〔輸入態〕。當執行I/O讀指令〔如MOVF

6,W〕,把當前I/O端的狀態讀入數據總線。當TRIS將“0”置入I/O控制器時,Q1和Q2的導通情況將要由數據鎖存器Q端的狀態來決定。當寫入數據為“1”時,Q端為低電平0,則Q1導通,I/O輸出為高電平。反之,當寫入數據為“0”§1.7.2

I/O口使用注意事項1、I/O方向轉置的問題某時候可能需要一個I/O口一會做輸入,一會又做輸出。這就是I/O方向的轉置。在編寫這種I/O轉置程序時必須注意,有些指令如位設置指令〔BSF、BCF〕寫I/O口時是先從I/O讀入其狀態,執行位操作后再將結果寫回去覆蓋原來的內容〔輸出的結果放在I/O口的數據鎖存器〕。舉個例子來說:“BSF

6,5”這條指令的目的是要把B口的第6位置為高電平“1”。執行這條指令時,先把整個B口當前的狀態內容讀入到CPU,把第6位置成“1”2、I/O的“線或”和“線與”從圖1.12看出PICI/O端輸出電路為CMOS互補推挽輸出電路。因此與其他這類電路一樣,當某個PICI/O端設置為輸出狀態時,不能與其他電路的輸出端接成“線或”或“線與”的形式,否則可能引起輸出電流過載,燒壞PIC。如需要與其他電路接成“線或”電路時,PICI/O端必須置于“1”狀態或輸入狀態,并外接下拉電阻。電阻的阻值根據實際電路和PICI/O端最大電流來決定。3、I/O口的連續操作一條寫I/O的指令,對I/O真正寫操作是發生在指令的后半周期〔參照圖1.13〕。而讀I/O的指令卻是在指令的周期開始就讀取I/O端狀態。所以當你連續對一個I/O端寫入再讀出時,必須要讓I/O端上的寫入電平有一個穩定的時間,否則讀入的可能是前一個狀態,而不是最新的狀態值。一般推薦在兩條連續的寫,讀I/O口指令間至少加一條NOP指令。例:

MOVWF

6

;寫I/O

NOP

;穩定I/O電平

MOVF

6,W

;讀I/O4、噪聲環境下的I/O操作在噪聲環境下〔如靜電火花〕,I/O控制寄存器可能因受干擾而變化。比方I/O口可能會從輸入態自己變成輸出態,對于這種情形,WDT也是無法檢測出來的。因此如果你的應用環境是較惡劣的,建議你每隔一定的間隔,都重新定義一下I/O控制寄存器。最保險的方法當然是對I/O讀寫前都定義一下I/O控制寄存器〔但是實踐證明對于大多數的應用都不必做到這樣,只是提請你注意噪聲干擾〕。

圖1.13

I/O口連續讀/寫時序§1.8

定時器/計數器TIMER0TIMER0是一個8位的定時器/計數器,其對應的映像寄存器是TMR0〔地址:01h〕,可由用戶程序直接讀寫,并且可帶有8位的預分頻器。它用于對外加在GP2/T0CKI引腳上的外部信號進行計數〔計數器〕或對內部指令時鐘進行計時〔定時器〕,在PIC16C5X中它被稱為RTCC。TIMER0及其相關電路如圖1.14所示。從圖中可看出TIMER0工作狀態由OPTION寄存器控制,其中OPTION寄存器的T0SC位用來選擇TIMER0的計數信號源,當T0SC為“1”時,信號源為內部時鐘,T0SC為“0”時,信號源為來自T0CKI引腳的外部信號。OPTION寄存器的PSA位控制預分頻器〔Prescaler〕分配對象,當PSA位為“1”,分配給TIMER0,即外部或內部信號經過預分頻器分頻后再輸出給TIMER0。預分頻器的分頻比率由OPTION內的PS0~PS2決定。這時涉及寫TMR0寄存器的指令均同時將預分頻器清零,OPTION寄存器內容保持不變,即分配對象、分頻比率等均不變。OPTION的T0SE位用于選擇外部計數脈沖觸發沿。當T0SE為“1”

圖1.14

TIMER0方塊圖TIMER0計數器采用遞增方式計數,當計數至FFH時,在下一個計數發生后,將自動復零,重新開始計數,從此一直循環下去。TIMER0對其輸入脈沖信號的響應延遲時間為2個機器周期,不管輸入脈沖是內部時鐘、外部信號或是預分頻器的輸出。響應時序見圖1.15。TIMER0對外部信號的采樣周期為2個振蕩周期,因此當不用預分頻器時,外加在T0CKI引腳上的脈沖寬度不得小于2個振蕩周期即1/2指令周期。同時,當使用預分頻器時,預分頻器的輸出脈沖周期不得小于指令周期,因此預分頻器最大輸入頻率可達N,fosc/4,N為預分頻器的分頻比,但不得大于50MHz。

圖1.15a.

TIMER0時序圖:內部時鐘/無預分頻器

圖1.15b.

TIMER0時序圖:內部時鐘/預分頻比1:2應注意的是盡管PIC對外部加于T0CKI信號端上的信號寬度沒有很嚴格的要求,但是如果高電平或低電平的維持時間太短,也有可能使TIMER0檢測不到這個信號。一般要求信號寬度要大于10ns。§1.9

預分頻器預分頻器是一個分頻倍數可編程的8位計數器。其結構如圖1.14所示上節對預分頻參數已有描述,這里不再贅述。預分預器的分配對象完全由程序控制,可以在程序中改變Prescaler分配對象。1、從TIMER0到WDT的改變

MOVLW

B'XX0X0XXX'

;選擇內部時鐘和新的預分頻值

OPTION

;如果新的預分頻值='000'或者

CLRF

1

;='001',則暫時先選一個另外的值

MOVLW

B'XXXX1XXX'

;清零TMR0和預分頻器

OPTION

;選擇WDT為對象,但不要改變預分頻值

CLRWDT

;清WDT和預分頻器

MOVLW

B'XXXX1XXX'

;選擇新的預分頻器

OPTION2、從WDT到TIMER0的改變

CLRWDT

;清WDT及Prescaler

MOVLW

B'XXXX0XXX'

;選擇TIMER0

OPTION

圖1.16

預分頻器方塊圖注意,預分頻器只能分配給TIMER0或WDT其中之一使用,而不能同時分配給二者。§1.10

看門狗WDT看門狗計時器〔WatchDogTimer〕是一個片內自振式的RC振蕩計時器,無需任何的外接元件。這意味著即使芯片振蕩停止了〔例如執行指令SLEEP后〕,WDT照樣保持計時。WDT計時溢出將產生RESET。在PIC12C5XX芯片內有一個特殊的謂之“系統定義字”〔ConfigurationEPROM〕的單元,其中的一個位是用于定義WDT的,可以將其置“0”來抑制WDT使之永遠不起作用。這將在第六章的燒寫器介紹部分詳細說明。1、WDT周期WDT有一個基本的溢出周期18ms〔無預設倍數〕,如果需要更長的WDT周期,可以把預分頻器分配給WDT,最大分頻比可達1:128,這時的WDT溢出周期約為2.5S。WDT溢出周期和環境溫度、VDD等參數有關系,請參閱附錄的圖表。“CLRWDT”和“SLEEP”指令將清除WDT計時器以及預分頻器〔當預分頻器分配給WDT時〕。WDT一般用來防止系統失控或者說防止單片機程序“失控”。在正常情況下,WDT應在計時溢出前被CLRWDT指令清零,以防止產生RESET。如果程序由于某種干擾而失控,那么不能在WDT溢出前執行一條CLRWDT指令,就會使WDT溢出而產生RESET,使系統重新啟動運行而不至失去控制。假設WDT溢出產生RESET,則狀態寄存器F3的“TO”位會被清零,用戶可藉此判斷復位是否由WDT溢時所造成。2、WDT編程注意事項如果使用WDT,一定要仔細在程序中的某些地方放一條“CLRWDT”指令,以保證在WDT在溢出前能被清零,否則會造成芯片不停地產生RESET,使系統無法正常工作。在噪聲工作環境下,OPTION寄存器可能會因受干擾而改變,所以最好每隔一段時間就將其重新設置一下。§1.11

振蕩PIC12C5XX可以運行在以下四種振蕩方式下:

a、LP

低功耗低速晶體振蕩

b、XT

標準晶體/陶瓷振蕩

c、INTRC

內部4MHzRC振蕩

d、EXTRC

外部RC振蕩以上四種振蕩方式可由“系統定義字”中的Fosc1:Fosc2兩位來選擇,請讀者參閱后面§1.12.9的詳述。

§1.11.1

晶體/陶瓷振蕩這種振蕩包括XT和LP,其電路連接是在GP5/OSC1/CLKIN和GP4/OSC2兩端加一晶體/陶瓷振蕩,如下列圖所示:

圖1.17

晶體/陶瓷振蕩電路下表是使用各種頻率的晶體和陶瓷振蕩所需的C1、C2電容值。振蕩類型頻率C1C2

振蕩類型頻率C1C2XT455KHz68-100P68-100PLP32KHz15P15P

2MHz15-33P15-33PXT100KHz15-30P200-300P200KHz15-30P100-200P

4MHz10-22P10-22P

1MHz15-30P15-30P

2MHz15P15P

4MHz15P15P

a.陶瓷振蕩

b.晶體振蕩表1.3

各種振蕩下的C1和C2值§1.11.2

外部RC振蕩這種振蕩類型成本最低,但頻率的精確性較差,適用于時間精確度要求不高的應用場合。RC振蕩的頻率是VDD、RC值以及環境溫度的函數。請參閱附錄的RC頻率函數圖。RC振蕩的連接如圖1.18所示。

圖1.18

RC振蕩電路RC振蕩是在OSC1端連接一個串聯的電阻電容。這個電阻如果低于2.2K,振蕩不穩定,甚至不能振蕩,但是電阻高于1M時,則振蕩又易受干擾。所以電阻值最好取5K~100K之間。盡管電容C為0時,電路也能振蕩,但也易受干擾且不穩定,所以電容值應取20P以上。RC值和頻率關系如表1.4所示。RC振蕩時OSC2端輸出一OSC1的4分頻脈沖〔f=1/4OSC1〕。RestCextVDDFosc/255kΩ0PF5.04.0MHz5kΩ20PF6.02.2MHz5kΩ20PF3.52.5MHz10kΩ130PF5.0480MHz10kΩ290PF5.0245MHz100kΩ300PF3.530MHz表1.4

RC與頻率的關系§1.11.3

外部振蕩PIC12C5XX也可以接受外部振蕩源〔僅適合于XT和LP類型振蕩〕,連接時將外部振蕩接入GP5/OSC1/CLKIN端,見下列圖:

圖1.19

外部振蕩源輸入電路§1.11.4

內部RC振蕩PIC12C5XX內部提供有4MHz的RC振蕩源供用戶選擇使用,選擇振蕩方式和振蕩源的方法見§1.12.9詳介。在PIC12C5XX的程序區最頂端〔12C508:1FFh,12C509:3FFh〕放了一條MOVLWXX的指令,XX是內部RC振蕩的校正系數。芯片上電后,PC指針指向程序區最頂端,執行完這條指令后PC值加1變為000h。這時W寄存器中存放即是內部RC振蕩的校正系數,用戶可以把這個系數置入OSCCAL寄存器〔05h〕以便使其起校正作用,也可以忽略不管它。

例:

0

;定義存儲區地址0

MOVWF

OSCCAL

;把W中的校正系數置入OSCCAL。§1.12

復位〔RESET〕PIC12C5XX有各種各樣原因造成的芯片復位:

1、芯片上電

2.、MCLR端加低電平

3、看門狗WDT超時溢出

4、睡眠中某些I/O口線電平發生變化當芯片處于復位狀態時,所有I/O口線都處于輸入狀態〔高阻態〕,看門狗WDT和預分頻器都被清零。圖1.20

片內復位電路〔暫缺〕§1.12.1

復位定時器〔DRT〕復位定時器DRT〔在PIC16C5X中我們稱其為OST〕是為了使芯片的復位可靠安全而設計。在PIC12C5XX中,對于XT和LP振蕩方式,上電后它們還需要一定的時間來建立穩定的振蕩。有鑒于此,PIC12C5XX內部設計了一個復位定時器DRT。DRT在MCLR端到達高電平〔VIHMC〕后,即啟動計時18ms,這樣可以使芯片保持在復位狀態約18ms以便讓振蕩電路起振及穩定下來,然后芯片即脫離復位狀態進入正常運行狀態。DRT的振蕩源是芯片內專有的RC振蕩電路,所以外圍電路并不能改變其18ms的計時時間。當WDT計時溢出后,DRT也是啟動18ms使芯片保持在復位狀態,然后再重新開始運行程序。注意,在振蕩方式是外部RC或內部RC時,DRT都關閉不起作用。§1.12.2

芯片上電復位〔POR〕PIC12C5XX在芯片內集成有上電復位電路,見圖1.20所示。當芯片電源電壓VDD上升到一定值時〔1.5V-2.1V〕,檢測電路即會發出復位脈沖使芯片復位。§1.12.3

MCLR復位PIC12C5XX的GP3/MCLR端可以由用戶定義為普通輸入口GP3或復位端MCLR,如下列圖:圖1.21

GP3/MCLR端電路〔暫缺〕具體方法參見§1.12.9有關描述。一旦用戶選擇MCLR功能,則該端輸入低電平會使芯片進入復位狀態。§1.12.4

外部復位電路在某種情況下,DRT計時18ms后,芯片的振蕩電路還不能穩定或供電電壓〔VDD〕還不能到達標準值,這時如果芯片脫離復位狀態進入運行,則芯片就有可能失控或運行不正常。為了使芯片脫離復位狀態時各部分都處于正常,可以在MCLR端上加外部RC復位電路來延長復位時間,如下列圖:

圖1.22

外部復位電路

這個電路可以使VDD上升到標準值一段時間后,MCLR才會上升到高電平,從而啟動DRT計時18ms后才進入運行。這樣可以延長整個復位過程,保障芯片復位后進入正常運行。§1.12.5

掉電復位鎖定當單片機的供電電壓掉到最小標準值以下后,可能會使芯片的運行出現異常,從而擾亂整個控制系統,所以在某些應用中,我們希望一旦VDD掉到某個值時使芯片自動進入復位狀態〔所有I/O口都變成高阻態〕以免擾亂系統,下面是一個PIC12C5XX掉電復位鎖定的電路:

圖1.23

掉電復位鎖定

當VDD電壓恢復上升到標準值以上后,MCLR端恢復為高,從而使芯片恢復正常運行。§1.12.6

復位對寄存器的影響對于通用寄存器來說,上電復位后它們的值是隨機不定的,其他類型的復位后則保持原值不變。對于特殊寄存器,各種復位后它們都會等于一個固定的復位值,見以下二表:寄存器地址上電復位值MCLR復位

WDT復位

引腳變化喚起復位W—qqqq

xxxx〔注1〕qqqq

uuuu〔注1〕INDF00hxxxx

xxxxuuuu

uuuuTMR001hxxxx

xxxxuuuu

uuuuPC02h1111

11111111

1111STATUS03h0001

1xxx?00?

?uuu〔注2〕FSR〔12C508〕04h111x

xxxx111u

uuuuFSR〔12C509〕04h110x

xxxx11uu

uuuuOSCCAL05h0111

Uuuu

GPIO06h--xx

xxxx--uu

OPTION—1111

11111111

1111TRIS—--11

1111--11

1111u:未變;

x:隨機值;

-:未用;

?:其值取決于復位方式注1:由于在復位向量處存放著MOVLW

XX指令,其中XX為內部RC振蕩校正系數,所以復位后W<7:4>即會等于這個值。注2:參見表1.6。a.

各特殊寄存器復位后的值

狀態寄存器STATUS程序計數器PC芯片上電復位

0000

1xxx1111

1111運行時MCLR端加低電平復位

000u

uuuu1111

1111睡眠時MCLR端加低電平復位

0001

0uuuu1111

1111

睡眠時看門狗WDT超時復位

0000

0uuu1111

1111

運行時看門狗WDT超時復位

0000

1uuu

1111

1111睡眠時I/O腳電平變化喚醒復位

1001

0uuuu

1111

1111

u:未變;

x:隨機.b.

復位對STATUS和PC的影響

表1.5

各種復位對特殊寄存器的影響§1.12.7

復位的鑒別PIC12C5XX有多種原因都可引起芯片復位。在程序中判斷芯片復位的原因有時是非常必要的,例如上電復位后程序一般都要做一些寄存器初始化工作,而別的復位后則可以不做初始化而直接進入控制運行。在狀態寄存器STATUS有三個位〔GRWUF、TO、PD〕可用來標識各種復位狀態,見下表:

GPWUFTOPD復位原因000睡眠中WDT超時溢出001運行時WDT超時溢出010睡眠中MCLR拉低011芯片上電0uu運行時MCLR拉低110睡眠中GP0,GP1或GP3電平變化u:未變a.

復位后TO、PD及GPWUF的狀態事

件GRWUFTOPD注

芯片上電011

WDT超時溢出

00u不影響PD位執行Sleep指令〔進入睡眠〕u10

執行CLRWDT指令〔清看門狗〕

u11

睡眠中GP0,GP1或GP3電平發生變化110

u:未變b.

影響TO、PD及GPWUF位狀態的事件

表1.6

復位對STATUS的影響

例:要判斷是否芯片上電。

BTFSS

STATUS,TO

;TO=1?

GOTO

NO_POWERUP

BTFSS

STATUS,PD

;PD=1?

GOTO

NO_POWERUP

INIT

;TO=1,PD=1。芯片上電,做初始化。§1.12.8

睡眠模式〔Sleep〕1、進入SLEEP執行一條“SLEEP”指令即可進入低功耗睡眠模式。當進入SLEEP后,WDT被清零,然后重新開始計數。狀態寄存器STATUS中的PD位被置成“0”,TO位置成“1”,同時振蕩停止〔指OSC1端的振蕩電路〕。所有的I/O口保持原來的狀態。這種工作模式功耗最低。為使耗電流最小,進入SLEEP前,應使所有的I/O口處于高電平VDD或低電平VSS,而不應使其處于高阻態,以免產生開關電流損耗。可以在I/O口加上拉或下拉電阻,或者把I/O口都置成輸出態來防止其處于高阻態〔浮態〕。RTCC端亦應置為VDD或VSS〔通過上拉或下拉〕。MCLR必須處于高電平狀態。2、喚醒SLEEPSLEEP可被WDT溢出喚醒,或在MCLR端加低電平喚醒SLEEP或GP0、GP1、GP3電平發生變化。第二種喚醒方法經常用在以下應用場合:在系統主電源掉電,并由后備電源〔電池〕供電后,執行“SLEEP”指令進入低功耗模式,這樣電池就可長時間保持系統數據。當主電源恢復供電時,讓其在MCLR產生一低電平喚醒SLEEP,并重新復位。這樣需在MCLR端加一外部復位電路。第三種方法則在需要使用系統時喚醒睡眠中的單片機,它常通過按鍵輸入來實現。系統上電時,STATUS的PD被置為“1”,而執行“SLEEP”指令后,PD位被置成“0§1.12.9

系統定義字〔Configuration〕在PIC12C5XX中有一個12位長的系統定義字單元,其中只用了前5位〔bit0~bit4〕,用來定義單片機的一些系統性能選擇,如下列圖:

圖1.24系統定義字系統定義字屬特殊的空間,不占用芯片的程序存儲器,不能由程序指針〔用戶程序〕訪問,用戶可以用燒寫器對其進行編程,參見燒寫器章節中的描述。程序保密位被置為“0”后,程序存儲區中的程序代碼〔12位〕中的高8位將被遮沒。具體地說,就是加密后再用燒寫器讀該芯片的程序區時,每一個程序代碼都呈現00X的形式,這樣別人就無法恢復這些被加密的代碼,因此也就無法進行復制拷貝。加密后的單片機的功能不會受任何影響,加密后的程序代碼并不影響其在芯片內的運行,而只是不能再被復原讀出來。§1.12.10ID碼PIC12C5XX芯片中有一個16位的標識碼〔稱為ID碼〕,用來作芯片標識。ID碼僅起芯片識別作用,用戶可在燒寫器上將其燒入和讀出作芯片識別〔如燒入日期等〕,但不會對芯片功能產生任何影響,即不使用它也沒有關系。PIC12C5XX指令集及程序設計技巧§2.1

PIC12C5XX指令概述

PIC12C5XX每條指令長12位,指令由操作碼和操作數組成。PIC12C5XX共有33條指令,按操作分成三大類:

1、面向字節操作類

2、面向位操作類

3、常數操作和控制操作類。全部指令如表2.1所示。面向字節操作類指令〔11-6〕〔5〕〔4-0〕

OPCODEdf〔FILE#〕

二進制代碼

HEX

名稱

助記符,操作數

操作

狀態影響注000000000000000空操作NOP

0000001fffff02fW送到fMOVWFfW→f

無1,4000001000000040W清零CLRW-0→W

Z

0000011fffff06ff清零CLRFf0→f

Z4000010dfffff08ff減去WSUBWFf,df-W→d

C,DC,Z1,2,4000011dfffff0Cff遞減DECFf,df-1→d

Z2,4000100dfffff10fW和f做或運算IORWFf,dW∨f→d

Z2,4000101dfffff14fW和f做與運算ANDWFf,dW∧f→d

Z2,4000110dfffff18fW和f做異或運算XORWFf,dW〇f→d

Z2,4000111dfffff1CfW加fADDWFf,dW+f→d

C,DC,Z1,2,4001000dfffff20f傳送f到dMOVFf,df→d

Z2,4001001dfffff24ff取補COMFf,df→d

Z2,4001010dfffff28ff遞增INCFf,df+1→d

Z2,4001011dfffff2Cff遞減,為0則跳DECFSZf,df-1→d,skipifzeroZ2,4001100dfffff30ff循環右移RRFf,df(n)→d(n-1),f(0)→C,C→d(7)C2,4001101dfffff34ff循環左移RLFf,df(n)→d(n+1),f(7)→C,C→d(0)C2,4001110dfffff38ff半字節交換SWAPFf,df(0.3)←→f(4-7)→d

Z2,4001111dfffff3Cff遞增,為0則跳INCFSZf,df+1→d,skipifzero

Z2,4

面向位操作類指令〔11-8〕〔7-5〕〔4-0〕

OPCODEb〔BIT#〕f〔FILE#〕

二進制代碼

HEX

名稱

助記符,操作數

操作

狀態影響注0100bbbfffff4bf清除f的位bBCF

f,b0→f〔b〕Z2,40101bbbfffff5bf設置f的位bBSF

f,b1→f〔b〕Z2,40110bbbfffff6bf測試f的位b,為0則跳BTFSCf,bTestbit(b)infile(f):SkipifclearZ

0111bbbfffff7bf測試f的位b,為0則跳BTFSSf,bTestbit(b)infile(f):SkipifclearZ

常數操作和控制操作類指令〔11-8〕〔7-0〕

OPCODE

k〔LITERAL〕

二進制代碼

HEX

名稱

助記符,操作數

操作

狀態影響注000000000010002寫OPTION寄存器OPTION-W→OPTIONregister無

000000000011003進入睡眠狀態SLEEP-0→WDT,stoposcillator

TO,PD

000000000100004清除WDT計時器CLRWDT-0→WDT(andprescaler,ifassigned)TO,PD

000000000fff00f設置I/O狀態TRIS

fW→I/Ocontrolregisterf

無31000kkkkkkkk8kk子程序帶參數返回RETLW

kk→W,Stack→PC

1001kkkkkkkk9kk調用子程序CALL

kPC+1→Stack,K→PC無1101kkkkkkkkkAkk跳轉〔K為9位〕GOTO

kk→PC(9bits)

1100kkkkkkkkCkk常數置入WMOVLW

kk→WZ

1101kkkkkkkkDkk常數和W做或運算IORLW

kk∨W→WZ

1110kkkkkkkkEkk常數和W做與運算ANDLW

kk∧W→WZ

1111kkkkkkkkFkk常數和W做異或運算XORLW

kk○W→WZ

表2.1

PIC12C5XX指令集

注:1、除GOTO指令外,任何有關寫PC〔F2〕的指令〔例如CALL、MOVWF

2〕都將會把PC寄存器的第9位清零。

2、假設對I/O口寄存器進行操作,如“SUBWF

6,1”

3、指令“TRIS

6”將W寄存器中的內容寫入GP的I/O口控制寄存器中:“1”關斷對應端口的輸出緩沖器,使其為輸入〔高阻〕狀態,“

4、當預分頻器〔Prescaler〕分配給TIMER0后,任何對TMR0寄存器〔F1〕寫操作的指令都將使預分頻器清零。§2.2

PIC12C5XX指令尋址方式

PIC12C5XX單片機尋址方式根據操作數的來源,可分為寄存器間接尋址、立即數尋址、直接尋址和位尋址四種。一、寄存器間接尋址這種尋址方式通過寄存器F0〔INDF〕、F4〔FSR〕來實現。實際的寄存器地址放在FSR中,通過INDF來進行間接尋址。

例:

FSR

EQU

4

INDF

EQU

0

MOVLW

05H

;W=5

MOVWF

FSR

;W(=5)→F4

MOVLW

55H

;W=55H

MOVWF

INDF

;W(=55H)→F5上面這段程序把55H送入F5寄存器。間址尋址方式主要用于編寫查表、寫表程序,非常方便。請參考§2.7程序設計技巧。二、立即數尋址這種方式就是操作數為立即數,可直接從指令中獲取。

例:

MOVLW

16H

;16H→W三、直接尋址這種方式是對任何一寄存器直接尋址訪問。對PIC12C508,寄存器地址〔5位〕直接包括在指令中,對PIC12C509,寄存器地址中最高1位由FSR〔F4〕寄存器中的bit5決定,即體選位。

例:

MOVWF

8

;W→F8寄存器

MOVF

8,W

;F8→W四、位尋址這種尋址方式是對寄存器中的任一位〔bit〕進行操作。

例:

BSF

11,0

;把F11的第0位置為“1”。§2.3

面向字節操作類指令

這類指令共有18條,包括有數據傳送、算術和邏輯運算、數據移位和交換等操作。它們的操作都是在W數據寄存器f之間進行,其指令碼結構為:〔11—6〕〔5〕〔4—0〕OPCODEdf〔File#〕

高6位是指令操作碼。第6位d是方向位。d=1,則操作結果存入f〔數據寄存器〕,d=0,則操作結果存入W。低5位是數據寄存器地址,可選中32個寄存器。對于PIC12C509,則還要參考寄存器體選擇器FSR的bit5選擇存入哪一個寄存器體〔bank0或bank1〕。

1、寄存器加法指令

格式:

ADDWF

f,d指令碼:000111dfffff

指令周期:

1

操作:

W+f→d

影響狀態位:C,DC,Z

說明:

將f寄存器和w相加,結果存入f〔d=1〕或W〔d=0〕。

例:

ADDWF

8,0

;F8+W→W

─────────────────────────────────

2、寄存器與指令

格式:

ANDWF

f,d指令碼:000101dfffff

指令周期:

1

操作:

W∧f→d

影響狀態位:Z

說明:

將f寄存器和w做邏輯與運算,結果存入f〔d=1〕或W〔d=0〕。

例:

ANDWF

10,0

;F10∧W→W

ANDWF

10,1

;F10∧W→F10

─────────────────────────────────

3、寄存器清零指令

格式:

CLRF

f指令碼:0000011fffff

指令周期:

1

操作:

0→f,1→z

影響狀態位:z

說明:

將f寄存器清零,狀態位Z將被置為1。

例:

CLRF

8

;F8清為零〔0→F8〕

─────────────────────────────────

4、W清零指令

格式:

CLRW指令碼:000001000000

指令周期:

1

操作:

0→W,1→Z

影響狀態位:Z

說明:

將W寄存器清零,狀態位Z將被置為1。

例:

CLRW

;W清為零,Z置為1

─────────────────────────────────

5、寄存器取反指令

格式:

COMF

f,d指令碼:00dfffff

指令周期:

1

操作:

f→d

影響狀態位:Z

說明:

將f寄存器內容做邏輯求反運算,結果存入f〔d=1〕或W〔d=0〕。

例:

COMF

12,0

;F12取反→F12

COMF

12,1

;F12取反→W

─────────────────────────────────

6、寄存器減1指令

格式:

DECF

f,d指令碼:000011dfffff

指令周期:

1

操作:

f-1→d

影響狀態位:

C,DC,Z

說明:

f寄存器內容減1存入f〔d=1〕或W〔d=0〕。

例:

DECF

15,1

;F15-1→F15

DECF

15,0

;F15-1→W

─────────────────────────────────

7、寄存器減1,結果為零則跳指令

格式:

DECFSZ

f,d指令碼:001011dfffff

指令周期:

1或2〔產生跳轉時為2〕

操作:

f-1→d;結果為零則跳(PC+1→PC)

影響狀態位:

說明:

將f寄存器內容減1存入f〔d=1〕或W〔d=0〕。如果結果為0,則跳過

下一條指令不執行。否則順序執行下一條指令。

例:

┌───DECFSZ

10,1

;F10-1→F10,如果F10為0

F10=0

MOVLW

55H

;則跳過MOVLW55H指令

└──→MOVF

12,0

─────────────────────────────────

8、寄存器加1指令

格式:

INCF

f,d指令碼:001010dfffff

指令周期:

1

操作:

f+1→d

影響狀態位:

C,DC,Z

說明:

f寄存器加1,結果存入f〔d=1〕或W〔d=0〕。

例:

INCF

10,0

;F10+1→W

INCF

10,1

;F10+1→F10

─────────────────────────────────

9、寄存器加1,結果為零則跳指令

格式:

INCFSZ

f,d指令碼:001111dfffff

指令周期:

1或2〔產生跳轉時為2〕

操作:

f+1→d,結果為零則跳〔PC+1→PC〕

影響狀態位:

說明:將f寄存器內容加1存入f〔d=1〕或W〔d=0〕,如果結果為零則PC值

加1跳過下一條指令。

例:

L00P

┌─INCFSZ

8,1

;將F8寄存器加1,結果存入F8,

GOTO

LOOP

;加1后結果為零則跳到MOVWFF9指令

F8=0

└→MOVWF

9

─────────────────────────────────

10、寄存器或指令

格式:

IORWF

f,d指令碼:000100dfffff

指令周期:

1

操作:

W∨f→d

影響狀態位:Z

說明:

將f寄存器內容和W內容做邏輯或運算,結果存入f〔d=1〕或W〔d=0〕。

例:

IORWF

18,1

;F18∨W→F18

IORWF

18,0

;F18∨W→W

─────────────────────────────────

11、f寄存器傳送指令

格式:

MOVF

f,d指令碼:001000dfffff

指令周期:

1

操作:

f→d

影響狀態位:

Z

說明:

將f寄存器內容傳送至W〔d=0〕或自己本身f〔d=1〕。如果是傳給

自己,一般是用來影響狀態位Z,即可判斷f是否為零。

例:

MOVF

10,1

;F10→F10

BTFSS

3,2

;判斷F3的第二位,即Z狀態位。如果F10=0,則Z=1。

─────────────────────────────────

12、W寄存器傳送指令

格式:

MOVWF

f指令碼:0000001fffff

指令周期:

1

操作:

W→f

影響狀態位:

說明:

將W內容傳給f寄存器。

例:

MOVWF

6

;W→F6〔B口〕

─────────────────────────────────

13、空操作指令

格式:

NOP指令碼:000000000000

指令周期:

1

操作:

無任何操作

影響狀態位:

說明:

不做任何操作,只有使PC加1。

─────────────────────────────────

14、帶進位位左移指令

格式:

RLF

f,d指令碼:001101dfffff

指令周期:

1

操作:

f(n)→d(n+1),f(7)→c,c→d(0)

影響狀態位:

C

說明:

將f寄存器左移,結果存入f〔d=1〕或W〔d=0〕。f左移時,其最高

位〔bit7〕移入狀態位C〔進位位〕,如下列圖:

進位位

┌──┐

┌──┬──┬──┬──┬──┬──┬──┬──┐

┌─┤C

│←│D7│D6│D5│D4│D3│D2│D1│D0│

←─┐

└──┘

└──┴──┴──┴──┴──┴──┴──┴──┘

└──────────────────────────────────┘

例:

RLF

8,1

;F8左移→F8

RLF

8,0

;F8左移→W

─────────────────────────────────

15、帶進位位右移指令

格式:

RRF

f,d指令碼:001100dfffff

指令周期:

1

操作:

f(n)→d(n-1),f(0)→c,c→d(7)

影響狀態位:

C

說明:

將f寄存器右移,結果存入f〔d=1〕或W〔d=0〕。f右移時,其最低

位〔bito〕移入狀態位C,而原來的狀態位C移入f最高位〔bit7〕,

如下列圖:

┌────────────────────────────┐

│進位位

┌─┐

┌──┬─┬──┬─┬──┬─┬──┬─┐│

└─→│C│→│D7│D6│D5│D4│D3│D2│D1│D0│─┘

└─┘

└──┴─┴──┴─┴──┴─┴──┴─┘

例:

RRF

8,1

;F8右移→F8

RRF

8,0

;F8右移→W

─────────────────────────────────

16、寄存器減法指令

格式:

SUBWF

f,d指令碼:000010dfffff

指令周期:

1

操作:

f-w→d

影響狀態位:

C,DC,2

說明:

將f寄存器內容減去W內容,結果存入f〔d=1〕或W〔d=0〕。

例:

CLRF

20

;F20=0

MOVLW

1

;W=1

SUBWF

20,1

;F20-W=0-1=-1→F20

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論