|
为什么我的液晶显示每个字只有下面的一半。上面一半则显示不出数据
[复制链接]
采用192641的lcd显示芯片,要做一个在几个固定屏幕之间切换的控制
显示主程序如下:
INITLCD: ;开启液晶并从第一行开始显示
CLR LCDCS1 ;3片片选,低电平使能
CLR LCDCS2
CLR LCDCS3
MOV A,#3FH;ON
CLR LCDDI
LCALL WRLCD
MOV A,#0C0H;FIRST LINE
CLR LCDDI
LCALL WRLCD
SETB LCDDI
SETB LCDCS1
SETB LCDCS2
SETB LCDCS3
RET
;-----------------------
;--------------------------
DISPLAY:
PUSH DPH
PUSH DPL
MOV DPTR,#TABVIEW ;用查表方式得到所需要显示的字符
MOV C_VIEW,A
MOV R0,#4 ;12×4的字符阵列,每个字符为16×16点阵
DISPLOOP:
CLR LCDCS1
MOV R1,#4
DISPLOOP2:
LCALL SETDATAADDR ;DIFINE THE X,Y POSITION
;READ THE CHAR
MOV A,C_VIEW ;c_view记录为第几屏
MOVC A,@A+DPTR ;查得要显示的字符
LCALL GETLCDDATA ;根据所要显示的字符查表LCD点阵
INC DPTR
DJNZ R1,DISPLOOP2
SETB LCDCS1 ;关闭左区
CLR LCDCS2 ;开中区
MOV R1,#4
DISPLOOP3: ;对3个区分别进行操作,重复一区动作
LCALL SETDATAADDR
MOV A,C_VIEW
MOVC A,@A+DPTR
LCALL GETLCDDATA
INC DPTR
DJNZ R1,DISPLOOP3
SETB LCDCS2
CLR LCDCS3
MOV R1,#4
DISPLOOP4:
LCALL SETDATAADDR
MOV A,C_VIEW
MOVC A,@A+DPTR
LCALL GETLCDDATA
INC DPTR
DJNZ R1,DISPLOOP4
SETB LCDCS3
DJNZ R0,DISPLOOP
nop
nop
LCALL INITLCD ;液晶内部ram数据输送完毕,从第一行开始显示
POP DPL
POP DPH
RET
;------------------------------
;-----SET LCD DATA ADDR--------
SETDATAADDR: ;设定字符所在显示位置
MOV A,#4
CLR CY
SUBB A,R1
MOV B,#16
MUL AB
ADD A,#040H
MOV C_ADDRY,A ;c_addry指确定光标显示y坐标的8位数据
MOV A,#4
CLR CY
SUBB A,R0
RL A
ADD A,#0B8H
MOV C_ADDRX,A ;c_addrx指确定光标显示x坐标的8位数据
CLR LCDDI
CLR LCDRW
MOV A,C_ADDRX
LCALL WRLCD ;数据传入液晶芯片的程序
NOP
NOP
MOV A,C_ADDRY
LCALL WRLCD
RET
;-------------------------------
;---GET LCD DATA---------------
GETLCDDATA:
PUSH DPH
PUSH DPL
MOV C_LCDDATA,A ;C_LCDDATA存放要显示的字符
MOV A,R0
PUSH ACC
MOV R0,#32 ;一共32个数据组成16×16点阵
MOV DPTR,#TABCHAR
MOV B,C_LCDDATA
MOV A,#32
MUL AB
MOV C_TEMP,B
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A ;到此查的第一个数据的表格起点
LCDDATALOOP:
MOV A,R0
CJNE A,#010H,SETDATA ;第17个数据将从下一行最前开始显示
CLR LCDDI ;液晶di脚
CLR LCDRW ;液晶rw脚
MOV A,C_ADDRX
INC A
MOV C_ADDRX,A
CLR LCDDI
CLR LCDRW
LCALL WRLCD
NOP
NOP
MOV A,C_ADDRY
LCALL WRLCD
NOP
NOP
SETDATA:
MOV A,#0
MOVC A,@A+DPTR
CLR LCDDI
SETB LCDRW
LCALL WRLCD
NOP
NOP
SETB LCDDI
INC DPTR
DJNZ R0,LCDDATALOOP
POP ACC
MOV R0,A
POP DPL
POP DPH
RET
;-----------------------------
;-----------INPUT LCD----------
;该子程序经过实践检验正确
WRLCD: ;PUT A INTO LCD,LCD DATA ADRESS+1 AUTOMATICALLY
CLR LCDEN ;LCD的EN脚,0使能
MOV C,ACC.7
MOV LCDDATA,C
CLR LCDCLK LCDDATA脚与LCDCLK脚通过74hc164芯片与液晶的D0-D7相连,组成串口
SETB LCDCLK
MOV C,ACC.6
MOV LCDDATA,C
CLR LCDCLK
SETB LCDCLK
MOV C,ACC.5
MOV LCDDATA,C
CLR LCDCLK
SETB LCDCLK
MOV C,ACC.4
MOV LCDDATA,C
CLR LCDCLK
SETB LCDCLK
MOV C,ACC.3
MOV LCDDATA,C
CLR LCDCLK
SETB LCDCLK
MOV C,ACC.2
MOV LCDDATA,C
CLR LCDCLK
SETB LCDCLK
MOV C,ACC.1
MOV LCDDATA,C
CLR LCDCLK
SETB LCDCLK
MOV C,ACC.0
MOV LCDDATA,C
CLR LCDCLK
SETB LCDCLK
SETB LCDEN ;LCD的EN脚
NOP
NOP
CLR LCDEN
RET
显示结果每个字只有下面一半,而且坐标向前移动了一个字符的位置,请问是什么原因?
|
|