PIC單片機(jī)C語(yǔ)言知識(shí)入門(mén)基礎(chǔ)實(shí)例_第1頁(yè)
PIC單片機(jī)C語(yǔ)言知識(shí)入門(mén)基礎(chǔ)實(shí)例_第2頁(yè)
PIC單片機(jī)C語(yǔ)言知識(shí)入門(mén)基礎(chǔ)實(shí)例_第3頁(yè)
PIC單片機(jī)C語(yǔ)言知識(shí)入門(mén)基礎(chǔ)實(shí)例_第4頁(yè)
PIC單片機(jī)C語(yǔ)言知識(shí)入門(mén)基礎(chǔ)實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、PIC單片機(jī)C語(yǔ)言入門(mén)1.2.1認(rèn)識(shí)PIC單片機(jī)C語(yǔ)言用C語(yǔ)言來(lái)開(kāi)發(fā)單片機(jī)系統(tǒng)軟件最大的好處是編寫(xiě)代碼效率高。軟件調(diào)試直觀、維護(hù)升級(jí)方便、代碼的重復(fù)利用率高、便于跨平臺(tái)的代碼移植等等,因此C語(yǔ)編程在單片機(jī)系統(tǒng)設(shè)計(jì)中已得到越來(lái)越廣泛的應(yīng)用。但在單片機(jī)上用 C語(yǔ)言寫(xiě)程序和在 PC機(jī)上寫(xiě)程序絕對(duì)不能簡(jiǎn)單等同。珊在的PC機(jī)資源十分豐富,運(yùn)算能力強(qiáng)大,因此,程序員在寫(xiě)PC機(jī)的應(yīng)用程序時(shí),幾乎不用關(guān)心編譯后的可執(zhí)行代碼在運(yùn)行過(guò)程中需要占用多少系統(tǒng)資源,也基本不用擔(dān)心運(yùn)行效率有多高。寫(xiě)單片機(jī)的C語(yǔ)言程序最關(guān)鍵的一點(diǎn)是單片機(jī)內(nèi)的資源非常有限,控制的實(shí)時(shí)性要求又很高,因此,如果沒(méi)有對(duì)單片機(jī)體系結(jié) 構(gòu)和硬件資源作

2、詳盡的了解,以筆者的愚見(jiàn)認(rèn)為是無(wú)法寫(xiě)出高質(zhì)量實(shí)用性很高的C語(yǔ)程序。本書(shū)圍繞PIC中檔系統(tǒng)單機(jī)來(lái)展開(kāi)討論的,Microchip公司自己沒(méi)有針對(duì)PIC中檔系列單片機(jī)的C語(yǔ)言編譯器,但很多專業(yè)的第三方公司有眾多支持PIC單片機(jī)的C語(yǔ)言編譯器提供,常見(jiàn)的有Hitech、CCS、IAR、Bytecraft等公司。其中筆者最常用的是Hitech公司的PICC編譯器,它穩(wěn)定可靠,編譯生成的代碼效率高,在用PIC單片機(jī)進(jìn)行系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)的工程師群體中得到廣泛認(rèn)可。其正式完全版軟件需要購(gòu)置,但在其網(wǎng)站上有限時(shí)的試用版供用戶評(píng)估。另外,Hitech公司針對(duì)廣大PIC的業(yè)余愛(ài)好者和初學(xué)者,還提供了完全免費(fèi)的學(xué)習(xí)版P

3、ICC-Lite編譯器套件。它的使用方式與完全版相同,只是支持的PIC單片機(jī)型號(hào)限制在 PIC16F84、PIC16F877和PIC16F628等幾款。這幾款Flash型的單片機(jī)因其所具備的豐富的片上資源而最適用于單片機(jī)學(xué)習(xí)入門(mén),因此,筆者建議感興趣的讀者可以從 PICC-Lite入手掌握PIC單片機(jī)的C語(yǔ)言編程。我們一起來(lái)認(rèn)識(shí)訓(xùn)練項(xiàng)目2跑馬燈的仿真與演示的程序LEDS.C。1#i ncludepic.h2int a;/定義整型變量a3void mai n()4 TRISB=0X00;/定義端口 B為輸出模式5while(1)/while循環(huán)語(yǔ)句6PORTB=OXFE;/1111 11107f

