;                    SMC1602接口程序（MCS51模拟口线方式）
;***************************************************************************
;*  Title : Accessing to LCD-CONTROLLER                                    *
;*  Date :  2000.4.27                                                      *
;*  Support telephone:  0731-4167806,4167808(CHANGSHA SUNMAN)              *
;*  Support fax :0731-4167807  Support E-mail:www@sunman.cn                *
;*  Create by :褚建军(chujianjun),朱长春(zhuchangchun)                     *
;*  DESCRIPTION:This subroutine shows how to write data to LCD-CONTROLLER  *
;***************************************************************************
;连线图: *LCM---8031* *LCM---8031* *LCM------------8031*
;        *DB0---P1.0* *DB4---P1.4* *RS-------------P3.5*
;        *DB1---P1.1* *DB5---P1.5* *RW-------------P3.1*
;        *DB2---P1.2* *DB6---P1.6* *E--------------P3.0*  （参见说明书）
;        *DB3---P1.3* *DB7---P1.7* *VLCD接10K可调电阻到GND*
;注:8031的晶振频率为12MHz
;**************************************************************************
RSPIN   EQU     P3.5
RWPIN   EQU     P3.1
EPIN    EQU     P3.0
XPOS    EQU     20H        ;列方向地址指针（用于LCDPOS子程序）
YPOS    EQU     21H        ;行方向地址指针（用于LCDPOS子程序）
        ORG     0000H
        JMP     START
START:  MOV     SP,#60H
        CLR     EPIN
MAIN:   MOV     R7,#'0'    ;测试主程序
MN_PA:                     ;整屏循环显示"0"到"9"及空格
        CALL    LCDRESET
        MOV     A,R7
        CALL    LCDFILL
        CALL    DELAY400MS
        INC     R7
        MOV     A,R7
        CJNE    A,#'9'+1,MN_PA
        MOV     A,#' '
        CALL    LCDFILL
        CALL    DELAY400MS
        JMP     MAIN
LCDFILL:
        MOV     B,A
        MOV     YPOS,#0
LFL_PB: MOV     XPOS,#0    ;整屏显示A中所代表字符
LFL_PA: MOV     A,B
        CALL    LCDWRITE
        INC     XPOS
        MOV     A,XPOS
        CJNE    A,#16,LFL_PA
        INC     YPOS
        MOV     A,YPOS
        CJNE    A,#2,LFL_PB
        RET

LCDPOS:                        ;设置第(XPOS,YPOS)个字符的DDRAM地址
        PUSH    ACC
        ANL     XPOS,#0FH      ;X位置范围(0到15)
        ANL     YPOS,#01H      ;Y位置范围(0到1)
        MOV     A,YPOS         ;(XPOS,YPOS)对应DDRAM地址
        CJNE    A,#00,LPS_LAY  ;(第一行)X: 第0----15个字符
        MOV     A,XPOS         ;DDRAM:   0----0FH
        JMP     LPS_LAX
LPS_LAY:MOV     A,XPOS         ;(第二行)X: 第0----15个字符
        ADD     A,#40H         ;DDRAM:  40----4FH
LPS_LAX:ORL     A,#80H         ;设置DDRAM地址
        CALL    LCDWC
        POP     ACC
        RET
LCDWRITE:                      ;定位写字符子程序
        CALL    LCDPOS         ;定位显示地址
        CALL    LCDWD          ;写字符
        RET
LCDRESET:                       ;初始化程序
        CALL    DELAY5MS        ;延时15MS
        CALL    DELAY5MS
        CALL    DELAY5MS
        MOV     A,#38H          ;显示模式设置(不检测忙信号)
        CALL    LCDWCN          ;共三次
        CALL    DELAY5MS
        MOV     A,#38H
        CALL    LCDWCN
        CALL    DELAY5MS
        MOV     A,#38H
        CALL    LCDWCN

        MOV     A,#38H          ;显示模式设置(以后均检测忙信号)
        CALL    LCDWC
        MOV     A,#08H          ;显示关闭
        CALL    LCDWC
        MOV     A,#01H          ;显示清屏
        CALL    LCDWC
        MOV     A,#06H          ;显示光标移动设置
        CALL    LCDWC
        MOV     A,#0CH          ;显示开及光标设置
        CALL    LCDWC
        RET
LCDWC:                          ;送控制字子程序(检测忙信号)
        CALL    WAITIDLE
LCDWCN:                         ;送控制字子程序(不检测忙信号)
        CLR     RSPIN           ;RS=0 RW=0 E=高脉冲
        CLR     RWPIN
        MOV     P1,A
        SETB    EPIN
        NOP
        CLR     EPIN
        RET
LCDWD:                              ;写字符子程序
        CALL    WAITIDLE
        SETB    RSPIN               ;RS=1 RW=0 E=高脉冲
        CLR     RWPIN
        MOV     P1,A
        SETB    EPIN
        NOP
        CLR     EPIN
        RET
WAITIDLE:
        PUSH    ACC                 ;正常读写操作之前必须检测LCD控制器状态
        MOV     P1,#0FFH
        CLR     RSPIN               ;RS=0 RW=1 E=高电平
        SETB    RWPIN
        SETB    EPIN
WTD_PA: NOP                         ;DB7:    0  LCD控制器空闲
        JB      P1.7,WTD_PA         ;        1  LCD控制器忙
        CLR     EPIN
        POP     ACC
        RET
DELAY5MS:
        MOV     R1,#25              ;延时子程序(5MS)
DL5_PA: MOV     R2,#100
        DJNZ    R2,$
        DJNZ    R1,DL5_PA
        RET
DELAY400MS:
        MOV     R0,#20              ;延时子程序(400MS)
DL4_PA: MOV     R1,#100
DL4_PB: MOV     R2,#100
        DJNZ    R2,$
        DJNZ    R1,DL4_PB
        DJNZ    R0,DL4_PA
        RET
        END
