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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

bitflag1,flag2;

//定義變量

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

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

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

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

Clock(); //更新時(shí)鐘

KeyScan(); //掃描鍵盤

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

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

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

unsignedcharinBuff[8];

unsignedchargetPtr,putPtr;

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

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

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

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

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

struct{

unsignedb0:1;

unsignedb1:1;

unsignedb2:1;

unsignedb3:1;

unsignedb4:1;

unsignedb5:1;

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

}oneBit;

unsignedcharallBits;

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

struct{

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

volatileunsignedchar*ptr0;

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

volatileunsignedchar*ptr0;

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

bank2unsignedchar*volatilconstunsignedchar*constptr0;

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

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

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

voidinterruptISR(void)

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

{

if(T0IE&&T0IF)

//判斷TMR0中斷

{

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

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

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

//判斷TMR1中斷

{

TMR1IF=0;

//清除TMR1中斷標(biāo)志

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

} }

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

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

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

#defineWDTEN0x3FFF

//看門狗打開#defineWDTDIS0x3FFB

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

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

//上電延時(shí)定時(shí)器打開#definePWRTDIS0x3FFF

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

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

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

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

//沒有代碼保護(hù)#definePROTECT0x3FEF

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

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

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

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

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

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

bitflag1,flag2;

//定義變量

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

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

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

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

Clock(); //更新時(shí)鐘

KeyScan(); //掃描鍵盤

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

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

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

unsignedcharinBuff[8];

unsignedchargetPtr,putPtr;

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論