Re: [問題] 很基本~卻想不出~C語法~HI.LOW
※ 引述《fmdjyl (小D(滴))》之銘言:
: 附上程式碼
: #define SET_BIT(io ,bit) ( io |= (1<<bit) )
: //example: SET_BIT(PORTA,0);SET_BIT(DDRA,0);
: #define CLR_BIT(io ,bit) ( io &= ~(1<<bit) )
: //example: CLR_BIT(PORTA,0);CLR_BIT(DDRA,0);
: 想請教 SET_BIT 和 CLR_BIT出來會是1 還是 0呢??
: (看情況應該一個為HI.一個為LOW)
: 先求助大家~~ ><
io |= (1 << bit) → io = io | (1 << bit)
| 是做 or 運算,而 << 是往左 shift 的運算
io &= ~(1 << bit) → io = io & ~(1 << bit)
&是做 and 運算,~是做 not 運算
上面的顏色如果看得很亂,請按「\」就可以變成黑白的
什麼是 or, and, not, shift 這應該不需多言吧?
有疑慮請google找「Bitwise operation」,第一筆維基就有說明
#define SET_BIT(io, bit) ( io |= (1<<bit) )
把 io 的第 bit 個位元設成 1
以它的範例 SET_BIT(PORTA, 0) 來看
就是把 PORTA 的第 0 個 bit 設成 1
XXXXXXXX ←PORTA 原本的值
or 00000001 ←(1 << 0)的結果
===========
XXXXXXX1 ←其他幾個bit都不會改變,只有第0個bit會變成1
那如果是 SET_BIT(DDRA, 5)的話,那就是
XXXXXXXX ←DDRA 原本的值
or 00100000 ←(1 << 5) 的結果
===========
XX1XXXXX ←其他幾個bit都不會改變,只有第5個bit會變成1
#define CLR_BIT(io ,bit) ( io &= ~(1<<bit) )
把IO的第bit個位元變成0,直接舉例
CLR_BIT(PORTA, 0)
XXXXXXXX ←PORTA原本的值
and ~00000001 ←(1 << 0) 的結果
=============
XXXXXXXX ←PORTA原本的值
and 11111110 ←~(1 << 0)的結果
=============
XXXXXXX0 ←PORTA的第0個bit會被設成0
CLR_BIT(DDRA, 5)
XXXXXXXX ←DDRA原本的值
and ~00100000 ←(1 << 5) 的結果
=============
XXXXXXXX ←DDRA原本的值
and 11011111 ←~(1 << 5) 的結果
=============
XX0XXXXX ←DDRA的第5個bit會被設成0
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.35.184.77
※ 編輯: james732 來自: 114.35.184.77 (09/06 12:02)
→
09/06 13:24, , 1F
09/06 13:24, 1F
→
09/06 13:28, , 2F
09/06 13:28, 2F
→
09/06 13:31, , 3F
09/06 13:31, 3F
推
09/06 14:14, , 4F
09/06 14:14, 4F
→
09/06 15:38, , 5F
09/06 15:38, 5F
→
09/06 15:38, , 6F
09/06 15:38, 6F
→
09/06 15:42, , 7F
09/06 15:42, 7F
推
09/06 15:42, , 8F
09/06 15:42, 8F
→
09/06 15:50, , 9F
09/06 15:50, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章