CSEG AT 0
LJMP Reset
temp_2 SEGMENT CODE
RSEG Temp_2
USING 0
Reset:
LCALL LCD_INIT
LCALL DELAY4
MOV DPTR,#TAB1B ;显示汉字和字符 MOV LCD_COM,#81H ;第1行起始地址
LCALL LCD_WRI
LCALL DISP_STR_LOOP
LCD_INIT:
LCALL DELAY5
MOV LCD_COM,#30H ;功能设置,基本指令集
CALL LCD_WRI ;调用写指令子程序
MOV LCD_COM,#0cH ;显示开,光标关,反白关
CALL LCD_WRI
MOV LCD_COM,#01H ;清屏并将DDRAM的地址计数器(AC)归零
CALL LCD_WRI
MOV LCD_COM,#06H ;光标向右移动,AC+1
CALL LCD_WRI
RET
;==========================================================;
;MCU写指令到LCD子程序 (RS=0、RW=0)
;==========================================================;
LCD_WRI:
MOV A,#11111000B ;
LCALL LCD_SEND
MOV A,LCD_COM
ANL A,#0F0H ;低4位清0传送高4位
LCALL LCD_SEND
MOV A,LCD_COM
SWAP A ;高低半字节交换
ANL A,#0F0H ;低4位清0传送低4位
LCALL LCD_SEND
LCALL DELAY1
RET
;==========================================================;
;MCU写数据到LCD (RS=1 RW=0)
;==========================================================;
LCD_WRD:
MOV A,#11111010B
LCALL LCD_SEND
MOV A,LCD_WDAT ;要发送的数据给A
ANL A,#0F0H ;屏蔽低4位传送数据高4位
LCALL LCD_SEND
MOV A,LCD_WDAT
SWAP A
ANL A,#0F0H ;传送数据低4位
LCALL LCD_SEND
LCALL DELAY1
RET
;==========================================================;
;读LCD(BF)(AC)指令到MCU (RS=0 RW=1)
;数据在LCD_RDAT中.
;==========================================================;
LCD_RRI:
MOV A,#11111100B ;读取LCD忙碌标志
CALL LCD_SEND
CALL LCD_RECEIVE
MOV LCD_RIDAT,A ;接收高4位数据
CALL LCD_RECEIVE ; 接收低4位数据
ANL A,#0F0H ;屏蔽低4位
SWAP A ;取低4位
ANL LCD_RIDAT,#0F0H ;取高4位
ORL LCD_RIDAT,A ;组合成完整的数据
RET
;==========================================================;
;LCD发送8BIT的数据(1个字节)
;==========================================================;
LCD_SEND:
MOV R2,#8 ;发送8位(BIT)数据
LCD_SEND1:
CLR LCD_CLK ;时钟端置1
RLC A ;ACC.7给C
MOV LCD_SID,C ;C给串行数据端
SETB LCD_CLK ;时钟端清0
DJNZ R2,LCD_SEND1 ;未完继续
RET
;==========================================================;
;LCD接收8BIT数据(1个字节)
;==========================================================;
LCD_RECEIVE:
MOV R2,#8
LCD_RECEIVE1:
CLR LCD_CLK ;时钟端置1
NOP
NOP
SETB LCD_CLK
MOV C,LCD_SID
RLC A
DJNZ R2,LCD_RECEIVE1
RET
DISP_STR_LOOP:CLR A;
MOVC A,@A+DPTR;
CJNE A,#0,CONT_STR_DISP;
RET
CONT_STR_DISP:MOV LCD_WDAT,A;
LCALL LCD_WRD;
INC DPTR;
LCALL DELAY4;
LJMP DISP_STR_LOOP; |