;***************************lcd使用说明*************************************
;4脚-RS为寄存器选择(E2)、5脚-RW为读写信号线(E1)、6脚-E端为使能端(E0),C口为数据
;1接GND,2接VDD,3接VL,7~14数据线,15脚BLA,16脚BLK
;******************************************************************************
LIST P=16F877A
#INCLUDE<P16F877A.INC>
ACC EQU 45H
ACD EQU 46H
;----------------------------------------------------------------------
ORG 00H
NOP
GOTO MAIN
MAIN
BANKSEL TRISC
MOVLW 07H
MOVWF ADCON1 ;将E口设置为数字引脚
CLRF TRISC ;定义数据口为D口,为输出
CLRF TRISE ;定义E口为控制,RE0为RS、RE1为R/W、RE2为E
BANKSEL PORTC
;----------------------------------------------------------------------
CALL INIT ;
CALL CHECK_BUSY
BCF PORTE,2 ;RS=0 写命令
MOVLW 80H ;80H地址是定义在第一行显示
MOVWF ACC
CALL WRITE
CALL CHECK_BUSY
BSF PORTE,2 ;RS=1 写数据
MOVLW 54H ;送入一个字符'T'的ASCII值
MOVWF ACC
CALL WRITE
CALL CHECK_BUSY
BCF PORTE,2 ;RS=0 写命令
MOVLW 0C0H ;C0H地址定义在第二行显示
MOVWF ACC
CALL WRITE
CALL CHECK_BUSY
BSF PORTE,2 ;RS=1 写数据
MOVLW 74h ;送入一个字符't'的ASCII值
MOVWF ACC
CALL WRITE
;-------------------------------------------------------------------
nop
GOTO $-1
;================LCD初始化===============================
INIT
CALL DELAYLCD10MS
BCF PORTE,2 ;RS=0
MOVLW 38H ;显示模式设置5*7点阵,8位数据,16*2显示
MOVWF ACC
CALL WRITE
CALL DELAYLCD10MS
;CALL CHECK_BUSY
BCF PORTE,2 ;RS=0
MOVLW 38H
MOVWF ACC
CALL WRITE
CALL CHECK_BUSY
BCF PORTE,2 ;RS=0
MOVLW 0FH ;D=1开显示,C=1开光标,B=1光标闪烁 (00001DCB)
MOVWF ACC ;D=0关显示,C=0关光标,B=0光标不闪烁(00001DCB)
CALL WRITE
CALL CHECK_BUSY
BCF PORTE,2 ;RS=0
MOVLW 06H ;显示光标移动位置(000001NS)
MOVWF ACC
CALL WRITE
CALL CHECK_BUSY
BCF PORTE,2 ;RS=0
MOVLW 01H ;01H显示清屏,02H显示回车
MOVWF ACC
CALL WRITE
RETURN
;=============检查忙信号======================
CHECK_BUSY
BCF PORTE,2
BSF PORTE,1
BANKSEL TRISC
MOVLW 0FFH ;定义C口为LCD的输入
MOVWF TRISC
BANKSEL PORTC
BSF PORTE,0 ;E=1 (使能)
NOP
MOVF PORTC,0
MOVWF ACD
BCF PORTE,0 ;E=0(E由高电平跳变成低电平时,液晶模块执行命令)
BTFSC ACD,7 ;读写检测(1禁止,0允许)
GOTO CHECK_BUSY
CALL DELAYLCD10MS
BANKSEL TRISC
CLRF TRISC ;又重新定义C口为单片机的输出
BANKSEL PORTC
RETURN
;===========写操作==========================
WRITE
MOVF ACC,0
MOVWF PORTC
BCF PORTE,1 ;R/W=0
;(RS=0、R/W=0 时写入命令)、(RS=1、R/W=0 时写入数据)
BSF PORTE,0 ;E=1 (使能)
NOP
BCF PORTE,0 ;E=0 (E由高电平跳变成低电平时,液晶模块执行命令)
RETURN
;=============================================
DELAYLCD10MS
MOVLW D'13'
MOVWF 47H
LOP1
MOVLW D'255'
MOVWF 48H
LOP2
DECFSZ 48H,1
GOTO LOP2
DECFSZ 47H,1
GOTO LOP1
RETURN
;---------------------------------------------------------------------------
END