|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
大家?guī)臀铱纯催@段C51,能不能用匯編這么寫 |
| 作者:Hsb_yq 欄目:單片機 |
功能應(yīng)該就是對特殊寄存器UEPSTAX的位操作和狀態(tài)查詢,我對C51不熟,請大家指點! /* MCU AT89C51SND1C */ /* USB CONTROLLER */ Sfr (UEPSTAX , 0xCE); /* 不可位尋址 */ /* USB */ #define MSK_TXCMPL 0x01 /* UEPSTAX.0 */ #define MSK_RXOUTB0 0x02 /* UEPSTAX.1 */ #define MSK_RXSETUP 0x04 /* UEPSTAX.2 */ #define MSK_STALLED 0x08 /* UEPSTAX.3 */ #define MSK_TXRDY 0x10 /* UEPSTAX.4 */ #define MSK_STALLRQ 0x20 /* UEPSTAX.5 */ #define MSK_RXOUTB1 0x40 /* UEPSTAX.6 */ #define MSK_DIR 0x80 /* UEPSTAX.7 */ UEPSTAX &= ~MSK_RXSETUP; while (!(UEPSTAX & MSK_RXSETUP)) { UEPSTAX |= MSK_STALLRQ; /* send stall */ while ((!(UEPSTAX & MSK_STALLED)) && (UEPSTAX & MSK_RXSETUP)); UEPSTAX &= ~MSK_STALLED; UEPSTAX &= ~MSK_STALLRQ; } UEPSTAX &= ~MSK_DIR; /* set in on EP0 */ 我改的匯編是: ANL UEPSTAX,#0FBH MOV A,UEPSTAX JB ACC.2,NEXT1 ORL UEPSTAX,#MSK_STALLRQ ; send stall WAIT: MOV A,UEPSTAX JB ACC.2,WAIT ANL UEPSTAX,#0D7H NEXT1: ANL UEPSTAX,#7FH ; set in on EP0 主要是這句 while ((!(UEPSTAX & MSK_STALLED)) && (UEPSTAX & MSK_RXSETUP)); 不太了解 |
| 2樓: | >>參與討論 |
| 作者: gbchang 于 2005/6/14 19:05:00 發(fā)布:
我看到的問題... ; 1. ANL UEPSTAX,#0FBH ; #0FBH = 1111 1011,結(jié)果UEPSTAX.2必然為0,另外盡量用符號常量,不要直接尋址 MOV A,UEPSTAX JB ACC.2,NEXT1 ; 是一個廢代碼 ; 2. ;" while (!(UEPSTAX & MSK_RXSETUP)) "怎么沒有? anl a,#MSK_RXSETUP jnz NEXT1 ; 3. ; while ((!(UEPSTAX & MSK_STALLED)) && (UEPSTAX & MSK_RXSETUP)); ; 兩個條件都滿足是時等待:A. UEPSTAX & MSK_STALLED等0,即UEPSTAX.3=0 ; B. UEPSTAX & MSK_RXSETUP不等0,即UEPSTAX.2=1 WAIT: MOV A,UEPSTAX mov b,a ; JB ACC.2,WAIT ; 只是其中一個條件,先不能跳轉(zhuǎn),另外盡量用符號常量,不要直接尋址 anl a,MSK_STALLED Jnz WAIT_end ; 只要其中一個條件不滿足就跳出等待. mov a,b anl a,MSK_RXSETUP Jz WAIT_end ; 只要其中一個條件不滿足就跳出等待. ljmp WAIT wait_end: ; 4. ; UEPSTAX &= ~MSK_STALLED; /*不要對輸出口連續(xù)的賦不同的值,中間有抖動的.*/ ; UEPSTAX &= ~MSK_STALLRQ; /*最好先算得結(jié)果,然后一次賦出.*/ ; ANL UEPSTAX,#0D7H ; 實現(xiàn)了目的,但盡量用符號常量,不要直接尋址 ; A與/B與/C 等于 /(/A或B或C) (布爾代數(shù)) xrl UEPSTAX,#0ffh orl UEPSTAX,MSK_STALLED orl UEPSTAX,MSK_STALLRQ xrl UEPSTAX,#0ffh NEXT1: ANL UEPSTAX,#7FH ; set in on EP0 * - 本貼最后修改時間:2005-6-15 9:01:44 修改者:gbchang |
|
| 3樓: | >>參與討論 |
| 作者: Hsb_yq 于 2005/6/15 8:52:00 發(fā)布:
很感謝gbchang這么細心的幫我看,我還有些不明白 C51是的代碼是ATMEL的公版軟件,USB驅(qū)動部分的,之前是用函數(shù)的,但因為函數(shù)里都是單條指令,為了大家看起來沒那么煩,我就把指令直接移過來了。 UEPSTAX &= ~MSK_RXSETUP; while (!(UEPSTAX & MSK_RXSETUP)) 我想應(yīng)該是將RXSETUP位清除,然后查詢 ANL UEPSTAX,#0FBH MOV A,UEPSTAX JB ACC.2,NEXT1 ;這個查詢看起來是多余,但我因為還不是很明白USB的硬件,或僅僅是一種冗余指令,為了確保不出錯,我只是他原來有,就照譯了,呵呵 |
|
| 4樓: | >>參與討論 |
| 作者: Hsb_yq 于 2005/6/15 9:18:00 發(fā)布:
另外 我最不清楚就是這句了 ; while ((!(UEPSTAX & MSK_STALLED)) && (UEPSTAX & MSK_RXSETUP)); ; 兩個條件都滿足是時等待:A. UEPSTAX & MSK_STALLED等0,即UEPSTAX.3=0 ; B. UEPSTAX & MSK_RXSETUP不等0,即UEPSTAX.2=1 我看的書好像不能起到這個作用,似乎位運算符 & 并不改變參與運算的變量的值,也就是UEPSTAX & MSK_STALLED的值是不是等于 0000X000B,而UEPSTAX不變?如果是,我就更不明白了,那((!(UEPSTAX & MSK_STALLED)) 應(yīng)該就是1111X111B,而(UEPSTAX & MSK_RXSETUP)是00000X00B,X為任意,于是 1111 X111 && 0000 0X00 = 0000 0X00 ? 這就是為什么我想不通,我的理解是(!(UEPSTAX & MSK_STALLED)似乎只是為了得到一個效果,就是讓 1111 X111 中的值.2=1,而不是值.3,因為看結(jié)果似乎只是查詢位2的狀態(tài),所以我就寫成 WAIT: MOV A,UEPSTAX JB ACC.2,WAIT 我不知道怎么想對不對,希望大家?guī)兔χ刚?br> |
|
| 5樓: | >>參與討論 |
| 作者: yitian81 于 2005/6/15 9:41:00 發(fā)布:
!和&& |
|
| 6樓: | >>參與討論 |
| 作者: yitian81 于 2005/6/15 9:57:00 發(fā)布:
!和&&是邏輯運算符 !和&&是邏輯運算符,它們的結(jié)果只有0(假)和1(真)兩種.如果UEPSTAX & MSK_STALLED的值等于 0000X000B,那!(UEPSTAX & MSK_STALLED)的值就要看這個X了,若X=1,因為(UEPSTAX & MSK_STALLED)>0,所以!(UEPSTAX & MSK_STALLED)的值為假,即等于0。同理若X=0,!(UEPSTAX & MSK_STALLED)的值為真(等于1).!不是取反操作.&&運算符也是這樣的道理,1111 X111 && 0000 0X00的值就決定于X的值,1111X111已經(jīng)大于0(真),X=0,則1111 X111 && 0000 0X00=0,X=1,則1111 X111 && 0000 0X00=1。 |
|
| 7樓: | >>參與討論 |
| 作者: Hsb_yq 于 2005/6/16 7:58:00 發(fā)布:
哦,我明白了,謝謝了 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |