国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

單片機C環(huán)境下位操作的實現(xiàn)方法

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

1 用“讀-修改-寫”方法實現(xiàn)對單個位的位操作

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

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

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

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

#define LED 2

使用方法如下:

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

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

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





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

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

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

位域列表 };

位域列表格式為:類型說明符 位域名:位域長度如:

struct k{

unsigned int a:1

unsigned int :2

unsigned int b:3

unsigned int :0   //空域

}k1;

說明:

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

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

3)第四行稱空域,目的是將目前存儲單元的剩余部分分為一個域,且填充0。
位域的引用很簡單,如:

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

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

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


通過位域定義位,再通過宏進行定義,可以方便地將Keil C 51等程序移植到其他C編譯器,從而不再為沒有位操作而苦惱。

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

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

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



該SPI模塊已經(jīng)成功應(yīng)用到單片機與MAX7219和CH451等SPI通信上。

對于沒有擴展位變量的C語言環(huán)境,在匯編下沒有對單個位進行位操作執(zhí)行的MCU,通過位域的方法操作I/O口是最佳的方法,匯編下有單個位的位操作指令MCU。可以嵌入?yún)R編,但是程序的可移植性等性能會下降,建議使用位域的方法。
本文地址:http://m.qingdxww.cn/thread-25647-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)在線工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄视频在线免费看 | 韩国妈妈的朋友在线播放 | www.99热 | 国内精品自在自线2020 | 欧美激情视频一区二区三区 | 国产成人aaa在线视频免费观看 | 国产高清在线观看 | 国产区精品一区二区不卡中文 | 欧美成人免费在线 | 成人一区二区免费中文字幕 | 国产精品视频久久久 | 国产最新自拍视频 | 国产亚洲综合色就色 | 日韩免费高清完整版 | 五月天婷婷视频在线观看 | 亚洲高清在线播放 | 日本黄色一区 | 国产高清国内精品福利99久久 | 中文字幕一区二区三区在线播放 | 日韩经典在线观看 | 亚洲日本视频在线 | 国产欧美日韩精品a在线观看高清 | 亚洲成人h| 久久99国产精一区二区三区 | 黑人一区二区三区中文字幕 | 国产麻豆精品 | 青青国产线免观看手机版精品 | 啊~用力cao我cao死我公 | 天堂网视频 | 九九免费观看全部免费视频 | 男人扒开你的下面狂躁的视频 | 久久99久久成人免费播放 | 久久99精品久久久久久黑人 | 国产乱对白刺激视频在线观看 | 日韩区在线 | 天堂网资源www | 亚洲天堂91 | 麻豆视频传媒二区 | 亚洲视频免费播放 | 在线看的成人性视频 | 久久久久久久久久久久久久久久久 |