4、or(a=1000;a0;a-);/for循環(huán)語(yǔ)句8PORTB=0XFD;/1111 11019for(a=1000;a0;a-);/for循環(huán)語(yǔ)句10PORTB=0XFB;/1111 101111for(a=1000;a0;a-);/for循環(huán)語(yǔ)句12PORTB=0XF7;/1111 011113for(a=1000;a0;a-);/for循環(huán)語(yǔ)句14PORTB=0XEF;/1110 111115for(a=1000;a0;a-);/for循環(huán)語(yǔ)句16PORTB=0XDF;/1101 111117for(a=1000;a0;a-);/for循環(huán)語(yǔ)句18PORTB=0XBF;/1011 111

5、119for(a=1000;a0;a-);/for循環(huán)語(yǔ)句20PORTB=0X7F;/0111 111121for(a=1000;a0;a-);/for循環(huán)語(yǔ)句2223說(shuō)明:第1行:#includepic.h是文件包含語(yǔ)句,表示把語(yǔ)句中指定文件的全部?jī)?nèi)容復(fù)制到此處,與當(dāng) 前的源程序文件鏈接成一個(gè)源文件。該語(yǔ)句中指定的文件 pic.h是Hitech-PICC編譯器提供的頭文件, 保存在“ C:HT-PICinclude ”路徑下,該文件包含了對(duì)PIC單片機(jī)特殊功能寄存器SFR和位名稱的定義。在編寫(xiě)每一個(gè)程序時(shí),首先編寫(xiě)的一條語(yǔ)句就是#includepic.h。第2行:int a。是定義一個(gè)整型變

6、量a,具體什么是整型變量?有何功能?請(qǐng)看數(shù)據(jù)與數(shù)據(jù)類型號(hào)中的介紹。第3行:void main()。定義主函數(shù) void main()。其是C語(yǔ)言程序中必不可少的主函數(shù),也是程序開(kāi)始執(zhí)行的第一個(gè)函數(shù)。函數(shù)一般分成兩個(gè)部分,一個(gè)部分為函數(shù)名:mai n,另一個(gè)部分為函數(shù)體:從第4行的到23行的為止。第4行:TRISB=0X00。是給單片機(jī)的B端口方向寄存器賦值,使B端口數(shù)據(jù)方向?yàn)檩敵龇较?,具體TRISB寄存器功能請(qǐng)查看【知識(shí)鏈接3】PIC單片機(jī)I/O接口及其應(yīng)用。第5行:while(1)。是while()循環(huán)語(yǔ)句。第6 行: PORTB=OXFE。是給單片機(jī)的B端口寄存器賦值,使B端口寄存器為0X

7、FE,具體PORTB 寄存器功能請(qǐng)查看【知識(shí)鏈接3】PIC單片機(jī)I/O接口及其應(yīng)用。第 7 行:for(a=1000;a0;a-)。是 for 循環(huán)語(yǔ)句。第821行都與第6、7行相類似,在此就不再重復(fù),int、while、for等C語(yǔ)言知識(shí)接下將一 一介紹。1.2.2數(shù)據(jù)與數(shù)據(jù)類型數(shù)據(jù)是計(jì)算機(jī)的對(duì)象, 任何程序設(shè)計(jì)都要進(jìn)行數(shù)據(jù)處理。具有一定格式的數(shù)字或數(shù)值稱為數(shù)據(jù),數(shù)據(jù)的不同格式稱為數(shù)據(jù)類型。在C語(yǔ)言中,數(shù)據(jù)類型可分為:基本數(shù)據(jù)類型、構(gòu)造數(shù)據(jù)類型、指針類型、空類型四大類,如 圖1-2-1所示。-單精度型(float).雙精度型(double)整型(int)基本類型V 實(shí)型(浮點(diǎn)型)、字符型(c

8、har) 廠枚舉類型號(hào)(enum)數(shù)組類型數(shù)據(jù)類型構(gòu)造類型= = !=邏輯運(yùn)算符! & |位運(yùn)算符&|人賦值運(yùn)算符=條件運(yùn)算符?逗號(hào)運(yùn)算符5指針運(yùn)算符* &求字節(jié)數(shù)運(yùn)算符sizeof強(qiáng)制類型轉(zhuǎn)換運(yùn)算符(類型)下標(biāo)運(yùn)算符函數(shù)調(diào)用運(yùn)算符()表達(dá)式是由運(yùn)算符及運(yùn)算對(duì)象組成的、具有特定含義的式子。C語(yǔ)言是一種表達(dá)式語(yǔ)言,表達(dá)式后面加上分號(hào)“;”就構(gòu)成了表達(dá)式語(yǔ)句。這里我們主要介紹在Hitech-PICC編程中經(jīng)常用到的算術(shù)運(yùn)算、賦值運(yùn)算、關(guān)系運(yùn)算、邏輯運(yùn)算、位運(yùn)算、逗號(hào)運(yùn)算及其表達(dá)式。1 運(yùn)算符的優(yōu)先級(jí)和結(jié)合性學(xué)習(xí)C語(yǔ)言的運(yùn)算符,不僅要掌握各種運(yùn)算符的功能,以及它各自可連接的運(yùn)算對(duì)象個(gè)數(shù),而且還要了解

