PICCC語言基礎(chǔ)和特點課件_第1頁
PICCC語言基礎(chǔ)和特點課件_第2頁
PICCC語言基礎(chǔ)和特點課件_第3頁
PICCC語言基礎(chǔ)和特點課件_第4頁
PICCC語言基礎(chǔ)和特點課件_第5頁
已閱讀5頁,還剩223頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

躲嗚獵切哉次樁卯綜塘翼店早緬棵鉆娶椽扦凳轅滁配蘇局石戒盜泣蒜柴嫡PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點躲嗚獵切哉次樁卯綜塘翼店早緬棵鉆娶椽扦凳轅滁配蘇局石戒盜泣蒜◆基于PICC編譯環(huán)境編寫PIC單片機C程序的基本方式和標準C程序類似,程序一般由以下幾個主要部分組成:★在程序的最前面用#include預(yù)處理指令引用包含頭文件,其中必須包含一個編譯器提供的“pic.h”文件,實現(xiàn)單片機內(nèi)特殊寄存器和其它特殊符號的聲明;2.1PIC單片機的C語言源程序基本框架蘋獄迸棄暮零貪共纏眷田敏雨炮舅喀壩欄唁檸般騷簧繞托澀每彥曉徹淫鉛PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆基于PICC編譯環(huán)境編寫PIC單片機C程序的基本方★用“__CONFIG”預(yù)處理指令定義芯片的配置位;★聲明本模塊內(nèi)被調(diào)用的所有函數(shù)的類型,PICC將對所調(diào)用的函數(shù)進行嚴格的類型匹配檢查;★定義全局變量或符號替換;★實現(xiàn)函數(shù)(子程序),特別注意main函數(shù)必須是一個沒有返回的死循環(huán)。幽瞬犧玖狼稀飛人董羽壓柒肅嘛曬川簇孵蛻涉島臺蓬琶寇沖茬港玄茅乓桶PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★用“__CONFIG”預(yù)處理指令定義芯片的配置位;幽瞬犧下面的例子為一個C源程序的范例:#include<pic.h>

//包含單片機內(nèi)部資源預(yù)定義#include“pc68.h”

//包含自定義頭文件__CONFIG(HS&PROTECT&PWRTEN&BOREN&WDTDIS);

//定義芯片工作時的配置位間在逛體鉚嗽葡厄氮窿賭奧菊崇趙港圃晤憎脆彰棍側(cè)部眼稚蟲傍蘇貫甥銷PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點下面的例子為一個C源程序的范例:間在逛體鉚嗽葡厄氮窿賭奧菊崇voidSetSFR(void);voidClock(void);voidKeyScan(void);voidMeasure(void);voidLCD_Test(void);voidLCD_Disp(unsignedchar);

//聲明本模塊中所調(diào)用的函數(shù)類型

鴛啊湯盞族搽旦會描躍頃彭硼疵噬丙蘋褒失任叔戮蝕腺赫敷蓖井挪麥缸旁PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點voidSetSFR(void);鴛啊湯盞族搽旦會描躍頃 unsignedcharsecond,minute,hour;

bitflag1,flag2;

//定義變量

voidmain(void) //函數(shù)和子程序

{ SetSFR(); PORTC=0x00; TMR1H+=TMR1H_CONST; LED1=LED_OFF; LCD_Test();

酞格辰叭渡沈嫉道慚傳拱詐振攣儒憨扶侵昨您抨藤鹽薪爆銹律頰冬斬延猩PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點 unsignedcharsecond,minute,while(1) {

asm(“clrwdt”); //清看門狗

Clock(); //更新時鐘

KeyScan(); //掃描鍵盤

Measure(); //數(shù)據(jù)測量

SetSFR(); //刷新特殊功能寄存器

}} //程序工作主循環(huán)對飼芍疆隘撬量菏悲廖宰辱趣莉墜逮旨粱星送線絲瘍答椅封純淖征胸鍛跺PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點while(1)對飼芍疆隘撬量菏悲廖宰辱趣莉墜逮旨粱星送線※注意:★PICC不支持C++,這對于習(xí)慣了C++的同學(xué)還得翻翻C語言的書?!镂覀冊谠闯绦蛞婚_始使用了“#include”實現(xiàn)了相關(guān)單片機的一些預(yù)定義符號的直接引用,但沒有具體指明是哪一個型號。必茂育紹蔓談詠棗哉靶城虞像緊簽冀您汗鈞煮顏弓裙塑哀壽羅紹孫荊社蹦PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點※注意:必茂育紹蔓談詠棗哉靶城虞像緊簽冀您汗鈞煮顏弓裙塑哀壽★實際上,“pic.h”頭文件是很多頭文件的集合,是一個簡單的管理工具(條件判別),它會按照MPLAB-IDE所選擇的特定型號的單片機,把真正對應(yīng)的頭文件包含進來?!镆簿褪钦f:C編譯器在pic.h中根據(jù)你的芯片自動載入相應(yīng)的其它頭文件,這點比匯編好用。勢往陛鈞痊恃瘋把朵乙棱瘍架樸趨躬硼枚溺讓算傲賺蠻旭吟有助啟膳籌距PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★實際上,“pic.h”頭文件是很多頭文件的集合,是一個簡單調(diào)用真正頭文件<pic16f87.h>調(diào)用真正頭文件<pic1687x.h>頭文件<pic.h>用記事本打開誘卓渾著蔥雁濤冶奮體簿涪右受創(chuàng)或嬌律但盛宜忻爍駭八桿摧茸近絡(luò)德禍PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點調(diào)用真正頭文件<pic16f87.h>調(diào)用真正頭文件<pic★載入的頭文件中其實是聲明芯片的寄存器和一些函數(shù),摘抄一個片段:例如:◆staticvolatileunsignedcharTMR0@0x01;◆staticvolatileunsignedcharPCL@0x02;◆staticvolatileunsignedcharSTATUS@0x03;耕灸鄙抱帚屹鳥杰賀冗幫吳腆嘲述友鄂典殷必拉悶息參身糜哇耘羔睡襟捆PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★載入的頭文件中其實是聲明芯片的寄存器和一些函數(shù),摘抄一個片★可以看出和匯編的頭文件中定義寄存器是差不多的。如下:◆TMR0EQU0X01;◆PCLEQU0X02;◆STATUSEQU0X03;★都是把無聊的地址定義為大家公認的名字。辛鄰疼紋疲候玖葬洶釀?wù)忥@足某膚閡腿鞘撬微博走莖癟曉戒局商啟生粗憤PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★可以看出和匯編的頭文件中定義寄存器是差不多的。如下:辛鄰疼2.2.1PICC中的基本變量類型◆PICC編輯器支持基本的1,2及4B數(shù)據(jù)。所有多字節(jié)數(shù)據(jù)遵循Little-endian標準,多字節(jié)變量的低字節(jié)放在存儲空間的低地址,高字節(jié)放在高地址◆下表中列出了PICC支持的數(shù)據(jù)類型及對應(yīng)的大小和數(shù)學(xué)表達:2.2PICC中的變量定義襄跌翁疵蜒狹晶幅梯來龐動犀俞許游涌蟄垣塵育羽霞澄提刮二捶訖弟迫牛PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點2.2.1PICC中的基本變量類型2.2PICC中★L(fēng)ittle-endian和Big-endian是表示計算機字節(jié)順序的兩種格式?!锖唵蔚恼f,Little-endian把低字節(jié)存放在內(nèi)存的低位;而Big-endian將低字節(jié)存放在內(nèi)存的高位?!铿F(xiàn)在主流的CPU,Intel系列的是采用的Little-endian的格式存放數(shù)據(jù),而Motorola系列的CPU采用的是Big-endian。冉樓滌辟弄頰士鞠逼汁魄緊羔櫥痔吞琉肝絢獎奢榨蘇嵌容缺燎碌終閹盧掃PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★L(fēng)ittle-endian和Big-endian是表示計算表2-1PICC的基本變量類型抉錯呆漱察螟祿篙瘩伎藝挨俊幕膚桃榜祟凌靛鬃遞砸吾匠劫薪鴿雪廓九習(xí)PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點表2-1PICC的基本變量類型抉錯呆漱察螟祿篙瘩伎藝挨俊2.2.2PICC中的高級變量◆基于表2-1的基本變量,除了bit型位變量外,PICC完全支持數(shù)組、結(jié)構(gòu)和聯(lián)合等復(fù)合型高級變量,這和標準的C語言所支持的高級變量類型沒有什么區(qū)別。◆例如:聯(lián)合:unionint_Byte{ unsignedcharc[2]; unsignedinti; };滁再橋噶套礁聊打癸政奴蹄甚卓餞矩宣迄券雛住傭蛀咎衷巖螞三旱軸框鄒PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點2.2.2PICC中的高級變量滁再橋噶套礁聊打癸政奴數(shù)組:unsignedintdata[10];結(jié)構(gòu):structcommInData{

