音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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 欄目:單片機
大家?guī)臀铱纯催@段C51,能不能用匯編這么寫

功能應(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
我看到的問題...
; 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
很感謝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
另外
我最不清楚就是這句了
; 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
!和&&
 
6樓: >>參與討論
yitian81
!和&&是邏輯運算符
!和&&是邏輯運算符,它們的結(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
哦,我明白了,謝謝了
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請教有關(guān)74hc244的問題
C語言中的難點
89C52I/O口輸出狀態(tài),求救!急…………
我是一名即將畢業(yè)的大四生,我想搞技術(shù)......
簡單程序,為什么老通不過編譯呢?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號