凱文 發問時間: 電腦與網際網路程式設計 · 1 0 年前

這是用51執行藍芽的傳輸與接收的程式碼 請幫我翻譯每行的意思

接收端:

接收端有接一個LCD 也是用51去執行

PLAY:

MOV TMOD,#20H

MOV TH1,#0FDH

MOV SCON,#50H

ANL PCON,#07FH

SETB TR1

START:

MOV A,#00H

JNB RI,START

CLR RI

MOV A,SBUF

MOV P2,A

LCD:

RSREGP3.3

R/WREGP3.4

EREGP3.5

COUNTREGR0

ORG00H

MOVPSW,#00H

CALLSET_LCD

START1:

CALLCSR_HOME

MOVCOUNT,#14

MOVDPTR,#STRING

NEXT:

MOVA,#0

MOVCA,@A+DPTR

CALLPUT_DR

CALLDELAY

INCDPTR

DJNZCOUNT,NEXT

SECOND:

MOV TMOD,#20H

MOV TH1,#0FDH

MOV SCON,#50H

ANL PCON,#07FH

SETB TR1

LOOP:

MOV A,#00H

JNB RI,LOOP

CLR RI

MOV A,SBUF

MOV P2,A

JB P3.7,STARTE

CALL DELAY

JMP LOOP

STARTE:

CALLCSR_HOME

MOVCOUNT,#16

MOVDPTR,#STRINGE

NEXTE:

MOVA,#0

MOVCA,@A+DPTR

CALLPUT_DR

CALLDELAY

INCDPTR

DJNZCOUNT,NEXTE

HAPPY:

MOV A,#11111111B

MOV P2,A

JMP HAPPY

SET_LCD:

MOVA,#30H

CALLPUT_IR

CALLDELAY

MOVA,#06H

CALLPUT_IR

CALLDELAY

MOVA,#0EH

CALLPUT_IR

RET

;---------------------------------------------------------------------

CSR_HOME:

MOVA,#01H

CALLPUT_IR

CALLDELAY

MOVA,#02H

CALLPUT_IR

RET

;---------------------------------------------------------------------

PUT_IR:

CALLCHK_BUSY

MOVP1,A

CLRRS

CLRR/W

CLRE

SETBE

CLRE

RET

;---------------------------------------------------------------------

PUT_DR:

CALLCHK_BUSY

MOVP1,A

SETBRS

CLRR/W

CLRE

SETBE

CLRE

RET

;---------------------------------------------------------------------

CHK_BUSY:

MOVP1,#0FFH;

CLRRS

SETBR/W

CLRE

SETBE

BUSY:

JBP1.7,BUSY

CLRE

RET

;---------------------------------------------------------------------

DELAY:

MOVR6,#0

$6:

MOVR5,#0

DJNZR5,$

DJNZR6,$6

RET

;---------------------------------------------------------------------

STRINGDB"SYSTEM IS FINE"

;---------------------------------------------------------------------

STRINGEDB"SYSTEM IS FRIGHT"

END

1 個解答

評分
  • carey
    Lv 4
    1 0 年前
    最佳解答

    PLAY:

    MOV TMOD,#20H ;timer1 autoreload

    MOV TH1,#0FDH ;set timer1=baudrate=9600bps

    MOV SCON,#50H

    ;SCON-bit(7,6)=01(mode 1):set 8 bit data(no parity bit),

    ;SCON-bit(4)=receive enable

    ANL PCON,#07FH ;PCON-bit(7)=0

    :disable double baudrate mode

    SETB TR1 ;start timer 1

    START:

    MOV A,#00H

    JNB RI,START ;branch if no data in from UART

    CLR RI ;SCON-bit(0)

    ;clear receive data in flag,以便下次有資料才可再進來.

    MOV A,SBUF ;取 UART 的資料

    MOV P2,A ;將 UART 資料輸出到 port2

    LCD: ;LCD hardware define

    RS REG P3.3 ;define RS=P3.3

    R/W REG P3.4 ;define R/W=P3.4

    E REG P3.5 ;define E=P3.5

    COUNT REG R0 ;define COUNT=R0

    ORG 00H

    MOV PSW,#00H;clear STATUS register

    CALL SET_LCD;call SET_LCD 副程式(設定 LCD)

    START1:

    CALL CSR_HOME ;Cursor 歸位

    MOV COUNT,#14 ;COUNT=14

    MOV DPTR,#STRING ;get STRING 位址指標

    NEXT:

    MOV A,#0

    MOVC A,@A+DPTR;取 STRING 第一個字

    CALL PUT_DR ;丟資料到 LCD

    CALL DELAY ;delay,因 LCD 處理資料需時間 

    INC DPTR ;位址指標加一

    DJNZ COUNT,NEXT

    SECOND: ;同 PLAY省略

    LOOP:MOV A,#00H

    JNB RI,LOOP ;branch if no data in from UART

    CLR RI;SCON-bit(0)

    ;clear receive data in flag,以便下次有資料才可再進來.

    MOV A,SBUF ;取 UART 的資料

    MOV P2,A ;將 UART 資料輸出到 port2

    JB P3.7,STARTE ;branch if P3.7=1 to STARTE

    CALL DELAY

    JMP LOOP ;goto LOOP 持續 抓資料

    STARTE: ;同 START1 省略

    ;

    HAPPY:

    MOV A,#11111111B

    MOV P2,A ;設 P2 為輸入

    JMP HAPPY ;結束 死迴圈

    ;根據不同的 LCD 有不同的設定方式

    SET_LCD:

    MOV A,#30H

    CALL PUT_IR ;將 IR 暫存器放 30h

    CALL DELAY

    MOVA,#06H

    CALL PUT_IR ;IR=06h

    CALL DELAY

    MOV A,#0EH

    CALL PUT_IR ;IR=0Eh

    RET

    CSR_HOME: ;讓 Cursor 歸位

    MOV A,#01H

    CALL PUT_IR ;IR=01

    CALL DELAY

    MOV A,#02H

    CALL PUT_IR ;IR=02

    RET

    ;

    PUT_IR:

    CALL CHK_BUSY ;check LCD busy or not

    MOV P1,A ;put data to LCD data pin

    CLR RS ; RS=0

    CLR R/W ;R/W=0 ,Write mode

    CLR E

    SETB E ;E=1 ;enable LCD

    CLR E

    RET;

    PUT_DR:

    CALLCHK_BUSY

    MOVP1,A

    SETBRS

    CLRR/W

    CLRE

    SETBE

    CLRE

    RET;

    CHK_BUSY:MOV P1,#0FFH;P1 input

    CLR RS ;RS=0

    SETB R/W ;R/W=1 for read mode

    CLR E

    SETB E ; E=1 for enable

    BUSY:JB P1.7,BUSY ;P1.7=1 means LCD busy

    CLR E ;E=0 //disable LCD//

    RET;

    DELAY: ;delay 131ms

    MOV R6,#0

    $6:MOV R5,#0

    DJNZ R5,$ ;256*2us=512us

    DJNZR6,$6 ;0.512ms*256=131ms

    RET

    END

    2007-10-25 09:15:02 補充:

    由於回答字數有限制,相同的程式就去掉(真辛苦,一直顯示超過字數)

    參考資料: me, me
還有問題?馬上發問,尋求解答。