[教學]_BV() 巨集介紹

探討「內嵌」以及「腳本化」這兩個主題的技術-版主XO老師(熟悉的目前是 Tcl,討論內容也會環繞在 Tcl 四周,但是本版還是歡迎其他 Scripting 語言以及任何「內嵌」技術的討論。)

版主: b80203, ghost3401, XO, maa

分享到: Facebook

[教學]_BV() 巨集介紹

文章maa » 週三 4月 27, 2011 4:05 pm

這篇轉載自: http://coopermaa2nd.blogspot.com/2011/04/bv.html

在 C 語言中,我們用 bit operators (位元運算子) 處理位元的運算 (Bitwise operation):
代碼: 選擇全部
PORTC |= 0x01;   // Set bit 0 only

PORTC &= ~0x01;  // Clear bit 0 only

PORTC ^= 0x01;   // Toggle bit 0 only.

PORTC & 0x01;    // Test bit 0 only.

PORTC |= 0x80;   // Set bit 7 only.


使用巨集會讓程式比較清晰易讀。在 avr-libc 函式中有個 _BV() 巨集,它接受一個數值參數而且會轉成適當的 bit mask (位元遮罩)。BV 是 Bit Value 的縮寫。

_BV() 巨集的定義為:
代碼: 選擇全部
#define _BV(x) (1 << x)


這允許我們這樣做:
代碼: 選擇全部
PORTC |= _BV(0);     // Set bit 0 only.

PORTC &= ~_BV(1);    // Clear bit 1 only.

PORTC ^= _BV(7);     // Toggle bit 7 only.


甚至可以進一步結合處理器的腳位定義(Pin defines) 這樣使用:
代碼: 選擇全部
#include <avr/io.h>

USCR0B |= _BV(TXEN0);    // Set bit 3 in UCSR0B only


上列是結合 _BV() 巨集和 TXEN0 來設定 USCR0B 的 bit 3。ATmega128 的 USCR0B 暫存器的定義如下:

圖檔
▲ USCR0B 暫存器 (USART Control and Status Register 0B)

在 <avr/io.h> 有底下這樣的定義,所以 _BV(TXEN0) 就代表 bit 3:
代碼: 選擇全部
// <avr/io.h> has following defines for UCSR0B register
#define TXB80   0
#define RXB80   1
#define UCSZ02  2
#define TXEN0   3
#define RXEN0   4
#define UDRIE0  5
#define TXCIE0  6
#define RXCIE0  7


使用 bit operators,你還可以同時處理多個非連續的位元的運算,像這樣:
代碼: 選擇全部
PORTC |= (_BV(0) | _BV(2) | _BV(7));   // Set bits 0,2,7

PORTC &= ~(_BV(1) | _BV(2) | _BV(6));  // Clear bits 1,2,6

PORTC ^= (_BV(5) | _BV(3));            // Toggle bits 3,5
maa
版面管理員
 
文章: 631
註冊時間: 週一 9月 13, 2004 10:16 am
來自: 縱橫資通能源

回到 內嵌與腳本化(Embedding & Scripting)

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客