全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:869
推到 Plurk!
推到 Facebook!

程式是否打錯了(LCD模組介面)

缺席
基電之神
一般會員


發表:1
回覆:0
積分:0
註冊:2005-06-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-21 20:52:47 IP:61.223.xxx.xxx 未訂閱
各為大大能幫我看看程式哪裡出錯了.小弟試過很多次都無法編譯成功
        MACDELIM 
;--------------------------------------------------------------------
PRINTF6_LCD MACRO STRING ;印出字串到LCD,格式('STRING'),從游標處開始
        PUSH    DPH
        PUSH    DPL
        MOV     DPTR,#$TRRR#
        CALL    STRING1_LCD
        JMP     $OVER#
$TRRR#  DB     ($OVER#-$-1),STRING
$OVER#  POP     DPL
        POP     DPH
        ENDM
;--------------------------------------------------------------------
XY_LCD  MACRO  X,Y             ;LCD 游標停在第X列第Y 1個位置
        PUSH    ACC
        MOV     A,#COLUMN_|X| |Y
        CALL    COMMAND_LCD
        POP     ACC
        ENDM
;--------------------------------------------------------------------
XY_PRINTF_LCD   MACRO  X,Y,STRING      ;設定游標位置,印出字串到LCD
        XY_LCD  X,Y
        PRINTF6_LCD (STRING)
        ENDM
;--------------------------------------------------------------------
COLUMN_1 EQU   80H     ;LCD 第一列第一個位置
COLUMN_2 EQU   C0H     ;LCD 第二列第一個位置    RS_LCD  REG    P2.2
RW_LCD  REG    P2.1
E_LCD   REG    P2.0
BUS_LCD REG    P1
;====================================================================
        .ORG    00H
        JMP     START    ;--------------------------------------------------------------------      
START   MOV     SP,#50H         ;設定堆疊區
        CALL    INITIAL_LCD     ;LCD 初始化
BEGIN
        CALL        DELAY
        XY_PRINTF_LCD 1,0,("Yuen chen")
        XY_PRINTF_LCD 2,0,("Welcom !") 
        CALL        DELAY
        CALL    CLEAR_LCD
        JMP        BEGIN
;=====================================================================
DELAY                           ;延遲0.5秒程式
        MOV     R4,#200                ;1           (ARG0=200)
DELAY1$ MOV     R5,#249          ;1*ARG0      (ARG1=249)
DELAY2$
        NOP                      ;1*ARG0*ARG1
        NOP                      ;1*ARG0*ARG1
        NOP                      ;1*ARG0*ARG1
        NOP                      ;1*ARG0*ARG1
        NOP                      ;1*ARG0*ARG1
        NOP                      ;1*ARG0*ARG1
        NOP                      ;1*ARG0*ARG1
        NOP                      ;1*ARG0*ARG1
        DJNZ    R5,DELAY2$        ;2*ARG0*ARG1
        
        NOP                        ;1*ARG0
        NOP                        ;1*ARG0        
        NOP                        ;1*ARG0        
        NOP                        ;1*ARG0        
        NOP                        ;1*ARG0        
        NOP                        ;1*ARG0        
        NOP                        ;1*ARG0
        DJNZ    R4,DELAY1$        ;2*ARG0
        RET                        ;2
;5 10*ARG0 10*ARG0*ARG1=??? uS       
;5 10*200 10*200*249=500005 uS 
;===============================================================
CHKBUSY_LCD                     ;檢查 LCD 忙碌旗標
        PUSH    ACC
        SETB    BUS_LCD.7
CHK_$   CLR     RS_LCD
        SETB    RW_LCD
        SETB    E_LCD
        NOP
        MOV     A,BUS_LCD
        CLR     E_LCD
        JB      ACC.7,CHK_$     ;檢查忙碌位元
        POP     ACC
        RET
;--------------------------------------------------------------------
COMMAND_LCD                     ;寫命令到 LCD
        CALL    CHKBUSY_LCD     ;檢查忙碌旗標
        MOV     BUS_LCD,A
        CLR     RS_LCD
        CLR     RW_LCD
        SETB    E_LCD
        NOP
        CLR     E_LCD
        RET
;--------------------------------------------------------------------
WRITE_LCD                       ;寫字元到 LCD
        CALL    CHKBUSY_LCD     ;檢查忙碌旗標
        MOV     BUS_LCD,A
        SETB    RS_LCD
        CLR     RW_LCD
        SETB    E_LCD
        NOP
        CLR     E_LCD
        RET
;--------------------------------------------------------------------
INITIAL_LCD                     ;執行 LCD 初始化工作
        PUSH    ACC
        MOV     A,#38H          ;功能設定
        CALL    COMMAND_LCD
        MOV     A,#38H          ;功能設定
        CALL    COMMAND_LCD
        MOV     A,#38H          ;功能設定
        CALL    COMMAND_LCD
        MOV     A,#38H          ;功能設定
        CALL    COMMAND_LCD
        MOV     A,#0DH          ;顯示器控制:游標不顯示,但是字會閃爍
        CALL    COMMAND_LCD
        MOV     A,#01H          ;清除顯示器
        CALL    COMMAND_LCD
        MOV     A,#06H          ;進入模式設定
        CALL    COMMAND_LCD
        POP     ACC
        RET
;--------------------------------------------------------------------
CLEAR_LCD                       ;清除 LCD 的顯示器
        PUSH    ACC
        MOV     A,#01H          ;清除顯示器
        CALL    COMMAND_LCD
        POP     ACC
        RET
;--------------------------------------------------------------------
STRING1_LCD                     ;印出字串到 LCD,(COUNT,'STRING')
        PUSH    B               ;DPTR 不改變, 字串數最大為 256 字.
        PUSH    DPH
        PUSH    DPL
        PUSH    ACC            MOV     A,#00H
        MOVC    A,@A DPTR       ;取得要顯示的字數
        MOV     B,A
        INC     DPTR            ;指向第一個要顯示的字元位址
LOOP$   MOV     A,#00H
        MOVC    A,@A DPTR       ;取得要顯示的字元
        CALL    WRITE_LCD
        INC     DPTR            ;指向下一個位址
        DJNZ    B,LOOP$            POP     ACC
        POP     DPL
        POP     DPH
        POP     B
        RET
;--------------------------------------------------------------------
        END    
發表人 - 基電之神 於 2005/06/21 23:01:10 發表人 - 基電之神 於 2005/06/21 23:02:57 發表人 - 基電之神 於 2005/06/21 23:05:41
編輯記錄
 重新編輯於 2007-04-25 14:13:55, 註解 無‧

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-21 22:38:16 IP:220.134.xxx.xxx 未訂閱
po程式碼請縮排.不知如何做請參考版規. 煩請修改配合!謝謝!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
系統時間:2024-05-17 23:08:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!