看板 ASM 關於我們 聯絡資訊
剛才舉的例子 while ( !( UCSR0A & (1<<UDRE0)) ); 目的只是檢查UCSR0A 第n個Bit是否等於1 假設UDRE0 = 5 1<<UDRE0的意思就是0x01左移5次(0b00100000) 寫成下面這樣也是可以的 while ( !( UCSR0A & 0x20) ); 只是習慣罷了 ---------------------------------------------- EX: #define Flag0 0x01<<0 //0b00000001 #define Flag1 0x01<<1 //0b00000010 #define Flag2 0x01<<2 //0b00000100 #define Flag3 0x01<<3 //0b00001000 #define Flag4 0x01<<4 //0b00010000 #define Flag0 0x01 #define Flag1 0x02 #define Flag2 0x04 #define Flag3 0x08 #define Flag4 0x10 ---------------------------------------------- ※ 引述《papaya125 (都你說就好了)》之銘言: : 各位好 : 請教一下 : 目前學習AVR中,經常看到 1<<A 這樣的語句 : EX: : while ( !( UCSR0A & (1<<UDRE0)) ); : 翻書跟GOOGLE都查詢過了....不知是不是太基本都沒有說明 : 如果是A>>1 , 那就是右移1格 : 但是反過來呢?? 是指 UDRE0至位1嗎?? : 懇請幫忙解惑~~~ -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.7.173 ※ 文章網址: http://www.ptt.cc/bbs/ASM/M.1419871007.A.CE2.html
papaya125: 很感謝您的解答!!!!! 12/30 08:12
papaya125: 再請教一下,若改成 2<<UDRE0 12/30 08:13
papaya125: 是否就是 0x02開始左移呢?? 12/30 08:14
maxpower: 是阿,我自己對這種寫法有點反感,但人家都建好了,那就拿 12/30 13:06
maxpower: 來用吧,不用太糾結 12/30 13:07
maxpower: 知道他在寫什麼就好 12/30 13:08
papaya125: 非常感謝 12/30 13:49
papaya125: 再請教一個問題 當我知道 UCSR0A & (1<<UDRE0) 12/30 16:33
papaya125: 就是指 UCSR0A的某位元 那While(!(UCSR0A某bit)) 12/30 16:35
papaya125: !要如何判斷 原先是1或是0呢?? 不好意思 初學者Q__Q 12/30 16:36
papaya125: UDRE0 初值為1 12/30 16:38
papaya125: 所以 他是直接判斷該位初始值,然後若初始值變動 就執行 12/30 16:40
papaya125: 請問這樣說法對嗎? 12/30 16:40
maxpower: 要如何判斷1或0,請先去查一下AND的真值表 12/30 20:34
maxpower: 和0做AND運算,出來的結果一定等於0 12/30 20:35
maxpower: 只有1 AND 1 結果才會等於1 12/30 20:35
maxpower: 假如UCSR0A = 0xAA ( 0b10101010 ) 12/30 20:35
maxpower: UCSR0A & 0x20 = 0x20 ( 0b00100000 ) 12/30 20:36
maxpower: 假如UCSR0A = 0x55 ( 0b01010101 ) 12/30 20:36
maxpower: UCSR0A & 0x20 = 0 ( 0b00000000 ) 12/30 20:36
papaya125: m大我還是不太懂耶!!! 12/31 13:53
papaya125: 意思就是主要是看datasheet然後找UCSR0A的初值來看嗎? 12/31 14:03
papaya125: UCSR0A的初值是 0b00100000 12/31 14:04
papaya125: 又 UDRE0是 bit5 所以他就會知道 UCSR0A&(1<<UDRE0)為1 12/31 14:07
papaya125: 應該是這樣哦!!!感謝m大讓我撥雲見日阿!!! 12/31 14:09