9、各種運(yùn)算符彼此之間的優(yōu)先級(jí)和結(jié)合性,運(yùn)算符可按其優(yōu)先級(jí)從高到低分為15個(gè)等級(jí),如表1-2-4所示。表1-2-4運(yùn)算符的優(yōu)先級(jí)和結(jié)合性優(yōu)先級(jí)運(yùn)算符含義運(yùn)算量個(gè)數(shù)結(jié)合性1()-括號(hào)運(yùn)算符下標(biāo)運(yùn)算符指向結(jié)構(gòu)體成員運(yùn)算符成員運(yùn)算符自左至右2!+ -(類型)* &sizeof邏輯非運(yùn)算符 按位取反運(yùn)算符 自加、自減運(yùn)算符 負(fù)號(hào)運(yùn)算符 強(qiáng)制類型轉(zhuǎn)換運(yùn)算符 指針和地址運(yùn)算符 取長(zhǎng)度運(yùn)算符單目運(yùn)算符右結(jié)合3* / %乘、除、求余運(yùn)算符雙目運(yùn)算符自左至右4+ -算術(shù)加、減運(yùn)算符雙目運(yùn)算符自左至右5位左移、右移運(yùn)算符雙目運(yùn)算符自左至右6=關(guān)系運(yùn)算符雙目運(yùn)算符自左至右7=!=關(guān)系運(yùn)算符雙目運(yùn)算符自左至右8&按位與運(yùn)

10、算符雙目運(yùn)算符自左至右9A位異或運(yùn)算符雙目運(yùn)算符自左至右10|位或運(yùn)算符雙目運(yùn)算符自左至右11&邏輯與運(yùn)算符雙目運(yùn)算符自左至右12|邏輯或運(yùn)算符雙目運(yùn)算符自左至右13?:條件運(yùn)算符三目運(yùn)算符右結(jié)合14=+= -= *=/=%=&=|=A =組合算術(shù)運(yùn)算符組合運(yùn)算符雙目運(yùn)算符右結(jié)合15j逗號(hào)運(yùn)算符自左至右(1)優(yōu)先級(jí)求解表達(dá)式時(shí),總是先按運(yùn)算符的優(yōu)先次序由高到低進(jìn)行操作。優(yōu)先級(jí)是用來(lái)標(biāo)志運(yùn)算符在表 達(dá)式中的運(yùn)算順序的。相當(dāng)于加括號(hào),運(yùn)算時(shí)進(jìn)行脫括號(hào)運(yùn)算。(2) 結(jié)合性當(dāng)一個(gè)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符優(yōu)先級(jí)相同時(shí),則按運(yùn)算符的結(jié)合性確定表達(dá)式的運(yùn)算順序。它 分為兩類:一類是運(yùn)算符的結(jié)合性為“從左到右”(

11、大多數(shù)運(yùn)算符是這樣的),另一類運(yùn)算符的結(jié)合性為“從右到左”。例如:3-5*2,按運(yùn)算符的優(yōu)后次先乘后減,表達(dá)式的值為了-7 ; 3*5/2,5的兩側(cè)是“ * ”和“/”優(yōu)先級(jí)相同,則按結(jié)合性處理,算術(shù)運(yùn)算符的結(jié)合性為“從左到右”,則先乘后除,表達(dá)式的值為7。C語(yǔ)言規(guī)定了各種運(yùn)算符的結(jié)合方向(結(jié)合性),關(guān)于結(jié)合性的概念在其他高級(jí)語(yǔ)言中是沒(méi)有的,這是C語(yǔ)言的特點(diǎn)之一。2 算術(shù)運(yùn)算符與算術(shù)表達(dá)式Hitech-PICC中的算術(shù)運(yùn)算符如表 1-2-5所示。表1-2-5算術(shù)運(yùn)算符運(yùn)算符名稱功能+加法求兩個(gè)數(shù)的和,例如8+9=17-減法求兩個(gè)數(shù)的差,例如20-7=13*乘法求兩個(gè)數(shù)的積,例如 20*5=10

