1.為什么也是C語言?
用C 語言來開發(fā)單片機(jī)系統(tǒng)軟件最大的好處是編寫代碼效率高,、軟件調(diào)試直觀、維護(hù)升級方便,、代碼的重復(fù)利用率高等,因此C 語言編程在單片機(jī)系統(tǒng)設(shè)計中越來越廣泛的運用,。PIC 單片機(jī)的軟件開發(fā),,同樣可以用C 語言實現(xiàn)。
Microchip 公司沒有自行開發(fā)PIC單片機(jī)的C 語言編譯器,,但其他公司有開發(fā)眾多支持PIC 單片機(jī)的C 語言編譯器,,常見的有Hitech、CCS,、IAR,、Bytecraft 等公司。其中最常用的是Hitech 公司的PICC 編譯器,,它穩(wěn)定可靠,,編譯生成的代碼效率高,在用PIC 單片機(jī)開發(fā)者中得到廣泛認(rèn)可,。
Hitech-PICC 編譯器基本上符合ANSI C標(biāo)準(zhǔn),,但是不支持函數(shù)的遞歸調(diào)用。其主要原因是因為PIC 單片機(jī)特殊的堆棧結(jié)構(gòu),。PIC 單片機(jī)的堆棧是硬件實現(xiàn)的,其深度已隨芯片固定,,無法實現(xiàn)需要大量堆棧操作的遞歸算法,。 成的代碼效率高,在用PIC 單片機(jī)開發(fā)者中得到廣泛認(rèn)可,。
2.MpLab中配置PIC C編譯環(huán)境,,并進(jìn)行項目開發(fā)
為便于PICC編譯器的編譯環(huán)境設(shè)置,應(yīng)先在MPLAB IDE集成開發(fā)環(huán)境下創(chuàng)建一個PICC C編譯器的項目,。
1.啟動MPLAB IDE7.00集成開發(fā)環(huán)境窗口,。選擇集成開發(fā)環(huán)境中的Project->New菜單項,打開如下所示的新項目對話框,,在此對話框中設(shè)置項目名和項目路徑,。
在項目名文本框中輸入項目名led,在項目路徑文本框中輸入項目路徑D:\led,也可以通過單擊Browse按鈕選擇項目名的保存路徑,。
2.器件選擇,,其操作過程如下所示。首先在MPLAB集成開發(fā)環(huán)境中打開Configure菜單,,然后單擊Select Device菜單項,,彈出如下所示的器件選擇對話框。此處可以選擇PICl6F877A作為開發(fā)芯片,。
3.設(shè)置項目
在創(chuàng)建項目和選定器件后,,接下來就可以設(shè)置工程的編譯環(huán)境。首先進(jìn)行語言組件的設(shè)置,。
在Active Toolsuite下拉列表框中選擇HI-TECH PICC Toolsuite作為開發(fā)工具組件,,然后在Toolsuite Contents列表框中選擇PICCCompiler項,如下圖所示,。
3.PICC基本編程
3.1 PICC 中的基本變量類型
PICC 支持的基本變量類型見下表:
3.2 PICC 中的高級變量
基于上表的基本變量,,除了bit 型位變量外,PICC 完全支持?jǐn)?shù)組,、結(jié)構(gòu)和聯(lián)合等復(fù)合型高級變量,,這和標(biāo)準(zhǔn)的C 語言所支持的高級變量類型沒有什么區(qū)別。例如:
數(shù)組:
unsigned int data[10];
結(jié)構(gòu)體:
struct commInData {
unsigned char inBuff[8];
unsigned char getPtr, putPtr;
};
聯(lián)合體:
union int_Byte {
unsigned char c[2];
unsigned int i;
};
3.3 PICC 對數(shù)據(jù)寄存器bank 的管理
在PIC單片機(jī)編程時,,單片機(jī)數(shù)據(jù)寄存器的bank是由編程員管理的,,因此在定義變量時必須決定這些變量具體放在哪一個bank 中,缺省時,,所定義的變量將被定位在bank0中,,例如下面所定義的這些變量:
unsigned char buffer[32];
bit flag1,flag2;
float val[8];
以上變量都是分布在bank0 中。定義在其它bank 內(nèi)的變量前面必須加上相應(yīng)的bank 序號,,例如:
bank1 unsigned char buffer[32]; //變量定位在bank1 中
bank2 bit flag1,flag2; //變量定位在bank2 中
bank3 float val[8]; //變量定位在bank3 中
3.4 volatile 修飾詞
PICC 中還有一個特殊的變量修飾詞“volatile”,,用來說明一個變量的值是會隨機(jī)變化的,即使程序沒有刻意對它進(jìn)行任何賦值操作,。
在單片機(jī)中,,作為輸入的IO 端口其內(nèi)容將是隨意變化的;很多特殊功能寄存器的值也將隨著指令的運行而動態(tài)改變,。所有這種類型的變量必須將它們明確定義成“volatile”類型,,例如:
volatile unsigned char STATUS @ 0x03;
volatile bit commFlag;
3.5 標(biāo)準(zhǔn)庫函數(shù)
PICC 提供了較完整的C 標(biāo)準(zhǔn)庫函數(shù)支持,其中包括數(shù)學(xué)運算函數(shù)和字符串操作函數(shù),。在程序中使用這些現(xiàn)成的庫函數(shù)時需要注意的是入口參數(shù)必須在bank0 中,。
如果需要用到數(shù)學(xué)函數(shù),則用 “#include ” 包含頭文件,;如果要使用字符串操作函數(shù),,就需要包含“#include ”頭文件,。在這些頭文件中提供了函數(shù)類型的聲明。直接查看這些頭文件就可以知道PICC 提供了哪些標(biāo)準(zhǔn)庫函數(shù),。
C 語言中的格式化輸出函數(shù)“printf/sprintf”用在單片機(jī)的程序中時要特別謹(jǐn)慎,。printf/sprintf 是一個非常大的函數(shù),一旦使用,,你的程序代碼長度就會增加很多,。
4.C和匯編混合編程
用C 語言進(jìn)行單片機(jī)應(yīng)用程序開發(fā)時經(jīng)常要使用匯編語句。比如,,單片機(jī)的一些特殊指令操作在標(biāo)準(zhǔn)的C 語言語法中沒有直接對應(yīng)的描述,,例如PIC 單片機(jī)的清看門狗指令“clrwdt”和休眠指令“sleep”。這樣,,一個項目中就會出現(xiàn)C 和匯編混合編程的情形,,我們在此討論一些混合編程的基本方法和技巧。
在C 原程序中直接嵌入?yún)R編指令是最直接最容易的方法,。如果只需要嵌入少量幾條的匯編指令,,PICC 提供了一個類似于函數(shù)的語句:
asm(“clrwdt”) ;
雙引號中可以編寫任何一條PIC 的標(biāo)準(zhǔn)匯編指令。例如:
for (;;) {
asm("clrwdt"); //清看門狗
asm("sleep"); //休眠
asm(“nop”); //空操作延時
}
如果需要編寫一段連續(xù)的匯編指令,,PICC 支持另一種語法描述:用“#asm”開始指令段,,用“#endasm”結(jié)束。
例如下面的一段嵌入?yún)R編指令實現(xiàn)了將0x20~0x7F 間的RAM 全部清零:
#asm
movlw 0x20
movwf _FSR
clrf _INDF
incf _FSR, f
btfss _FSR,7
goto $-3
#endasm