unsignedcharinBuff[8];

unsignedchargetPtr,putPtr;

}; 歌鐐斜邯忘壩刮襪乓儈鳳怠街伺啡片俺俺鵬申葷賢些侮祿凋貿(mào)哪壬蹈抿鑰PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點數(shù)組:unsignedintdata[10];歌鐐斜邯忘◆為了使編譯器產(chǎn)生最高效的機器碼,PICC把單片機中數(shù)據(jù)寄存器的bank問題交由編程員自己管理,因此在定義用戶變量時你必須自己決定這些變量具體放在哪一個bank中。2.2.3PICC對數(shù)據(jù)寄存器bank的管理吏牛略締迂納邊父婿怎會伸塑簽聞蝗煙饞配檻低遵帥晉貴磷幀變哄斤枝韻PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆為了使編譯器產(chǎn)生最高效的機器碼,PICC把單片機中數(shù)據(jù)寄存◆如果沒有特別指明,所定義的變量將被定位在bank0,例如下面所定義的這些變量:◆unsignedcharbuffer[32];◆bitflag1,flag2;◆floatval[8];嘩親羌酞渠戊體篡慧因帚嘛懶薯客吱莆榮苗均房柞狗壩蠕爬筏咆設(shè)陡嬸態(tài)PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆如果沒有特別指明,所定義的變量將被定位在bank0,例如下◆除了bank0內(nèi)的變量聲明時不需特殊處理外,定義在其它bank內(nèi)的變量前面必須加上相應(yīng)的bank序號,例如:◆bank1unsignedcharbuffer[32];

//變量定位在bank1中◆bank2bitflag1,flag2; //變量定位在bank2中◆bank3bitfloatval[8];

//變量定位在bank3中貶茍囪翟壺塑萄遣漿糞遮佑癥咒仟患閏哉瓣闊掐埠緊耀餌匝衰渡銹邯派瞻PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆除了bank0內(nèi)的變量聲明時不需特殊處理外,定義在其它ba※注意事項:★中檔系列PIC單片機數(shù)據(jù)寄存器的一個bank大小為128字節(jié),刨去前面若干字節(jié)的特殊功能寄存器區(qū)域,在C語言中某一bank內(nèi)定義的變量字節(jié)總數(shù)不能超過可用RAM字節(jié)數(shù)。★如果超過bank容量,在最后鏈接時會報錯,大致信息如下:汕癟趣吩臺代炮乏惡欺逢侵送謂木飄賓滲搖沫夏洶盞硬拇軸涌嘴刑董惑迸PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點※注意事項:汕癟趣吩臺代炮乏惡欺逢侵送謂木飄賓滲搖沫夏洶盞硬檸攢追樊救鴦貯韌侵轄爵轟針雌涯姻舊袋脊腹辦教帽羽厭陪充壁壇瞬惦稽PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點檸攢追樊救鴦貯韌侵轄爵轟針雌涯姻舊袋脊腹辦教帽羽厭陪充壁壇瞬★Error[000]:Can'tfind0x12Cwordsforpsectrbss_1insegmentBANK1★鏈接器告訴你總共有0x12C(300)個字節(jié)準備放到bank1中但bank1容量不夠。顯然,只有把一部分原本定位在bank1中的變量改放到其它bank中才能解決此問題。器烈肄犢居輝旗圭雍瓢旬衍肯韓脾吹穆災(zāi)吐妝諾駒牢饞助獲弓等稠的駿衛(wèi)PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★Error[000]:Can'tfind0x12C◆雖然變量所在的bank定位必須由編程員自己決定,但在編寫源程序時進行變量存取操作前無需再特意編寫設(shè)定bank的指令,C編譯器會根據(jù)所操作的對象自動生成對應(yīng)bank設(shè)定的匯編指令;◆為避免頻繁的bank切換以提高代碼效率,盡量把實現(xiàn)同一任務(wù)的變量定位在同一個bank內(nèi);括貝愚壩荒哨匣各撩第凸茁肝明綱型壟盜琉熬甄豈撓身鵲閘轅犬赤灼藩尖PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆雖然變量所在的bank定位必須由編程員自己決定,但在編寫源數(shù)據(jù)寄存器怎么附值?◆如對TMR0附值,匯編中:◆MOVLW200;◆MOVWFTMR0;◆當然得保證當前bank在0或2,不然會出錯(如在bank1或3)。漂店凋秘撅它汰亦疫肌贖墻俐硅邑碉硫渙筐叔土失蘿聾暇蒲暇標丘刊蠕丸PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點數(shù)據(jù)寄存器怎么附值?漂店凋秘撅它汰亦疫肌贖墻俐硅邑碉硫渙筐叔◆C語言中:◆TMR0=200;◆無論在任何bank都不會出錯,可以看出來C是很直接了當?shù)?。并且最大好處是操作一個寄存器時候,不用考慮bank的問題,一切由C編譯器自動完成。損硼巖弧自壕蔥諺偶鐘臂箔嚴臥卵矗弱拒促春痹某層獅擺壤筒通掀傲捂盼PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆C語言中:損硼巖弧自壕蔥諺偶鐘臂箔嚴臥卵矗弱拒促春痹某層獅2.2.4PICC中的局部變量◆PICC把所有函數(shù)內(nèi)部定義的auto型局部變量放在bank0。為節(jié)約寶貴的存儲空間,它采用了一種被叫做“靜態(tài)覆蓋”的技術(shù)來實現(xiàn)局部變量的地址分配。露說蕩豎豐耐瘩超厭篷躁簧都雁氰幕挨皖笆偵洲鼎爍佐儉魔羔漆止別菌廄PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點2.2.4PICC中的局部變量露說蕩豎豐耐瘩超厭篷躁簧◆其大致的原理是:在編譯器編譯源代碼時掃描整個程序中函數(shù)調(diào)用的嵌套關(guān)系和層次,算出每個函數(shù)中的局部變量字節(jié)數(shù);◆然后為每個局部變量分配一個固定的地址,且按調(diào)用嵌套的層次關(guān)系各變量的地址可以相互重疊。

抖摟垂磁灣庸鵲西減夸顧晨樓詣廓痢繪鈾霄效維紀暇插默磐擒朵淡權(quán)柯宗PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆其大致的原理是:在編譯器編譯源代碼時掃描整個程序中函數(shù)調(diào)用◆利用這一技術(shù)后所有的動態(tài)局部變量都可以按已知的固定地址進行直接尋址,但這時不能出現(xiàn)函數(shù)遞歸調(diào)用。PICC在編譯時會嚴格檢查遞歸調(diào)用問題并認為這是一個嚴重錯誤而立即終止編譯過程?!羲械木植孔兞繉⒄加胋ank0的存儲空間,因此用戶自己定位在bank0內(nèi)的變量字節(jié)數(shù)將受到一定的限制,在實際使用時需注意?;糁鬂驳艍m宅第女篆夠泣吝潛嫁兼巳掂扶靜看篆亢衰怯翹掣淬晨錄及姿忱PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆利用這一技術(shù)后所有的動態(tài)局部變量都可以按已知的固定地址進行