12、0/除法求兩個(gè)數(shù)的商,例如20/5=4%取余求兩個(gè)數(shù)的余數(shù),例如20%9=2+自增1變量自動(dòng)加1-自減1變量自動(dòng)減1在使用上述運(yùn)算符時(shí),應(yīng)注意以下幾點(diǎn): 要注意除法運(yùn)算符在進(jìn)行浮點(diǎn)數(shù)相除時(shí),其結(jié)果為浮點(diǎn)數(shù),如20.0/5所得值為4.0;而進(jìn)行兩個(gè)整數(shù)相除時(shí),所得值是整數(shù),如7/3,值為2。 取余運(yùn)算符(模運(yùn)算符)“%”要求參與運(yùn)算的量均為整型,其結(jié)果等于兩數(shù)相除后的余數(shù)。 Hitech-PICC提供的自增運(yùn)算符“ + ”和自減運(yùn)算符“-”,作用是使變量值自動(dòng)加1或減1。自增運(yùn)算和自減運(yùn)算只能用于變量而不能用于常量表達(dá)式,運(yùn)算符放在變量前和變量后是不同的。后置運(yùn)算:i+ (或i-)是先使用i的值

13、,再執(zhí)行i+1 (或i-1 )。前置運(yùn)算:+i (或-i)是先執(zhí)行i+1 (或i-1),再使用i的值。 對(duì)自增、自減運(yùn)算的理解和使用是比較容易出錯(cuò)的,應(yīng)仔細(xì)地分析,例如:int i=100,j;j=+i;/j=101,i=101j=i+;/j=101,i=102j=-i;/j=101,i=101戸-;/j=101,i=100編程時(shí)常將“+ ”、“-”這兩個(gè)運(yùn)算符用于循環(huán)語(yǔ)句中,使循環(huán)變量自動(dòng)1;也常用于指針變量,使指針自動(dòng)加1指向下一個(gè)地址。3. 賦值運(yùn)算符與賦值表達(dá)式賦值運(yùn)算符“=”的作用變是給變量賦值,如“x=10 ;”。用賦值運(yùn)算符將一個(gè)變量與一個(gè)表達(dá)式連接起來(lái) 的式子稱為賦值表達(dá)式,在

