Re: [問題] 基本語法問題

看板ASM (組合語言)作者 (先)時間9年前 (2014/12/30 00:36), 編輯推噓5(5020)
留言25則, 2人參與, 最新討論串2/3 (看更多)
剛才舉的例子 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

12/30 08:12, , 1F
很感謝您的解答!!!!!
12/30 08:12, 1F

12/30 08:13, , 2F
再請教一下,若改成 2<<UDRE0
12/30 08:13, 2F

12/30 08:14, , 3F
是否就是 0x02開始左移呢??
12/30 08:14, 3F

12/30 13:06, , 4F
是阿,我自己對這種寫法有點反感,但人家都建好了,那就拿
12/30 13:06, 4F

12/30 13:07, , 5F
來用吧,不用太糾結
12/30 13:07, 5F

12/30 13:08, , 6F
知道他在寫什麼就好
12/30 13:08, 6F

12/30 13:49, , 7F
非常感謝
12/30 13:49, 7F

12/30 16:33, , 8F
再請教一個問題 當我知道 UCSR0A & (1<<UDRE0)
12/30 16:33, 8F

12/30 16:35, , 9F
就是指 UCSR0A的某位元 那While(!(UCSR0A某bit))
12/30 16:35, 9F

12/30 16:36, , 10F
!要如何判斷 原先是1或是0呢?? 不好意思 初學者Q__Q
12/30 16:36, 10F

12/30 16:38, , 11F
UDRE0 初值為1
12/30 16:38, 11F

12/30 16:40, , 12F
所以 他是直接判斷該位初始值,然後若初始值變動 就執行
12/30 16:40, 12F

12/30 16:40, , 13F
請問這樣說法對嗎?
12/30 16:40, 13F

12/30 20:34, , 14F
要如何判斷1或0,請先去查一下AND的真值表
12/30 20:34, 14F

12/30 20:35, , 15F
和0做AND運算,出來的結果一定等於0
12/30 20:35, 15F

12/30 20:35, , 16F
只有1 AND 1 結果才會等於1
12/30 20:35, 16F

12/30 20:35, , 17F
假如UCSR0A = 0xAA ( 0b10101010 )
12/30 20:35, 17F

12/30 20:36, , 18F
UCSR0A & 0x20 = 0x20 ( 0b00100000 )
12/30 20:36, 18F

12/30 20:36, , 19F
假如UCSR0A = 0x55 ( 0b01010101 )
12/30 20:36, 19F

12/30 20:36, , 20F
UCSR0A & 0x20 = 0 ( 0b00000000 )
12/30 20:36, 20F

12/31 13:53, , 21F
m大我還是不太懂耶!!!
12/31 13:53, 21F

12/31 14:03, , 22F
意思就是主要是看datasheet然後找UCSR0A的初值來看嗎?
12/31 14:03, 22F

12/31 14:04, , 23F
UCSR0A的初值是 0b00100000
12/31 14:04, 23F

12/31 14:07, , 24F
又 UDRE0是 bit5 所以他就會知道 UCSR0A&(1<<UDRE0)為1
12/31 14:07, 24F

12/31 14:09, , 25F
應該是這樣哦!!!感謝m大讓我撥雲見日阿!!!
12/31 14:09, 25F
文章代碼(AID): #1KeOCVpY (ASM)
文章代碼(AID): #1KeOCVpY (ASM)