| 复制代码$INCLUDE(STC89.INC)
    ORG                0000H
    LJMP        F_MAIN
    T_TestString: DB "STC89C52RC",0        
        
F_MAIN:
        MOV                SP,#7FH
    LCALL F_LCD1602_Init
        
    MOV   R7,#0
    MOV   R6,#0
        LCALL F_LCD1602_SetShowAddr
    MOV   A,#'A'
        LCALL F_LCD1602_ShowChar
    MOV   A,#'B'
        LCALL F_LCD1602_ShowChar
    MOV   A,#'C'
        LCALL F_LCD1602_ShowChar
        
    MOV   R7,#13
    MOV   R6,#0
        LCALL F_LCD1602_SetShowAddr
    MOV   A,#'E'
        LCALL F_LCD1602_ShowChar
    MOV   A,#'F'
        LCALL F_LCD1602_ShowChar
    MOV   A,#'G'
        LCALL F_LCD1602_ShowChar
        
        
    MOV   R7,#13
    MOV   R6,#1
        LCALL F_LCD1602_SetShowAddr
    MOV   A,#'H'
        LCALL F_LCD1602_ShowChar
    MOV   A,#'I'
        LCALL F_LCD1602_ShowChar
    MOV   A,#'J'
        LCALL F_LCD1602_ShowChar
        
    MOV   R7,#0
    MOV   R6,#1
        LCALL F_LCD1602_SetShowAddr
        MOV   DPTR,#T_TestString
        LCALL F_LCD1602_ShowString
        
L_LOOP:        
        SJMP        L_LOOP
        
DELAY100MS:                        ;@11.0592MHz
        PUSH        30H
        PUSH        31H
        MOV                30H,#180
        MOV                31H,#68
NEXT:
        DJNZ        31H,NEXT
        DJNZ        30H,NEXT
        POP                31H
        POP                30H
        RET
;引脚定义
LCD1602_RS    EQU P3.5 
LCD1602_RW    EQU P3.6 
LCD1602_EN    EQU P3.4 
LCD1602_DATA  EQU P0        
; 功能描述: LCD1602 读取状态
; 入口参数:
; 出口参数: A: 状态 
; 影响资源: 
; 堆栈需求:
; 示   例1: 
F_LCD1602_ReadState:
    MOV   LCD1602_DATA,#0FFH ;释放数据总线
    CLR   LCD1602_RS
    SETB  LCD1602_RW
    ;>30nS
    SETB  LCD1602_EN         ;TA
    ;>100nS
    MOV   A,LCD1602_DATA
    CLR   LCD1602_EN         ;TB
    ;TA + TB = >400nS
        RET
; 功能描述: LCD1602 写入命令
; 入口参数: A: 命令
; 出口参数:  
; 影响资源: 
; 堆栈需求:
; 示   例1: 
F_LCD1602_WriteCmd:
        PUSH  ACC
    L_LCD1602_WriteCmd_CheckBusy:
        LCALL F_LCD1602_ReadState        
        ANL   A,#80H
        JNZ   L_LCD1602_WriteCmd_CheckBusy ;检测 1602 液晶如果忙,等待
        POP   ACC
        
        CLR   LCD1602_RS
        CLR   LCD1602_RW
        MOV   LCD1602_DATA,A 
        ;>40nS
        SETB  LCD1602_EN     
        ;>150nS
        CLR   LCD1602_EN     
        ;1->0->1: >400nS
        RET        
        
; 功能描述: LCD1602 写入数据
; 入口参数: A: 数据
; 出口参数:  
; 影响资源: 
; 堆栈需求:
; 示   例1:
F_LCD1602_WriteData:
        PUSH  ACC 
    L_LCD1602_WriteData_CheckBusy:
        LCALL F_LCD1602_ReadState        
        ANL   A,#80H
        JNZ   L_LCD1602_WriteData_CheckBusy ;检测 1602 液晶如果忙,等待
        POP   ACC
        
        SETB  LCD1602_RS
        CLR   LCD1602_RW
        MOV   LCD1602_DATA,A 
        ;>40nS
        SETB  LCD1602_EN     
        ;>150nS
        CLR   LCD1602_EN     
        ;1->0->1: >400nS
        RET        
; 功能描述: LCD1602 初始化
; 入口参数: 
; 出口参数:  
; 影响资源: 
; 堆栈需求:
; 示   例1:
F_LCD1602_Init:
        CLR   LCD1602_EN
        LCALL DELAY100MS
        MOV   A,#38H             ;设置16*2显示,5*7点阵,8位数据接口
        LCALL F_LCD1602_WriteCmd
        MOV   A,#0CH             ;开显示
        LCALL F_LCD1602_WriteCmd
        MOV   A,#06H             ;读写一字节后地址指针加1
        LCALL F_LCD1602_WriteCmd        
        MOV   A,#01H             ;清除显示
        LCALL F_LCD1602_WriteCmd
        RET
; 功能描述: LCD1602 设置显示地址
; 入口参数: R7: X 显示横坐标(向右为正方向) 0...16
;           R6: Y 显示纵坐标(向下为正方向) 0..1 
; 出口参数:  
; 影响资源: 
; 堆栈需求:
; 示   例1:  
F_LCD1602_SetShowAddr:
        PUSH  ACC 
    MOV   A,#80H
        CJNE  R6,#1,L_LCD1602_SetShowAddr_Y0
        ADD   A,#40H
    L_LCD1602_SetShowAddr_Y0:
        ADD   A,R7
        LCALL F_LCD1602_WriteCmd
        POP   ACC
        RET
; 功能描述: LCD1602 显示字符
; 入口参数: A: 字符
; 出口参数:  
; 影响资源: 
; 堆栈需求:
; 示   例1:
F_LCD1602_ShowChar:
    LCALL F_LCD1602_WriteData 
        RET
        
; 功能描述: LCD1602 显示字符串
; 入口参数: DPTR: 字符串地址
; 出口参数:  
; 影响资源: 
; 堆栈需求:
; 示   例1: 
F_LCD1602_ShowString:
        PUSH  ACC 
        L_LCD1602_ShowString_Check:
    CLR   A
    MOVC  A,@A+DPTR                  ;获取当前字符
    JZ    L_LCD1602_ShowString_Exit  ;检查字符串的末尾
    INC   DPTR                       ;递增字符串指针
    LCALL F_LCD1602_WriteData        ;发送当前字符
    SJMP  L_LCD1602_ShowString_Check ;检查下一步
    L_LCD1602_ShowString_Exit:
        POP   ACC
        RET
END
 
 
 |