14、表達(dá)式后面加“;”便構(gòu)成了賦值語(yǔ)句。賦值勤語(yǔ)句的格式如下。變量=表達(dá)式;例如:k=0xff;將十六進(jìn)制數(shù)FFH賦予變量kb=c=33;/將33冋時(shí)賦予變量b和cd=e;/將變量e的值賦予變量df=a+b;將表達(dá)式a+b的值賦予變量f由此可見(jiàn),賦值表達(dá)式的功能是計(jì)算表達(dá)式的值再賦予左邊的變量。賦值運(yùn)算符具有右結(jié)合性,因此有下面的語(yǔ)句:a=b=c=5;可以理解為:a=(b=(c=5);按照C語(yǔ)言的規(guī)疋上,任何表達(dá)式在其末尾加上分號(hào)就構(gòu)成語(yǔ)句。因此x-8;和 a-b-c-5;都是賦值語(yǔ)句。如果賦值運(yùn)算符兩過(guò)的數(shù)據(jù)類型號(hào)不相同,系統(tǒng)將自動(dòng)進(jìn)行類型轉(zhuǎn)換,即把賦值右邊的類型換 成左邊的類型。具體規(guī)定如下:

15、 實(shí)型賦給整型,舍去小數(shù)部分。 整型賦給實(shí)型,數(shù)值不變,但將以浮點(diǎn)開(kāi)式存放,即增加小數(shù)部分(小數(shù)部分的值為0)。 字符型賦給整型,由于字符型為1字節(jié),而整型2字節(jié),故將字符 ASCII碼值放到整型量的低8位中,高8位為0。 整型賦給字符型,只把低8位賦給字符量。圖1-2-4表示了各數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換的規(guī)則。低高int unsigned long unsigned long doublett,shor、charfloat圖1-2-4各種數(shù)據(jù)類型的高低順序在C語(yǔ)言程序設(shè)計(jì)中,經(jīng)常使用復(fù)合賦值運(yùn)算符對(duì)變量進(jìn)行賦值。復(fù)合賦值運(yùn)算符就是在賦值 符=”之前加上其他運(yùn)算符,表1-2-4中優(yōu)先級(jí)14就是復(fù)合賦值

16、運(yùn)算符。構(gòu)成復(fù)合賦值表達(dá)式的一般形式為:變量 雙目運(yùn)算符 =表達(dá)式;它等效于:變量=變量運(yùn)算符表達(dá)式;例如:a+=5;/相當(dāng)于a=a+5;x*=y+7;/相當(dāng)于x=x*(y+7);r%=p;/相當(dāng)于r=r%p;在程序中使用復(fù)合賦值運(yùn)算符,可以簡(jiǎn)化程序,有利于編譯處理,提高編譯效率并產(chǎn)生質(zhì)量較 高的目標(biāo)代碼。4. 關(guān)系運(yùn)算符與賦值表達(dá)式在前面介紹過(guò)的分支選擇程序結(jié)構(gòu)中,經(jīng)常需要比較兩個(gè)變量的大小關(guān)系,以決定程序下一步 的操作。比較兩個(gè)數(shù)據(jù)量的運(yùn)算符稱為關(guān)系運(yùn)算符。C語(yǔ)言提供了 6種關(guān)系運(yùn)算符:大于運(yùn)算符:;大于等于運(yùn)算符:=;小于運(yùn)算符:;小于等于運(yùn)算符:=;等于運(yùn)算符:;不等于運(yùn)算符:!=;條

17、件1條件2邏輯運(yùn)算ab!aa&ba|b11011100010110100100在關(guān)系運(yùn)算符中,、=的優(yōu)先級(jí)相同,=和!=優(yōu)先級(jí)相同;前者優(yōu)先級(jí)高于后者。例如:“ a=bc;” 應(yīng)理解為a=(bc); ”。關(guān)系運(yùn)算符優(yōu)先級(jí)低于算術(shù)運(yùn)算符,高于賦值運(yùn)算符。例如:“ a+bc+d; ”應(yīng)理解為(a+b)(c+d); ”。關(guān)系表達(dá)式是用關(guān)系運(yùn)算符連接的兩個(gè)表達(dá)式。它綿一般形式為:表達(dá)式關(guān)系運(yùn)算符表達(dá)式關(guān)系表達(dá)式的值只有0和1兩種,即邏輯的“真”與“假”。當(dāng)指定的條件滿足時(shí),結(jié)果為 1,不滿足時(shí)結(jié)果為0。例如表達(dá)式“ 50;”的值為“真”,即結(jié)果為1;而表達(dá)式“(a=3)(b=5); ”由于35不成立,

18、故其值為“假”,即結(jié)果為0。a+bc若a=1,b=2,c=3,則表達(dá)式的值為 0 (假)a3/2若x=2,則表達(dá)式的值為1 (真)c=5若c=1,則表達(dá)式的值為0 (假)5. 關(guān)系運(yùn)算符與賦值表達(dá)式C語(yǔ)言中提供了三種邏輯運(yùn)算符,一般形式有以下三種。 邏輯與運(yùn)算符:& 邏輯或運(yùn)算符:|; 邏輯非運(yùn)算符:!;邏輯表達(dá)式的一般形式有以下三種。邏輯與:條件式1&條件式2邏輯或:條件式1|條件式2 邏輯非:!條件式“ & ”和“是雙目運(yùn)算符,要求有兩個(gè)運(yùn)算對(duì)象,結(jié)合方向是從左到右?!?!”是單目運(yùn)算符,只要求一個(gè)運(yùn)算對(duì)象,結(jié)合方向是從右至左。(1) 邏輯與:a&b ,當(dāng)且僅當(dāng)兩個(gè)運(yùn)算量的值都為“真”時(shí),運(yùn)

19、算結(jié)果為“真”,否則為“假”。(2) 邏輯或:a|b,當(dāng)且僅當(dāng)兩個(gè)運(yùn)算量的值都為“假”時(shí),運(yùn)算結(jié)果為“假”,否則為“真”。(3) 邏輯非:!a,當(dāng)運(yùn)算量的值為“真”時(shí),運(yùn)算結(jié)果為“假”;當(dāng)運(yùn)算量的值為“假”時(shí), 運(yùn)算結(jié)果為“真”。表1-2-6給出了執(zhí)行邏輯運(yùn)算的結(jié)果表1-2-6執(zhí)行邏輯運(yùn)算的結(jié)果條件1條件2邏輯運(yùn)算ab!aa&ba|b11011100010110100100例如:設(shè)x=3,則(x0) & (x6)的值為“真”(即為“ 1 ”),而(x6)的值為 “假”(即為“ 0”),!x的值為“假”。邏輯運(yùn)算符“! ”的優(yōu)先級(jí)最高,其次為“& ”,最低為“|”。具體請(qǐng)讀者見(jiàn)表1-2-4運(yùn)算符

20、的優(yōu)先級(jí)和結(jié)合性。6. 位運(yùn)算符與位運(yùn)算表達(dá)式在PIC系列單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)中,對(duì)I /O端口的操作是非常頻繁的,因此往往要求程序在位(bit)一級(jí)進(jìn)行運(yùn)算或處理,因此,匯編語(yǔ)言具有強(qiáng)大靈活的位處理能力。Hitech-PICC 語(yǔ)言直接面對(duì):PIC系列單片機(jī)硬件,也提供了強(qiáng)大靈活的位運(yùn)算功能,使得c語(yǔ)言也能像匯編語(yǔ)言一樣對(duì)硬件直接進(jìn)行操作。Hitech-PICC 提供了 6種位運(yùn)算符: 按位與運(yùn)算符:&; 按位或運(yùn)算符:| ; 按位異或運(yùn)算符:A ; 按位取反運(yùn)算符:; 右移運(yùn)算符:; 左移運(yùn)算符:;位運(yùn)算符的作用是按二進(jìn)制位對(duì)變量進(jìn)行運(yùn)算,表1-2-7是位運(yùn)算符的真值表。表1-2-7位運(yùn)算符