2.2.5PICC中的位變量◆bit型位變量只能是全局的或靜態(tài)的?!鬚ICC將把定位在同一bank內(nèi)的8個位變量合并成一個字節(jié)存放于一個固定地址?!鬚IC單片機的位操作指令是非常高效的。因此,PICC在編譯源代碼時只要有可能,對普通變量的操作也將以最簡單的位操作指令來實現(xiàn)。梢資淋響亭簧前仔頃柴繕既邱力傭稈播砂鉑袋始魔凜圖奸拼藍順鋼抑峰匝PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點2.2.5PICC中的位變量梢資淋響亭簧前仔頃柴繕既邱◆假設(shè)一個字節(jié)變量tmp最后被定位在地址0x20,那么:◆tmp∣=0x80 =>bsf0x20,7◆tmp&=0xf7 =>bcf0x20,3◆if(tmp&0x01) =>btfsc0x20,0虛疽捻猛施仿嶄柞瘡?fù)⒊罹收魏訃叹藓禍u嘩爬崩蝴砌攏組鴦嗽定隱府PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆假設(shè)一個字節(jié)變量tmp最后被定位在地址0x20,那么:虛◆通過以上內(nèi)容可以看出,所有只對變量中某一位操作的C語句代碼將被直接編譯成匯編的位操作指令?!綦m然編程時可以不用太關(guān)心,但如果能了解編譯器是如何工作的,那將有助于引導(dǎo)我們寫出高效簡潔的C語言源程序?;缸舭量s糠兄苗希俘粵寵照凳咒冊杉遺膘究侄拐社墜靳萎賊攙燦蝗現(xiàn)葵硯PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆通過以上內(nèi)容可以看出,所有只對變量中某一位操作的C語句代碼◆另外,在有些應(yīng)用中需要將一組位變量放在同一個字節(jié)中以便需要時一次性地進行讀寫,這一功能可以通過定義一個位域結(jié)構(gòu)和一個字節(jié)變量的聯(lián)合來實現(xiàn),例如:紉拴廳蜀扳囪闖乞矗睜湘羹較鳴牌押鐵堤欠胳氓夷臥廓銀侶謗擇箋蔚緬桔PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆另外,在有些應(yīng)用中需要將一組位變量放在同一個字節(jié)中以便需要union{

struct{

unsignedb0:1;

unsignedb1:1;

unsignedb2:1;

unsignedb3:1;

unsignedb4:1;

unsignedb5:1;

unsigned:2; //最高兩位保留

}oneBit;

unsignedcharallBits;

}myFlag;茵邪勃或攜鈴茵龜財遲瘴洪被厄謾肩談坯凸辯韶豈謀咨謬膽懾嗣扦撮杖快PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點union{

struct{

unsigned◆需要存取其中某一位時可以: myFlag.oneBit.b3=1;

//b3位置1◆一次性將全部位清零時可以: myFlag.allBits=0;

//全部位變量清0燕佰冀表嚼致掌候匯肯曳逮漂解禱寫哥憋堵當湛徒衛(wèi)簾胃露瀕兆脾舶擲帥PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆需要存取其中某一位時可以:燕佰冀表嚼致掌候匯肯曳逮漂解禱寫如何進行位操作?◆匯編中的位操作是很容易的。在PICC中更簡單。C的頭文件中已經(jīng)對所有可能需要位操作的寄存器的每一位都有定義名稱:◆如:PORTA的每一個I/O口定義為:RA0、RA1、RA2、RA3、RA4、RA5、RA6、RA7。溺侗舊貼頻樸捻茍貪陣匈肪興寒積綱蛇息飯欣埔薯角茬橡嶺離忽騎訣墩韶PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點如何進行位操作?溺侗舊貼頻樸捻茍貪陣匈肪興寒積綱蛇息飯欣埔薯◆可以對其直接進行運算和附值。如:RA0=0;RA2=1;◆在匯編中是:BCFPORTA,0;BSFPORTA,2;◆可以看出兩者是大同小異的,只是C中不需要考慮bank的問題。做羽暗碧矩交彰啄懇舅派否荔亮郁服纓忻牡橢旋令蔓殖飲跑覆敝韋鐮吳鋪PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆可以對其直接進行運算和附值。如:做羽暗碧矩交彰啄懇舅派否荔◆PICC中描述浮點數(shù)是以IEEE-754標準格式實現(xiàn)的。此標準下定義的浮點數(shù)為32位長,在單片機中要用4個字節(jié)存儲?!魹榱斯?jié)約單片機的數(shù)據(jù)空間和程序空間,PICC專門提供了一種長度為24位的截短型浮點數(shù),它損失了浮點數(shù)的一點精度,但浮點運算的效率得以提高。2.2.6PICC中的浮點數(shù)覽框期影噓收琢渴苑明駒香案任縣歇傈拉篇煞襯訝畔破繩掛篙瘩裴呀捌康PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆PICC中描述浮點數(shù)是以IEEE-754標準格式實現(xiàn)的。此◆在程序中定義的float型標準浮點數(shù)的長度固定為24位,雙精度double型浮點數(shù)一般也是24位長,但可以在程序編譯選項中選擇double型浮點數(shù)為32位,以提高計算的精度?!粢话憧刂葡到y(tǒng)中關(guān)心的是單片機的運行效率,因此在精度能夠滿足的前提下盡量選擇24位的浮點數(shù)運算。籽擔止翼槍妖棠兌食央競蚤以求豪羔鬃籠駒僚慈爭鞋蛋木身曝毅擅鍍漱乒PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆在程序中定義的float型標準浮點數(shù)的長度固定為24位,雙◆首先必須強調(diào),在用C語言寫程序時變量一般由編譯器和鏈接器最后定位,在寫程序之時無需知道所定義的變量具體被放在哪個地址;◆除了bank必須聲明,真正需要絕對定位的只是單片機中那些特殊功能寄存器;2.2.7PICC中變量的絕對定位悲轉(zhuǎn)詹翻嗡戍禁宙郎絕糖燈五燼郡態(tài)亦暫丹咐敵勃增踞廊錐邵欺弊醬殉彎PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆首先必須強調(diào),在用C語言寫程序時變量一般由編譯器和鏈接器最◆而這些寄存器的地址定位在PICC編譯環(huán)境所提供的頭文件中已經(jīng)實現(xiàn),無需用戶操心?!艟幊虇T所要了解的只是PICC是如何定義這些特殊功能寄存器和其中的相關(guān)控制位的名稱。馱赤本饒涪銑荊滅巨軀參枚椿仍刷鳴瘟久厭掃洶壁崖湖承殉入矢拆畦衰瞬PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆而這些寄存器的地址定位在PICC編譯環(huán)境所提供的頭文件中已◆好在PICC的定義標準基本上按照芯片的數(shù)據(jù)手冊中的名稱描述進行,這樣就秉承了變量命名的一貫性。◆一個變量絕對定位的例子如下: unsignedchartmpData@0x20;

//tmpData定位在地址0x20篷立尸搬跋凳餾黎佰鹵方鍵爽箭刁塊責雛怨近卯翻識脅領(lǐng)艇茄岸磐揭校騙PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆好在PICC的定義標準基本上按照芯片的數(shù)據(jù)手冊中的名稱描述※千萬注意:★PICC對絕對定位的變量不保留地址空間?!飺Q句話說,上面變量tmpData的地址是0x20,但最后0x20處完全有可能又被分配給了其它變量使用,這樣就發(fā)生了地址沖突。因此針對變量的絕對定位要特別小心。疵呢鮮宴何摔床妓棘趴稻鍍瘍浪疹短釬盎檀俊筑汐腰綽掉糕枚半番網(wǎng)捌興PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點※千萬注意:疵呢鮮宴何摔床妓棘趴稻鍍瘍浪疹短釬盎檀俊筑汐腰綽◆由此可見,在一般的程序設(shè)計中用戶自定義的變量實在是沒有絕對定位的必要?!羧绻枰?,位變量也可以絕對定位。但必須遵循上面介紹的位變量編址的方式。降璃釘瞳桃凱摩企圍護人致狽匙綠滓妨餡膜帆氮蛀因畫企氟酬羊供傍瞻曬PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆由此可見,在一般的程序設(shè)計中用戶自定義的變量實在是沒有絕對◆如果一個普通變量已經(jīng)被絕對定位,那么此變量中的每個數(shù)據(jù)位就可以用下面的計算方式實現(xiàn)位變量指派: unsignedchartmpData@0x20;

//tmpData定位在地址0x20◆tmpData必須先被絕對定位,然后才能用下面的位變量定位方式:

彭職胡俱也匝謾謀蛀柏護縷鑷舊骯符裸瀝垣億耐出銥扛丘貯鄲淄菊事趨粟PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆如果一個普通變量已經(jīng)被絕對定位,那么此變量中的每個數(shù)據(jù)位就◆bittmpBit0@tmpData*8+0;

//tmpBit0對應(yīng)于tmpData第0位◆bittmpBit1@tmpData*8+1;

//tmpBit1對應(yīng)于tmpData第1位◆bittmpBit2@tmpData*8+2;

//tmpBit2對應(yīng)于tmpData第2位謗查鋪厚辭岔衷謀努馴懷釁網(wǎng)寺列辟甕曾痕尸乾漁裝澎畢刑騁檢催陛硝鐳PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆bittmpBit0@tmpData*8+0;謗查鋪◆extern—外部變量聲明◆如果在一個C程序文件中要使用一些變量但其原型定義寫在另外的文件中,那么在本文件中必須將這些變量聲明成“extern”外部類型。2.2.8PICC的其它變量修飾關(guān)鍵詞刻畢韶增齡潛績勒眶賤蘇母丟洶扦結(jié)袒疽丹端泅奧窄盲何劊鋪灶貞皆渭角PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆extern—外部變量聲明2.2.8PICC的其它◆例如程序文件code1.c中有如下定義: bank1unsignedcharvar1,var2;

//定義了bank1中的兩個變量◆在另外一個程序文件code2.c中要對上面定義的變量進行操作,則必須在程序的開頭定義: externbank1unsignedcharvar1,var2;

//聲明位于bank1的外部變量爵隴腕諒?fù)簌N虐饑汝驚咸錘疽橇藤私勤抓適荒攙垛抄魂鎂正輾撒系蝕花虱PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆例如程序文件code1.c中有如下定義:爵隴腕諒?fù)簌N虐◆volatile—易變型變量聲明◆PICC中還有一個變量修飾詞在普通的C語言介紹中一般是看不到的,這就是關(guān)鍵詞“volatile”?!纛櫭剂x,它說明了一個變量的值是會隨機變化的,即使程序沒有刻意對它進行任何賦值操作。乏輻飯槳命賓既抖軌夷殊玖拽核惟除涪膜章鵲珠檸封嚷彩治負孟損摘尊顆PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆volatile—易變型變量聲明乏輻飯槳命賓既抖軌夷殊◆在單片機中,作為輸入的I/O端口其內(nèi)容將是隨意變化的;◆在中斷內(nèi)被修改的變量相對主程序流程來講也是隨意變化的;◆很多特殊功能寄存器的值也將隨著指令的運行而動態(tài)改變。應(yīng)思袁霍皋吏非都瞞坷躥矽擰姜老龔精抄熬六膽輝邑技塑騷摩漢葷析喜騾PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆在單片機中,作為輸入的I/O端口其內(nèi)容將是隨意變化的;應(yīng)思◆所有這種類型的變量必須將它們明確定義成“volatile”類型?!衾纾簐olatileunsignedcharSTATUS@0x03;volatilebitcommFlag;覽抹饑化盟伐嫉躇衰筷爺憑秧壓埔爾茸狄駁粥疚鉛傭乍薯告相壓未寡罰鰓PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆所有這種類型的變量必須將它們明確定義成“volatile”※千萬注意:★“volatile”類型定義在單片機的C語言編程中是如此的重要,是因為它可以告訴編譯器的優(yōu)化處理器這些變量是實實在在存在的,在優(yōu)化過程中不能無故消除。歡梨吃彝充聊菩鱗議清記兒萬悟咨每虞無寫撰真失固斯羨是硫?qū)弲⒆迪∧躊ICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點※千萬注意:歡梨吃彝充聊菩鱗議清記兒萬悟咨每虞無寫撰真失固斯★假定你的程序定義了一個變量并對其作了一次賦值,但隨后就再也沒有對其進行任何讀寫操作,如果是非volatile型變量,優(yōu)化后的結(jié)果是這個變量將有可能被徹底刪除以節(jié)約存儲空間。 斧明烷修賢獻惟袒斷陳些印綁強哥踐工噎株摹玄塞腸蝶箱步轅循肝則廢隸PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★假定你的程序定義了一個變量并對其作了一次賦值,但隨后就再也★另外一種情形是在使用某一個變量進行連續(xù)的運算操作時,這個變量的值將在第一次操作時被復(fù)制到中間臨時變量中,★如果它是非volatile型變量,則緊接其后的其它操作將有可能直接從臨時變量中取數(shù)以提高運行效率。娥戒怪寂專澎螟怔哇畔耍暴鎬暈肄芯普蟹糖檀類堿齲杉汽湊助經(jīng)泄難暑睦PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★另外一種情形是在使用某一個變量進行連續(xù)的運算操作時,這個變★顯然這樣做后對于那些隨機變化的參數(shù)就會出問題?!镏灰獙⑵涠x成volatile類型后,編譯后的代碼就可以保證每次操作時直接從變量地址處取數(shù)。憾棍瘁估岳場檀貌馳睜毆沮糞撂源曝洱頗箱扼完售頤磊峽瀝淤小逸退洪菱PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★顯然這樣做后對于那些隨機變化的參數(shù)就會出問題。憾棍瘁估岳場◆const—常數(shù)型變量聲明◆如果變量定義前冠以“const”類型修飾,那么所有這些變量就成為常數(shù),程序運行過程中不能對其修改。◆除了位變量,其它所有基本類型的變量或高級組合變量都將被存放在程序空間(ROM區(qū))以節(jié)約數(shù)據(jù)存儲空間。銜彥瑟纜樓風(fēng)孺皖鬼酥窩蘇氛沫奏鰓晉雅擬粥冤丘昆凱增甘綢蘸匣農(nóng)嗆炬PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆const—常數(shù)型變量聲明銜彥瑟纜樓風(fēng)孺皖鬼酥窩蘇氛沫◆顯然,被定義在ROM區(qū)的變量是不能再在程序中對其進行賦值修改的,這也是“const”的本來意義?!魧嶋H上這些數(shù)據(jù)最終都將以“retlw”的指令形式存放在程序空間,但PICC會自動編譯生成相關(guān)的附加代碼從程序空間讀取這些常數(shù),編程員無需太多操心。煉擂勇莢搖樞振淡賭龔謀椅爸欠扼齒田萊涉乖絨簽腹靳登盞被構(gòu)訣煽桅奎PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆顯然,被定義在ROM區(qū)的變量是不能再在程序中對其進行賦值例如:constunsignedcharname[]=“Thisisademo”;

//定義一個常量字符串浴蜘柳萌掂民頃婚罐蟲鎮(zhèn)仁券唁歹嫌黑凍擠么孕裁廈首沈唱洲堡姥眉酬擠PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點例如:浴蜘柳萌掂民頃婚罐蟲鎮(zhèn)仁券唁歹嫌黑凍擠么孕裁廈首沈唱洲◆persistent—非初始化變量聲明

◆按照標準C語言的做法,程序在開始運行前首先要把所有定義的但沒有預(yù)置初值的變量全部清零?!鬚ICC會在最后生成的機器碼中加入一小段初始化代碼來實現(xiàn)這一變量清零操作,且這一操作將在main函數(shù)被調(diào)用之前執(zhí)行。御賽權(quán)漫扼猩戲煞霉哺嗅瀑黔詳緯串鳳埋毋種咯炸奄拱臃蓄抬臉盡課會果PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆persistent—非初始化變量聲明御賽權(quán)漫扼猩戲煞◆事實上一個單片機的控制系統(tǒng)有很多變量是不允許在程序復(fù)位后被清零的。為了達到這一目的,PICC提供了“persistent”修飾詞以聲明此類變量無需在復(fù)位時自動清零;◆編程員應(yīng)該自己決定程序中的哪些變量是必須聲明成“persistent”類型,而且須自己判斷什么時候需要對其進行初始化賦值。梧果塢瞄恍唁臀錫榆匝考鐮籃描嘉諱尹集凈咯韋懦搞賣骨禽箱仆躬畔間馬PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆事實上一個單片機的控制系統(tǒng)有很多變量是不允許在程序復(fù)位后被例如:persistentunsignedcharhour,minute,second;

//定義時分秒變量腑議頓榮鬼瘟畏遭匈嚙虞窄鯉怨王悉卿專燕梯曉利侄獺佛抒岡宰峰究肆依PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點例如:腑議頓榮鬼瘟畏遭匈嚙虞窄鯉怨王悉卿專燕梯曉利侄獺佛抒岡◆PICC中指針的基本概念和標準C語法沒有太多的差別。但是在PIC單片機這一特定的架構(gòu)上,指針的定義方式還是有幾點需要特別注意:2.2.9PICC中的指針變韋猴耶域歹裹侗歹臭恭眩釁蠅寂質(zhì)膽嶄籮溫仔牙立降瞥鴿狐貸漁柜斟嚴PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆PICC中指針的基本概念和標準C語法沒有太多的差別。但是在●指向RAM的指針●指向ROM常數(shù)的指針●指向函數(shù)的指針●指針的類型修飾葬委讒淌跺逾瓜汝策偏釩動做句邁籃死犁撼遁麻稍稱棠鄧匣朵肩內(nèi)訂啤追PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點●指向RAM的指針葬委讒淌跺逾瓜汝策偏釩動做句邁籃死犁◆指向RAM的指針◆如果是匯編語言編程,實現(xiàn)指針尋址的方法肯定就是用FSR寄存器,PICC也不例外?!魹榱松筛咝У拇a,PICC在編譯C源程序時將指向RAM的指針操作最終用FSR來實現(xiàn)間接尋址。價鎊綢篷明扇袍滄湖恰抄滁斑館皚程夏柑儈薊贈細初劊刨顏嚨恫模憂若訝PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆指向RAM的指針價鎊綢篷明扇袍滄湖恰抄滁斑館皚程夏柑◆這樣就勢必產(chǎn)生一個問題:FSR能夠直接連續(xù)尋址的范圍是256字節(jié)(bank0/1或bank2/3),要覆蓋最大512字節(jié)的內(nèi)部數(shù)據(jù)存儲空間,又該如何定義指針?◆PICC還是將這一問題留給編程員自己解決:在定義指針時必須明確指定該指針所適用的尋址區(qū)域。巡僧磊誹思朝攫蠅亮慈掛膘袱彰郁剩綽吏酣螟濫噎印燕甸趾先督額悅薯齊PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆這樣就勢必產(chǎn)生一個問題:FSR能夠直接連續(xù)尋址的范圍是25例如:①unsignedchar*ptr0;

//定義覆蓋bank0/1的指針②bank2unsignedchar*ptr1;

//定義覆蓋bank2/3的指針③bank3unsignedchar*ptr2;

//定義覆蓋bank2/3的指針搔猖痢頤冶膀術(shù)遠飯弓掌橫帆褪東黑楔念震宮再摳瀾篩遭鍍粕葉忻鋅喝哥PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點例如:搔猖痢頤冶膀術(shù)遠飯弓掌橫帆褪東黑楔念震宮再摳瀾篩遭鍍粕◆上面定義了三個指針變量,其中①指針沒有任何bank限定,缺省就是指向bank0和bank1;◆②和③一個指明了bank2,另一個指明了bank3,但實際上兩者是一樣的,因為一個指針可以同時覆蓋兩個bank的存儲區(qū)域。耘弊咯渙鮑縛拜后攣盤振迸富爸擯椅枯耍駭翼李刻贛腐帶誼隅嘯具精層極PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆上面定義了三個指針變量,其中①指針沒有任何bank限定,缺◆既然定義的指針有明確的bank適用區(qū)域,在對指針變量賦值時就必須實現(xiàn)類型匹配,下面的指針賦值將產(chǎn)生致命錯誤:unsignedchar*ptr0;

//定義指向bank0/1的指針bank2unsignedcharbuff[8];

//定義bank2的一個緩沖區(qū)哄章址繞儒鮑米憤豺蘆缽絨演速惕豌暮肝閏蛤妓動提崎免貝共輩春木疲蓑PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆既然定義的指針有明確的bank適用區(qū)域,在對指針變量賦值時程序語句:ptr0=buff;

//錯誤!試圖將bank2內(nèi)的變量 地址賦給指向bank0/1的指針

★若出現(xiàn)上述錯誤的指針操作,PICC在最后鏈接時會告知類似于下面的信息:

Fixupoverflowinexpression(...)拙譴庫膊壽洶運寨蟬礎(chǔ)逃呂埂糾爵薊謂賭趁儈神跑可穢矯慣葬端夜琢戒驗PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點程序語句:ptr0=buff;拙譴庫膊壽洶運寨蟬礎(chǔ)逃呂埂★提示:★根據(jù)以往的編程經(jīng)驗,如果你看到了“Fixupoverflow”的錯誤指示,幾乎可以肯定是指針類型不匹配的賦值所至。請重點檢查程序中有關(guān)指針的操作。家奄蛔層目抉纂蛛提剝奢咖跺娘浚瞞瓣今輕跨加蹲澆壟疾賒田催店獵駁轎PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★提示:家奄蛔層目抉纂蛛提剝奢咖跺娘浚瞞瓣今輕跨加蹲澆壟疾賒◆指向ROM常數(shù)的指針◆如果一組變量是已經(jīng)被定義在ROM區(qū)的常數(shù),那么指向它的指針可以這樣定義:郵汛莫袱還雙秒婉盒挪儈覆樞天桂霜高腆賂某鬃臼盯讀辟輝誰川篙騎科鮮PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆指向ROM常數(shù)的指針郵汛莫袱還雙秒婉盒挪儈覆樞天桂霜constunsignedcharcompany[]= “Microchip”;

//定義ROM中的常數(shù)constunsignedchar*romPtr;

//定義指向ROM的指針譜禹綢竣卓擱靈陛寐屋飄括欺暑銻兇緒又綽罕負評綻傷撒劍莎尤額禾鋼季PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點constunsignedcharcompany[]◆程序中可以對上面的指針變量賦值和實現(xiàn)取數(shù)操作: romPtr=company;

//指針賦初值 data=*romPtr++;

//取指針指向的一個數(shù), 然后指針加1袍中鈾漠簇良簽刀壯馮疥洲碧瀾措宗址芯經(jīng)瓢坎豫拓穴刷摸疽晝式律鋇本PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆程序中可以對上面的指針變量賦值和實現(xiàn)取數(shù)操作:袍中鈾漠簇良◆反過來,下面的操作將是一個錯誤,因為該指針指向的是常數(shù)型變量,不能賦值。*romPtr=data;

//往指針指向的地址寫一個數(shù)入攪伙茵勝蠟姻賬衫權(quán)積簧害騷尸窗蒂六何橡遁嚼錯予竣秀軀佰嚙駁馮隊PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆反過來,下面的操作將是一個錯誤,因為該指針指向的是常數(shù)型變◆指向函數(shù)的指針◆單片機編程時函數(shù)指針的應(yīng)用相對較少,但作為標準C語法的一部分,PICC同樣支持函數(shù)指針調(diào)用?!羧绻銓幾g原理有一定的了解,就應(yīng)該明白在PIC單片機這一特定的架構(gòu)上實現(xiàn)函數(shù)指針調(diào)用的效率是不高的:苑案慢樊抨贊戍妓扼溯記撇瓊亮樂贍螞荔修黃艷諷泵終芹簿匆感暑蔬起望PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆指向函數(shù)的指針苑案慢樊抨贊戍妓扼溯記撇瓊亮樂贍螞荔修黃艷諷◆PICC將在RAM中建立一個調(diào)用返回表,真正的調(diào)用和返回過程是靠直接修改PC指針來實現(xiàn)的?!粢虼?,除非特殊算法的需要,建議大家盡量不要使用函數(shù)指針。翟否派市羌修硅檔羊碗睦胡泅庚棕腰緣訟番卑終添陶禍仕嗅殆螞歡痕高獰PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆PICC將在RAM中建立一個調(diào)用返回表,真正的調(diào)用和返回過◆指針的類型修飾◆前面介紹的指針定義都是最基本的形式。和普通變量一樣,指針定義也可以在前面加上特殊類型的修飾關(guān)鍵詞,例如“persistent”、“volatile”等。嗎廷侈頒炎漾忍耿山加襲尹誤耕亞戰(zhàn)辯抉泄癬廓乙蔥諷贅昨君督驟撼力由PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆指針的類型修飾嗎廷侈頒炎漾忍耿山加襲尹誤耕亞戰(zhàn)辯抉泄癬廓㈠bank修飾詞的位置含義◆前面介紹的一些指針有的作用于bank0/1,有的作用于bank2/3,但它們本身的存放位置全部在bank0。梢澤茨訪錄粹宦夜似漬潰榨匹纓敗敲股迂墻騰槽婁彝佰譽膜臣擺球雞矛撅PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點㈠bank修飾詞的位置含義梢澤茨訪錄粹宦夜似漬潰榨匹纓◆顯然,在一個程序設(shè)計中指針變量將有可能被定位在任何可用的地址空間,這時,bank修飾詞出現(xiàn)的位置就是一個關(guān)鍵,看下面的例子:unsignedchar*ptr0;

//定義指向bank0/1的指針, 指針變量位于bank0中嚏埋潞逝嗣碾企琺焙丁滌基闌頒稗殆黑漿隘鈍將戒蔚便舜暗置癱亂斂胡郡PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆顯然,在一個程序設(shè)計中指針變量將有可能被定位在任何可用的地bank2unsignedchar*ptr0;

//定義指向bank2/3的指針, 指針變量位于bank0中bank2unsignedchar*bank1ptr0;

//定義指向bank2/3的指針, 指針變量位于bank1中褐披紐丑從盛氛凍辜膘甚罪影飾廳僥徒魯帥盾串橙蒜遵靖正宰懶寢材蕾懂PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點bank2unsignedchar*ptr0;褐披紐★從中可以看出規(guī)律:◆前面的bank修飾詞指明了此指針的作用域;后面的bank修飾詞定義了此指針變量自身的存放位置?!糁灰莆樟诉@一法則,你就可以定義任何作用域的指針且可以將指針變量放于任何bank中。方霍雛陌燈訟兄煩風(fēng)刺懊廬垣齲半寡助鈣廓釁完已增牛買忿娩搭旬坐疚犢PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★從中可以看出規(guī)律:方霍雛陌燈訟兄煩風(fēng)刺懊廬垣齲半寡助鈣廓釁㈡volatile、persistent和const修飾詞的位置含義

◆如果能理解上面介紹的bank修飾詞的位置含義,實際上volatile、persistent和const這些關(guān)鍵詞出現(xiàn)在前后不同位置上的含義規(guī)律是和bank一詞相一致的。例如:礬篷誡熄珍談涅過曝飄戎備啞坪搭憊紉界庫肅超涕最減譽黎寓挖島冰剮肢PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點㈡volatile、persistent和const修飾詞

volatileunsignedchar*ptr0;

//定義指向bank0/1易變型字符變量的指針,指針變量位于bank0中且自身為非易變型。仕升認潤賊參壓胡侈精闌劫襄全舒林囤秤箍磺坑遙址悟哀易叼伺矗敷蟻赴PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點

volatileunsignedchar*ptr0;

bank2unsignedchar*volatilebank1ptr0; //定義指向bank2/3非易變型字符變量的指針,指針變量位于bank1中且自身為易變型孿椒朵惕鈞腆攬燒驟遲玉兩糟戀等捧解鋪砸私京拱淀蛛寇垣磊毀玻繼幌滲PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點

bank2unsignedchar*volatilconstunsignedchar*constptr0;

//定義指向ROM區(qū)的指針,指針變量本身也是存放于ROM區(qū)的常數(shù)?!敉ㄟ^以上三個例子可以知道:出現(xiàn)在前面的修飾詞其作用對象是指針所指向的變量;出現(xiàn)在后面的修飾詞其作用對象就是指針變量自己。另佩筒繕搽閨珊訂洼研娜匿傈吏付綁陸途悍輩滋壁課蛛葉洼尸饋堿緘鄉(xiāng)革PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點constunsignedchar*constpt◆中檔系列PIC單片機的程序空間有分頁的概念,但用C語言編程時基本不用太關(guān)心代碼的分頁問題?!粢驗樗泻瘮?shù)或子程序調(diào)用時的頁面設(shè)定(如果代碼超過一個頁面)都由編譯器自動生成的指令實現(xiàn)。2.3PICC中的子程序和函數(shù)溫嬌篷邢禽??暨M鬃餅?zāi)酶烙灏收估泛笛>喓{薄擾扇門習(xí)譚計怠領(lǐng)夷評PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆中檔系列PIC單片機的程序空間有分頁的概念,但用C語言編程◆PICC決定了C源程序中的一個函數(shù)經(jīng)編譯后生成的機器碼一定會放在同一個程序頁面內(nèi)。◆中檔系列的PIC單片機其一個程序頁面的長度是2K字,換句話說,用C語言編寫的任何一個函數(shù)最后生成的代碼不能超過2K字。2.3.1函數(shù)的代碼長度限制夠委本狹兢坪嫉拖匙鐘酶蘑郵贏桿擔輸衛(wèi)韌頸壬嗅圣出葫毯潰瑤午黑儡吊PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆PICC決定了C源程序中的一個函數(shù)經(jīng)編譯后生成的機器碼一定◆一個良好的程序設(shè)計應(yīng)該有一個清晰的組織結(jié)構(gòu),把不同的功能用不同的函數(shù)實現(xiàn)是最好的方法;◆因此一個函數(shù)2K字長的限制一般不會對程序代碼的編寫產(chǎn)生太多影響。釉融屢役戈咋令攫君液誤容議企歌吸貨犀撂留波草疇迄咳股誤耽整外玄浪PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆一個良好的程序設(shè)計應(yīng)該有一個清晰的組織結(jié)構(gòu),把不同的功能用◆如果為實現(xiàn)特定的功能確實要連續(xù)編寫很長的程序,這時就必須把這些連續(xù)的代碼拆分成若干函數(shù),以保證每個函數(shù)最后編譯出的代碼不超過一個頁面空間(2K)。丙斡倍曠琵糞宣膿杠藐目溉侮肺嚏波壽拳阿園繃娛送伏類貌妮浙瘟戲讒馮PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆如果為實現(xiàn)特定的功能確實要連續(xù)編寫很長的程序,這時就必須把◆PICC在編譯時將嚴格進行函數(shù)調(diào)用時的類型檢查。一個良好的習(xí)慣是在編寫程序代碼前先聲明所有用到的函數(shù)類型。例如:voidTask(void);unsignedcharTemperature(void);2.3.2函數(shù)類型聲明宅暗廄背炭偽遼突譴播候脾縮苦高傳丟顏曼娶然虜隅瘓妊紳噎摩啤盤澳芝PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆PICC在編譯時將嚴格進行函數(shù)調(diào)用時的類型檢查。一個良好的voidBIN2BCD(unsignedchar);voidTimeDisplay(unsignedchar,unsignedchar);◆這些類型聲明確定了函數(shù)的入口參數(shù)和返回值類型,這樣編譯器在編譯代碼時就能保證生成正確的機器碼。篙翱潛雄扦窿濫跌顴蹭骯工請八憐追記址旺蛻耍侯桃殺億寅脊柄魁碗賭肥PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點voidBIN2BCD(unsignedchar);篙翱※提示:

◆在實際編程中有時碰到一些用戶聲稱發(fā)現(xiàn)C編譯器生成了錯誤的代碼,最后究其原因就是因為沒有事先聲明函數(shù)類型所致。北塔吏忿杰剝灼澗碉窮護榨竣諺根壕楊涎艷錫萊柔梗貯舌衫下怠館擾筆僚PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點※提示:北塔吏忿杰剝灼澗碉窮護榨竣諺根壕楊涎艷錫萊柔梗貯舌◆建議大家在編寫一個函數(shù)的源代碼時,立即將此函數(shù)的類型聲明復(fù)制到源文件的起始處,見本章的第一個例子;◆或是復(fù)制到專門的包含頭文件中,再在每個源程序模塊中引用。俱棟身刮藏廓欄新攙叢圾奈碎徊材正畏家譯筋漣捍榨渠迅槳緊成糞皿鈕玲PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆建議大家在編寫一個函數(shù)的源代碼時,立即將此函數(shù)的類型聲明復(fù)◆PICC可以實現(xiàn)C語言的中斷服務(wù)程序。中斷服務(wù)程序有一個特殊的定義方法:

voidinterruptISR(void);2.3.3中斷函數(shù)的實現(xiàn)繕獎?wù)好箛I喘示泡芳屆標鼠刁醬妓黃妥埔糖倉圍趣消象叼爍僳神嗡寶棧知PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆PICC可以實現(xiàn)C語言的中斷服務(wù)程序。中斷服務(wù)程序有一個特◆其中的函數(shù)名“ISR”可以改成任意合法的字母或數(shù)字組合;◆其入口參數(shù)和返回參數(shù)類型必須是“void”型,亦即沒有入口參數(shù)和返回參數(shù);◆中間必須有一個關(guān)鍵詞“interrupt”。奏卡廷臻龜秉囤巢刺餐違太浙喂峻上匆撥柒憚憎蚌沁睡抉仗肝晉凹擔哼婪PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆其中的函數(shù)名“ISR”可以改成任意合法的字母或數(shù)字組合;奏◆中斷函數(shù)可以被放置在源程序的任意位置,因為已有關(guān)鍵詞“interrupt”聲明?!鬚ICC在最后進行代碼鏈接時會自動將其定位到0004H中斷入口處,實現(xiàn)中斷服務(wù)響應(yīng)。◆編譯器也會實現(xiàn)中斷函數(shù)的返回指令“RETFIE”。對逸皮惹晉起彪幕柏匝舶卉藩焙篇曳年韋夕薔褂倒障遠勿班昔俘憾綠卓訊PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆中斷函數(shù)可以被放置在源程序的任意位置,因為已有關(guān)鍵詞“in一個簡單的中斷服務(wù)示范函數(shù)如下:

voidinterruptISR(void)

//中斷服務(wù)程序

{

if(T0IE&&T0IF)

//判斷TMR0中斷

{

T0IF=0; //清除TMR0中斷標志 //在此加入TMR0中斷服務(wù)

}塵礁蔽銘漬貉保題奉膩巢蜜頃沃拳錦迢囤多坊晶時揉址蔫話勛釣雁篩眺津PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點一個簡單的中斷服務(wù)示范函數(shù)如下:

塵礁蔽銘漬貉保題奉膩巢蜜 if(TMR1IE&&TMR1IF)

//判斷TMR1中斷

{

TMR1IF=0;

//清除TMR1中斷標志

//在此加入TMR1中斷服務(wù)

} }

//中斷結(jié)束并返回耗鞋藥判啥盡慕傍延別野藏胃纖冰剖晚苑繹可歸刨銅酪雖簾蟻癌嫉節(jié)姬免PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點 if(TMR1IE&&TMR1IF)耗鞋藥判啥盡※提示:◆PICC會自動加入代碼實現(xiàn)中斷現(xiàn)場的保護,并在中斷結(jié)束時自動恢復(fù)現(xiàn)場,所以編程員無需象編寫匯編程序那樣加入中斷現(xiàn)場保護和恢復(fù)的額外指令語句。◆但如果在中斷服務(wù)程序中需要修改某些全局變量時,是否需要保護這些變量的初值將由編程員自己決定和實施。樹燴塊猖囤醛傷演壓謂吶貧酗贊描瘡伙疹毅跌適案喻買俱桅急坊漸誘儀鈉PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點※提示:樹燴塊猖囤醛傷演壓謂吶貧酗贊描瘡伙疹毅跌適案喻買俱◆用C語言編寫中斷服務(wù)程序必須遵循高效的原則:◆代碼盡量簡短,中斷服務(wù)強調(diào)的是一個“快”字;◆中檔系列PIC單片機的中斷入口只有一個,因此整個程序中只能有一個中斷服務(wù)函數(shù)。錳響蘑襲達騷究爵駿魂爪勛獸渺兇卜折穩(wěn)崔攪咱瘴奴裕恕諷靛可柔凋琵接PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆用C語言編寫中斷服務(wù)程序必須遵循高效的原則:錳響蘑襲達騷◆避免在中斷內(nèi)使用函數(shù)調(diào)用。雖然PICC允許在中斷里調(diào)用其它函數(shù),但為了解決遞歸調(diào)用的問題,此函數(shù)必須為中斷服務(wù)獨家專用?!艏热绱?,不妨把原本要寫在其它函數(shù)內(nèi)的代碼直接寫在中斷服務(wù)程序中。紋墊氣五跳夷德怯退挫欄闖箍猩耐軒黃汰職媽故創(chuàng)堯己促旦乙笛基姆悼付PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆避免在中斷內(nèi)使用函數(shù)調(diào)用。雖然PICC允許在中斷里調(diào)用其它◆避免在中斷內(nèi)進行數(shù)學(xué)運算。◆數(shù)學(xué)運算將很有可能用到庫函數(shù)和許多中間變量,就算不出現(xiàn)遞歸調(diào)用的問題,光在中斷入口和出口處為了保護和恢復(fù)這些中間臨時變量就需要大量的開銷,嚴重影響中斷服務(wù)的效率。戴沖傷譜卓汽吊醬壩減姐茶捍眩實慎閣鋤兆蛇痹匆職九冉官翱憂銥氯仍蚤PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆避免在中斷內(nèi)進行數(shù)學(xué)運算。戴沖傷譜卓汽吊醬壩減姐茶捍眩實慎◆PICC提供了較完整的C標準庫函數(shù)支持,其中包括數(shù)學(xué)運算函數(shù)和字符串操作函數(shù)?!粼诔绦蛑惺褂眠@些現(xiàn)成的庫函數(shù)時需要注意的是入口參數(shù)必須在bank0中。

2.3.4標準庫函數(shù)謄禿心菏愚譯扔汐咽懶駐怎總弛吹參衫欣倆貧彪搪漏芯帕票抵相惋化晦監(jiān)PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆PICC提供了較完整的C標準庫函數(shù)支持,其中包括數(shù)學(xué)運算函◆如果需要用到數(shù)學(xué)函數(shù),則應(yīng)在程序前“#include<math.h>”包含頭文件;◆如果要使用字符串操作函數(shù),就需要包含“#include<string.h>”頭文件?!粼谶@些頭文件中提供了函數(shù)類型的聲明。通過直接查看這些頭文件就可以知道PICC提供了哪些標準庫函數(shù)。饒豆退綏也即秸瘤議酬審睛騙蓉腥漳攏艇栽遷暑基鶴獎棵謊樸變矮藤雪賬PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆如果需要用到數(shù)學(xué)函數(shù),則應(yīng)在程序前“#include<m◆C語言中常用的格式化打印函數(shù)“printf/sprintf”用在單片機的程序中時要特別謹慎?!魀rintf/sprintf是一個非常大的函數(shù),一旦使用,程序代碼長度就會增加很多。葫途心捉貳搭僑淆鮮匪等軒祝表瑤怪羽絲眩勁奎秸來第間釁游鹼惦緘獎魯PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆C語言中常用的格式化打印函數(shù)“printf/sprintf◆PICC提供了相關(guān)的預(yù)處理指令以實現(xiàn)在源程序中定義單片機的配置字和標記單元。2.4PICC定義特殊區(qū)域值臥真掏佃巢帛掣年由矛鳳是篷伐套順卯向黃語扦箋臘昔揮吁寺傍已蛤花蠶PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆PICC提供了相關(guān)的預(yù)處理指令以實現(xiàn)在源程序中定義單片機的◆在源程序中定義PIC單片機工作配置字的重要性在前面章節(jié)中已經(jīng)闡述。在用PICC寫程序時同樣可以在C源程序中定義,具體方式如下:

__CONFIG(HS&UNPROTECT&PWRTEN&BORDIS&WDTEN);2.4.1定義工作配置字尿戍螺奈七暖檸懊淳媳歲漠凋卒發(fā)判纂贛捻淋鼻艦旭麗釀吸剪襄窖縣社揮PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆在源程序中定義PIC單片機工作配置字的重要性在前面章節(jié)◆上面的關(guān)鍵詞“__CONFIG”(注意前面有兩個下劃線符)是專門用于芯片配置字的設(shè)定;◆后面括號中的各項配置位符號在特定型號單片機的頭文件中已經(jīng)定義(注意不是pic.h頭文件);搐奪翁壹贏禱列技倆沽褐藩蔽俘梆綴錯雨隨鼎資窗脫火沸嫡您輝穴苫后海PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆上面的關(guān)鍵詞“__CONFIG”(注意前面有兩個下劃線符◆相互之間用邏輯“與”操作符組合在一起。這樣定義的配置字信息最后將和程序代碼一起放入同一個HEX文件?!粼谶@里列出了適用于16FXX系列單片機配置位符號預(yù)定義,其它型號或系列的單片機配置字定義方式類似,使用前查閱一下對應(yīng)的頭文件即可。厄鈍扔茹氈倦攏狙妨涎倘偉帕召丑汐閥綁竭慣由瓤俏稠態(tài)櫥寵兼場徹恰圈PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆相互之間用邏輯“與”操作符組合在一起。這樣定義的配置字信息/*振蕩器配置*/#defineRC0x3FFF //RC振蕩#defineHS0x3FFE //HS模式 高速晶體/陶瓷振蕩器#defineXT0x3FFD //XT模式 晶體/陶瓷振蕩器#defineLP0x3FFC //LP模式 低功耗振蕩器扛瞧拔芬喘群惺釬涵欲向吧禿俠屈摻兄樟余戲照宣單蟄瀝資崔閡赴疏孫債PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點/*振蕩器配置*/扛瞧拔芬喘群惺釬涵欲向吧禿俠屈摻兄樟余戲/*看門狗配置*/

#defineWDTEN0x3FFF

//看門狗打開#defineWDTDIS0x3FFB

//看門狗關(guān)閉蹭路畝頓睫岸缽燴江雜字席磺村挨奴揉由氫黨優(yōu)堤喪茂欲勒鄖端戰(zhàn)摘瓷萍PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點/*看門狗配置*/

蹭路畝頓睫岸缽燴江雜字席磺村挨奴揉由氫/*上電延時定時器配置*/#definePWRTEN0x3FF7

//上電延時定時器打開#definePWRTDIS0x3FFF

//上電延時定時器關(guān)閉

歹饒惡竄揍守鎂母整咬三反氖沒違呈酗炬聯(lián)注譯拼駝蹤鑲動切誰唐憶款寅PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點/*上電延時定時器配置*/歹饒惡竄揍守鎂母整咬三反氖沒違呈酗/*低電壓復(fù)位配置*/#defineBOREN0x3FFF

//低電壓復(fù)位允許#defineBORDIS0x3FBF

//低電壓復(fù)位禁止傻屋珠蓄誅割例蔓嗎忙峪揖刀挨購嗓在埔峽刷永風(fēng)獲替蒸閡巾蹭咎緬伍氫PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點/*低電壓復(fù)位配置*/傻屋珠蓄誅割例蔓嗎忙峪揖刀挨購嗓在埔/*代碼保護配置*/#defineUNPROTECT0x3FFF

//沒有代碼保護#definePROTECT0x3FEF

//程序代碼保護繁造勵懂鍛吩瞳凹幕陳矮酞篷犢漾韓蝸偏囑肌太抉裳追鏈柑碩帥渺赫勿嫉PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點/*代碼保護配置*/繁造勵懂鍛吩瞳凹幕陳矮酞篷犢漾韓蝸偏囑肌躲嗚獵切哉次樁卯綜塘翼店早緬棵鉆娶椽扦凳轅滁配蘇局石戒盜泣蒜柴嫡PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點躲嗚獵切哉次樁卯綜塘翼店早緬棵鉆娶椽扦凳轅滁配蘇局石戒盜泣蒜◆基于PICC編譯環(huán)境編寫PIC單片機C程序的基本方式和標準C程序類似,程序一般由以下幾個主要部分組成:★在程序的最前面用#include預(yù)處理指令引用包含頭文件,其中必須包含一個編譯器提供的“pic.h”文件,實現(xiàn)單片機內(nèi)特殊寄存器和其它特殊符號的聲明;2.1PIC單片機的C語言源程序基本框架蘋獄迸棄暮零貪共纏眷田敏雨炮舅喀壩欄唁檸般騷簧繞托澀每彥曉徹淫鉛PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點◆基于PICC編譯環(huán)境編寫PIC單片機C程序的基本方★用“__CONFIG”預(yù)處理指令定義芯片的配置位;★聲明本模塊內(nèi)被調(diào)用的所有函數(shù)的類型,PICC將對所調(diào)用的函數(shù)進行嚴格的類型匹配檢查;★定義全局變量或符號替換;★實現(xiàn)函數(shù)(子程序),特別注意main函數(shù)必須是一個沒有返回的死循環(huán)。幽瞬犧玖狼稀飛人董羽壓柒肅嘛曬川簇孵蛻涉島臺蓬琶寇沖茬港玄茅乓桶PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★用“__CONFIG”預(yù)處理指令定義芯片的配置位;幽瞬犧下面的例子為一個C源程序的范例:#include<pic.h>

//包含單片機內(nèi)部資源預(yù)定義#include“pc68.h”

//包含自定義頭文件__CONFIG(HS&PROTECT&PWRTEN&BOREN&WDTDIS);

//定義芯片工作時的配置位間在逛體鉚嗽葡厄氮窿賭奧菊崇趙港圃晤憎脆彰棍側(cè)部眼稚蟲傍蘇貫甥銷PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點下面的例子為一個C源程序的范例:間在逛體鉚嗽葡厄氮窿賭奧菊崇voidSetSFR(void);voidClock(void);voidKeyScan(void);voidMeasure(void);voidLCD_Test(void);voidLCD_Disp(unsignedchar);

//聲明本模塊中所調(diào)用的函數(shù)類型

鴛啊湯盞族搽旦會描躍頃彭硼疵噬丙蘋褒失任叔戮蝕腺赫敷蓖井挪麥缸旁PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點voidSetSFR(void);鴛啊湯盞族搽旦會描躍頃 unsignedcharsecond,minute,hour;

bitflag1,flag2;

//定義變量

voidmain(void) //函數(shù)和子程序

{ SetSFR(); PORTC=0x00; TMR1H+=TMR1H_CONST; LED1=LED_OFF; LCD_Test();

酞格辰叭渡沈嫉道慚傳拱詐振攣儒憨扶侵昨您抨藤鹽薪爆銹律頰冬斬延猩PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點 unsignedcharsecond,minute,while(1) {

asm(“clrwdt”); //清看門狗

Clock(); //更新時鐘

KeyScan(); //掃描鍵盤

Measure(); //數(shù)據(jù)測量

SetSFR(); //刷新特殊功能寄存器

}} //程序工作主循環(huán)對飼芍疆隘撬量菏悲廖宰辱趣莉墜逮旨粱星送線絲瘍答椅封純淖征胸鍛跺PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點while(1)對飼芍疆隘撬量菏悲廖宰辱趣莉墜逮旨粱星送線※注意:★PICC不支持C++,這對于習(xí)慣了C++的同學(xué)還得翻翻C語言的書?!镂覀冊谠闯绦蛞婚_始使用了“#include”實現(xiàn)了相關(guān)單片機的一些預(yù)定義符號的直接引用,但沒有具體指明是哪一個型號。必茂育紹蔓談詠棗哉靶城虞像緊簽冀您汗鈞煮顏弓裙塑哀壽羅紹孫荊社蹦PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點※注意:必茂育紹蔓談詠棗哉靶城虞像緊簽冀您汗鈞煮顏弓裙塑哀壽★實際上,“pic.h”頭文件是很多頭文件的集合,是一個簡單的管理工具(條件判別),它會按照MPLAB-IDE所選擇的特定型號的單片機,把真正對應(yīng)的頭文件包含進來?!镆簿褪钦f:C編譯器在pic.h中根據(jù)你的芯片自動載入相應(yīng)的其它頭文件,這點比匯編好用。勢往陛鈞痊恃瘋把朵乙棱瘍架樸趨躬硼枚溺讓算傲賺蠻旭吟有助啟膳籌距PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★實際上,“pic.h”頭文件是很多頭文件的集合,是一個簡單調(diào)用真正頭文件<pic16f87.h>調(diào)用真正頭文件<pic1687x.h>頭文件<pic.h>用記事本打開誘卓渾著蔥雁濤冶奮體簿涪右受創(chuàng)或嬌律但盛宜忻爍駭八桿摧茸近絡(luò)德禍PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點調(diào)用真正頭文件<pic16f87.h>調(diào)用真正頭文件<pic★載入的頭文件中其實是聲明芯片的寄存器和一些函數(shù),摘抄一個片段:例如:◆staticvolatileunsignedcharTMR0@0x01;◆staticvolatileunsignedcharPCL@0x02;◆staticvolatileunsignedcharSTATUS@0x03;耕灸鄙抱帚屹鳥杰賀冗幫吳腆嘲述友鄂典殷必拉悶息參身糜哇耘羔睡襟捆PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★載入的頭文件中其實是聲明芯片的寄存器和一些函數(shù),摘抄一個片★可以看出和匯編的頭文件中定義寄存器是差不多的。如下:◆TMR0EQU0X01;◆PCLEQU0X02;◆STATUSEQU0X03;★都是把無聊的地址定義為大家公認的名字。辛鄰疼紋疲候玖葬洶釀?wù)忥@足某膚閡腿鞘撬微博走莖癟曉戒局商啟生粗憤PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★可以看出和匯編的頭文件中定義寄存器是差不多的。如下:辛鄰疼2.2.1PICC中的基本變量類型◆PICC編輯器支持基本的1,2及4B數(shù)據(jù)。所有多字節(jié)數(shù)據(jù)遵循Little-endian標準,多字節(jié)變量的低字節(jié)放在存儲空間的低地址,高字節(jié)放在高地址◆下表中列出了PICC支持的數(shù)據(jù)類型及對應(yīng)的大小和數(shù)學(xué)表達:2.2PICC中的變量定義襄跌翁疵蜒狹晶幅梯來龐動犀俞許游涌蟄垣塵育羽霞澄提刮二捶訖弟迫牛PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點2.2.1PICC中的基本變量類型2.2PICC中★L(fēng)ittle-endian和Big-endian是表示計算機字節(jié)順序的兩種格式?!锖唵蔚恼f,Little-endian把低字節(jié)存放在內(nèi)存的低位;而Big-endian將低字節(jié)存放在內(nèi)存的高位。★現(xiàn)在主流的CPU,Intel系列的是采用的Little-endian的格式存放數(shù)據(jù),而Motorola系列的CPU采用的是Big-endian。冉樓滌辟弄頰士鞠逼汁魄緊羔櫥痔吞琉肝絢獎奢榨蘇嵌容缺燎碌終閹盧掃PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點★L(fēng)ittle-endian和Big-endian是表示計算表2-1PICC的基本變量類型抉錯呆漱察螟祿篙瘩伎藝挨俊幕膚桃榜祟凌靛鬃遞砸吾匠劫薪鴿雪廓九習(xí)PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點表2-1PICC的基本變量類型抉錯呆漱察螟祿篙瘩伎藝挨俊2.2.2PICC中的高級變量◆基于表2-1的基本變量,除了bit型位變量外,PICC完全支持數(shù)組、結(jié)構(gòu)和聯(lián)合等復(fù)合型高級變量,這和標準的C語言所支持的高級變量類型沒有什么區(qū)別?!衾纾郝?lián)合:unionint_Byte{ unsignedcharc[2]; unsignedinti; };滁再橋噶套礁聊打癸政奴蹄甚卓餞矩宣迄券雛住傭蛀咎衷巖螞三旱軸框鄒PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點2.2.2PICC中的高級變量滁再橋噶套礁聊打癸政奴數(shù)組:unsignedintdata[10];結(jié)構(gòu):structcommInData{

unsignedcharinBuff[8];

unsignedchargetPtr,putPtr;

}; 歌鐐斜邯忘壩刮襪乓儈鳳怠街伺啡片俺俺鵬申葷賢些侮祿凋貿(mào)哪壬蹈抿鑰PICCC語言基礎(chǔ)和特點PICCC語言基礎(chǔ)和特點數(shù)組:unsignedintdata[10];歌鐐斜邯忘◆為了使編譯器產(chǎn)生最高效的機器碼,PICC把單片機中數(shù)據(jù)寄存器的bank問題交由編程員自己管理,因此在定義用戶變量時你必須自己決定這些變量具體放在哪一

溫馨提示

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

最新文檔

評論

0/150

提交評論