日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
單片機(jī)C環(huán)境下位操作的實(shí)現(xiàn)方法
單片機(jī)C環(huán)境下位操作的實(shí)現(xiàn)方法
 更新時(shí)間:2008-8-17 19:39:51  點(diǎn)擊數(shù):6
【字體: 字體顏色
單片機(jī)C環(huán)境下位操作的實(shí)現(xiàn)方法
黑龍江工程學(xué)院 劉海成

C語(yǔ)言既有高級(jí)語(yǔ)言的各種特點(diǎn),又可對(duì)硬件進(jìn)行操作,并對(duì)進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì),用C語(yǔ)言編寫(xiě)的程序較容易移植,它們可生成簡(jiǎn)潔可靠的目標(biāo)代碼,在代碼效率和代碼執(zhí)行速度上完全可以和匯編媲美。采用C語(yǔ)言進(jìn)行單片機(jī)編程是嵌入式程序設(shè)計(jì)的發(fā)展趨勢(shì)。但是,在嵌入式控制等領(lǐng)域,經(jīng)常需要控制某一個(gè)二進(jìn)制位,然而除了Keil C51等C環(huán)境外,很多單片機(jī)C環(huán)境都沒(méi)有擴(kuò)充對(duì)位變量定義的關(guān)鍵字,甚至單片機(jī)本身的硬件上也沒(méi)有對(duì)單個(gè)位操作的匯編指令,這使得已習(xí)慣MCS-51內(nèi)核單片機(jī)Keil C51編程的用戶(hù)都為其C環(huán)境不能對(duì)位變量進(jìn)行位操作而煩惱。

1 用“讀-修改-寫(xiě)”方法實(shí)現(xiàn)對(duì)單個(gè)位的位操作

ANSIC中,一般采用“讀-修改-寫(xiě)”的方法實(shí)現(xiàn)單個(gè)位的位操作,通過(guò)與0“與”操作,將某一位清0。如使i變量的b0位為0,實(shí)現(xiàn)方法為i=i&0xfe。通過(guò)與1“或”操作,將某一位置1。如使i變量的b0位為1,實(shí)現(xiàn)方法為i=i 0x01。通過(guò)與1“異或”操作,將某一位取反。如使i變量的b0位取反,實(shí)現(xiàn)方法為i=i^0x01。

注意:錯(cuò)誤“讀-修改-寫(xiě)”方法時(shí)不要影響其他位,即某位清零時(shí),其他位與1“與”;某位置1時(shí),其他位與0“或”;取反時(shí),其他位與0“異或”。

為了方便程序設(shè)計(jì)和增加程序可讀性,很多程序員喜歡采用下面的移位方式實(shí)現(xiàn)單個(gè)位的位操作,語(yǔ)句簡(jiǎn)練,可讀性強(qiáng),比如在某單片機(jī)的B口連接1個(gè)發(fā)光二極管,其點(diǎn)亮操作方法如下:

#define bit(x) (1<<(x))

#define LED 2

使用方法如下:

PORTB =bit(LED);//將PORTB第3位置1,點(diǎn)

           //亮連接在I/O口的LED

該方式下,程序運(yùn)行時(shí)會(huì)增加移位操作,生成的代碼較大,而且執(zhí)行時(shí)間長(zhǎng),實(shí)時(shí)性差,一些C環(huán)境按如下方式直接定義位,則生成的代碼就不會(huì)有移位操作:

2 通過(guò)位域的方法實(shí)現(xiàn)位操作

標(biāo)準(zhǔn)C提供了一種基于結(jié)構(gòu)體的數(shù)據(jù)結(jié)構(gòu)--位域(BitField),位域就是把一個(gè)存儲(chǔ)單元中的二進(jìn)制劃分為幾個(gè)不同的區(qū)域。并說(shuō)明每個(gè)區(qū)域的位數(shù)。每一個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作,位域的定義格式如下:

struct 位域結(jié)構(gòu)名{

位域列表 };

位域列表格式為:類(lèi)型說(shuō)明符 位域名:位域長(zhǎng)度如:

struct k{

unsigned int a:1

unsigned int :2

unsigned int b:3

unsigned int :0     //空域

}k1;

說(shuō)明:

1)各位依次從低位到高位排列,排滿一個(gè)存儲(chǔ)單元,按地址接著排下一單元;

2)位域可以無(wú)域名,但不能被引用,如第二域,這時(shí)其只用來(lái)填充或調(diào)整位置;

3)第四行稱(chēng)空域,目的是將目前存儲(chǔ)單元的剩余部分分為一個(gè)域,且填充0。

位域的引用很簡(jiǎn)單,如:

k1.a=1; //置k1的b0位為1

k1.b=7; //將k1的b3-5位置111

通過(guò)位域定義位變量,是實(shí)現(xiàn)單個(gè)位位操作的重要途徑和方法,采用位域定義位變量,產(chǎn)生的代碼緊湊、高效。定義的方法如下:

通過(guò)位域定義位,再通過(guò)宏進(jìn)行定義,可以方便地將Keil C51等程序移植到其他C編譯器,從而不再為沒(méi)有位操作而苦惱。

對(duì)一個(gè)單片機(jī)的所有I/O口,通過(guò)將位域結(jié)構(gòu)指定到I/O端口地址,I/O口便都可以采用位域進(jìn)行宏定義,這樣,操作I/O口就可以像Keil C51編程一樣方便。

3 基于位域?qū)崿F(xiàn)位操作應(yīng)用舉例

很多單片機(jī)沒(méi)有硬件的SPI,而很多板級(jí)外圍器件為SPI接口,而且某些外圍器件不是標(biāo)準(zhǔn)的SPI,即通信的總二進(jìn)制位數(shù)不是8的整數(shù)倍,這里編制一個(gè)例程,為同時(shí)收和發(fā)0-16位,全雙工方式,具體使用見(jiàn)例程注解。注意:很多單片機(jī)使用前要對(duì)使用的I/O口進(jìn)行初始化,clk和din為輸出口,dout為輸入口,同時(shí)這里使用了前面通過(guò)讀-修改-寫(xiě)宏定義的一個(gè)函數(shù)GET_BIT(x,y)。

  • 上一篇: 調(diào)液晶模塊T6963驅(qū)動(dòng)范例
  • 下一篇: 兩種“軟件陷阱技術(shù)”的比較
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1