21、的真值表位變量1位變量2位運(yùn)算ababa&ba|baAb0011000011001110010111100110左移運(yùn)算符“ ”的功能,是把“ ”左邊的操作數(shù)的各二進(jìn)制位全部左移若干位,移動(dòng)的位數(shù)由“ ”右邊的常數(shù)指定,高位丟棄,低位補(bǔ) Q例如:“a”的功能,是把“ ”左邊的操作數(shù)的各二進(jìn)制位全部右移若干位,移 動(dòng)的位數(shù)由“ ”右邊的常數(shù)指定。進(jìn)行右移運(yùn)算時(shí),如果是無(wú)符號(hào)數(shù),則總是在其左端補(bǔ)“0”;對(duì)于有符號(hào)數(shù),在右移時(shí),符號(hào)位將隨同移動(dòng)。當(dāng)為正數(shù)時(shí),最高位補(bǔ)O,而為負(fù)數(shù)時(shí),符號(hào)位為1,最高位是補(bǔ)0還是補(bǔ)1取決于編譯系統(tǒng)的規(guī)定。例如:設(shè)a=Ox98,如果a為無(wú)符號(hào)數(shù),則“ a2”表示把1001

22、1000B右移為001001QB;如果a為有符號(hào)數(shù),則“ a2 表示把 10011000B 右移為 11 100110B。在使用位運(yùn)算符時(shí),有如下技巧:按位與運(yùn)算通常用來(lái)對(duì)某些位清零或保留某些位。例如,要保留從PORTB端口的RB0和RB1讀入的兩位數(shù)據(jù),可以執(zhí)行 control=PORTB&0x03 ;操作(0x03的二進(jìn)制數(shù)為 00000011B);而要清除 PORTB端口的 RB4- RB7為 0,可以執(zhí)行“ PORTB=PORTB&OxOf操作(0x0f 的二進(jìn)制數(shù)為 00001111B。 同樣,按位或運(yùn)算經(jīng)常用于把指定位置 1、其余位不變的操作。流水燈控制程序 LEDS.c就是采用移

23、位運(yùn)算來(lái)實(shí)現(xiàn)的發(fā)光二極管點(diǎn)亮位置的移動(dòng)。用位運(yùn)算符改寫(xiě)的流水燈控制程序如下。1#i ncludepic.h2int a;/定義整型變量a3void mai n()4TRISB=0X00;/定義端口 B為輸出模式5while(1)/while循環(huán)語(yǔ)句6PORTB= PORTB|0XFE;/1111 11107for(a=1000;a0;a-);/for循環(huán)語(yǔ)句8PORTB= PORTB|0XFD;/1111 11019for(a=1000;a0;a-);/for循環(huán)語(yǔ)句10PORTB= PORTB|0XFB;/1111 101111for(a=1000;a0;a-);/for循環(huán)語(yǔ)句12PORT

24、B= PORTB|0XF7;/1111 011113for(a=1000;a0;a-);/for循環(huán)語(yǔ)句14PORTB= PORTB|0XEF;/1110 111115for(a=1000;a0;a-);/for循環(huán)語(yǔ)句16PORTB= PORTB|0XDF;/1101 111117for(a=1000;a0;a-);/for循環(huán)語(yǔ)句18PORTB= PORTB|0XBF;/1011 111119for(a=1000;a0;a-);/for循環(huán)語(yǔ)句20PORTB= PORTB|0X7F;/0111 111121for(a=1000;a0;a-);/for循環(huán)語(yǔ)句2223分析上面程序可知,該程序

25、實(shí)現(xiàn)的流水燈效果。7 逗號(hào)運(yùn)算符與逗號(hào)運(yùn)算表達(dá)式在c語(yǔ)言中逗號(hào)“,”也是一種運(yùn)算符,稱為逗號(hào)運(yùn)算符,其功能是把兩個(gè)表達(dá)式連接起來(lái)組成 一個(gè)表達(dá)式,稱為逗號(hào)表達(dá)式,其一般形式為:表達(dá)式 1,表達(dá)式 2,,表達(dá)式 n逗號(hào)表達(dá)式的求值過(guò)程是:從左軍右分別求出各個(gè)表達(dá)式的值,并以最右邊的表達(dá)式n的值作為整個(gè)逗號(hào)表達(dá)式的值。程序中使用逗號(hào)表達(dá)式的目的,通常是要分別求逗號(hào)表達(dá)式內(nèi)各表達(dá)式的值,并不一定 要求整個(gè)逗號(hào)表達(dá)式的值。例如:x=(y=10,y+5);上面括號(hào)內(nèi)的逗號(hào)表達(dá)式,逗號(hào)左邊的表達(dá)式是將10賦給y,逗號(hào)右邊的表達(dá)式進(jìn)行y+5的計(jì)算,逗號(hào)表達(dá)式的結(jié)果是最右邊的表達(dá)式“y+5”的結(jié)果15賦給X。

26、并不是在所有出現(xiàn)逗號(hào)的地方都組成逗號(hào)表達(dá)式,如在變量說(shuō)明、函數(shù)參數(shù)表中的逗號(hào)只是用做各變量之間的間隔符,例如:un sig ned int i, j;1.2.6基本語(yǔ)句C語(yǔ)言程序的執(zhí)行部分由語(yǔ)句組成。C語(yǔ)言提供了豐富的程序控制語(yǔ)句,按照結(jié)構(gòu)化程序設(shè)計(jì)的基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),組成各種復(fù)雜程序。這些語(yǔ)句主要包括表達(dá)式語(yǔ)句、 復(fù)合語(yǔ)句、選擇語(yǔ)句和循環(huán)語(yǔ)句等。1 .表達(dá)式語(yǔ)句表達(dá)式語(yǔ)句是最基本的C語(yǔ)言語(yǔ)句。表達(dá)式語(yǔ)句由表達(dá)式加上分號(hào)“;”組成,其一般形式如下:表達(dá)式;執(zhí)行表達(dá)式語(yǔ)句就是計(jì)算表達(dá)式的值。例如:PORTB=OXFD;/賦值語(yǔ)句,在程序 LEDS.C中將端口 B賦值為OXF

