|
ORG 0000H
RS EQU P2.1;确定具体硬件的连接方式
RW EQU P2.0;确定具体硬件的连接方式
E EQU P2.2;确定具体硬件的连接方式
AJMP START
ORG 0030H
START: MOV SP,#30H
MAIN: LCALL DELAY ;延时一段时间
MOV P0,#01H ;写指令01H,清屏
LCALL ENABLE
MOV P0,#38H ;写指令38H,设定LCD为16*2显示,5*7点阵,8位数据接口
LCALL ENABLE
MOV P0,#0FH ;写指令0FH,显示ON,光标ON,闪烁ON
LCALL ENABLE
MOV P0,#06H ;写指令06H,光标输入方式增量移位
LCALL ENABLE
L1:
MOV P0,#80H ;第一行起始字符地址
LCALL ENABLE
MOV DPTR,#TABLE1 ;第一行显示字符表头地址
LCALL DISP ;显示第一行数据
;MOV P0,#0C0H ;第二行起始字符地址
; LCALL ENABLE
; MOV DPTR,#TABLE2 ;第二行显示字符表头地址
; LCALL DISP ;显示第二行数据
AJMP $ ;返回主程序循环
;-----------------
ENABLE:
CLR RS ;写指令子程序(请参照1602LCD使用说明书)
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;-----------------
DISP: MOV R1,#0FH ;准备显示一行16个字符
LOOP: MOV A,#00H ;将ACC清零
MOVC A,@A+DPTR ;查表取得要显示的数据
LCALL DISP1 ;写入一个数据
INC DPTR ;数据表指针加1,准备取下一个数据
DJNZ R1,LOOP ;一行没有显示完就继续
RET
;-----------------
DISP1:
SETB RS ;写数据时序
CLR RW
CLR E
LCALL DELAY
SETB E
NOP
MOV P0,A ;写1字节数据到显示端口
NOP
CLR E
RET
;-----------------
DELAY: MOV p0,#0FFH ;;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB p0.7,DELAY;;如果p0.7为高电平表示忙就循环等待
RET
TABLE1: DB ' abcdefghijklmn '
TABLE2: DB ' opqrstuvwxyz '
END
运行到查表指令时它会没运行完就跳到下一条指令,如可能查表就到 a ,但下一此它却查到了 o 去了,为什么,程序是不是有问题
|
|