27、Dx=y+z;/ y和z進(jìn)行加法運(yùn)算后賦值給變量xi+;自增1語(yǔ)句,i增加1后,再賦給變量i在C語(yǔ)言中有一個(gè)特殊的表達(dá)式語(yǔ)句,稱為空語(yǔ)句。空語(yǔ)句中只有一個(gè)分號(hào)“;”,程序執(zhí)行空 語(yǔ)句時(shí)需要占用一條指令的執(zhí)行時(shí)間,但是什么也不做。在程序中常常把空語(yǔ)句作為循環(huán)體,用于 消耗CPU時(shí)間等待事件發(fā)生的場(chǎng)合。例如,在 LEDS.c函數(shù)中,有下面語(yǔ)句:for(a=1000;a0;a-); /for 循環(huán)語(yǔ)句上面的for語(yǔ)句后面的“;”是一條空語(yǔ)句,作為循環(huán)體出現(xiàn)。在使用“;”時(shí)的小技巧: 表達(dá)式是由運(yùn)算及運(yùn)算對(duì)象所組成的、具有特定含義的式子,例如“y+z”。C語(yǔ)言是一種表達(dá)式語(yǔ)言,表達(dá)式后面加上分號(hào)“;”

28、就構(gòu)成了表達(dá)語(yǔ)句,例如“y+z”。C語(yǔ)言中的表達(dá)式與表達(dá)式語(yǔ)句的區(qū)別就是前者沒(méi)有分號(hào)“;”,而后者有“;”。在while或for構(gòu)成的循環(huán)語(yǔ)句后面加一個(gè)分號(hào),構(gòu)成一個(gè)不執(zhí)行其他操作的空循環(huán)體。例 如:While(1);上面語(yǔ)句循環(huán)條件永遠(yuǎn)為真,是無(wú)限循環(huán);循環(huán)體為空,什么也不做。程序設(shè)計(jì)時(shí),通常把該 語(yǔ)句作為停機(jī)語(yǔ)句使用。2.復(fù)合語(yǔ)句把多個(gè)語(yǔ)句用大括號(hào)括起來(lái),組合在一起形成具有一定功能的模塊,這種由若干條語(yǔ)句組合 而成的語(yǔ)句稱為復(fù)合語(yǔ)句。在程序中應(yīng)把復(fù)合語(yǔ)句看在是單條語(yǔ)句,而不是多條語(yǔ)句。復(fù)合語(yǔ)句在程序運(yùn)行時(shí),中的各行單語(yǔ)句是依次順序執(zhí)行的。在C語(yǔ)言的函數(shù)中,函數(shù)體是一個(gè)復(fù)合語(yǔ)句,例如程序LE

29、D.c的主函數(shù)中包含兩個(gè)復(fù)合語(yǔ)句:void mai n() TRISB=0X00;/定義端口 B為輸出模式while(1)/while循環(huán)語(yǔ)句PORTB= PORTB|0XFE;1111 1110for(a=1000;a0;a-);/for循環(huán)語(yǔ)句PORTB= PORTB|0XFD;/1111 1101PORTB= PORTB|OX7F;/0111 1111for(a=1000;a0;a-);/for 循環(huán)語(yǔ)句 在上面的這段程序中,組成函數(shù)體的復(fù)合語(yǔ)句內(nèi)還嵌套了組成while()循環(huán)體的復(fù)合語(yǔ)句。復(fù)合語(yǔ)句允許嵌套,也就是在 中的也是復(fù)合語(yǔ)句。復(fù)合語(yǔ)句內(nèi)的各條語(yǔ)句都必須以分號(hào)“;”結(jié)尾,復(fù)合語(yǔ)句

30、之間有分隔,在括號(hào)“ ”外,不能家分號(hào)。復(fù)合語(yǔ)句不僅可由可執(zhí)行語(yǔ)句組成,還可由變量定義語(yǔ)句組成。在復(fù)合語(yǔ)句中所定義的變量,稱為局部變量,它的有效范圍只在復(fù)合語(yǔ)句中。函數(shù)體是復(fù)合語(yǔ)句,所以函數(shù)體內(nèi)定義的變量,其有效范圍也只在函數(shù)內(nèi)部。前面的main()函數(shù)體內(nèi)定義的位變量left和right的有效使用范圍局限在mai n()函數(shù)內(nèi)部,與其他函數(shù)無(wú)關(guān)。3 選擇語(yǔ)句跑馬燈的C程序可以用以下程序代碼來(lái)實(shí)現(xiàn),即跑馬燈先從上到下循環(huán)進(jìn)行。#i nclude pic.h un sig ned char temp=0x01;/*fun ctio n: main()*功能描述:主函數(shù)void mai n() I

31、NTCON=OXOO;TRISB=0X00;PORTB=OXff;while(1) PORTB=temp; for(a=1000;a0;a-); if(temp=0x00) temp=0x01;elsetemp=temp1;*/設(shè)置INTCON的bit7bit0為零:關(guān)總中斷設(shè)置端口 B為輸出方式使端口 B輸出低電平/按位取反/for循環(huán)語(yǔ)句,起延時(shí)作用/判斷變量temp是否等0x00/if語(yǔ)句成立,給變量 temp賦0x01/if語(yǔ)句不成立/變量temp左移1位我們看到,在上述程序中使用了如下if語(yǔ)句:if(temp=0x00)/判斷變量temp是否等0x00temp=0x01;/if語(yǔ)句成

32、立,給變量 temp賦0x01else/if語(yǔ)句不成立temp=temp1;/變量temp左移1位執(zhí)行這些語(yǔ)句時(shí),先判斷“ temp=0x00 ”是否成立,如果條件滿足,則執(zhí)行“temp=0x01; ”后,回到“PORTB=temp; ”語(yǔ)句,執(zhí)行該條語(yǔ)句,temp變量按位取反之后,變?yōu)?xFE (即卩11111110B),則PORTB為0xFE (即RB0引腳為低電平,其余引腳為高電平),所以第一個(gè)發(fā)光二極管亮,其它 都不亮。如果條件不成立,則執(zhí)行“ temp=temp0;a-);else if(RD0=0)RB0=0;for(a=5000;a0;a-);else if(RD1=0)RB1=0;for(a=5000;a0;a-);else;RB0=1;RB1=1;for(a=5000;a0;a-);/設(shè)置端口 B為輸出方式/設(shè)置端口 B為高電平輸出/設(shè)置端口 D為輸入方式/while 循環(huán)/如果RD0與RD1都為低電平狀態(tài)/則點(diǎn)亮左轉(zhuǎn)燈和右轉(zhuǎn)燈/for循環(huán)語(yǔ)句,起延時(shí)作用如果RD

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論