LCD1602显示问题

来源:百度知道 编辑:UC知道 时间:2024/06/18 15:46:41
AT89S51与LCD1602.
往LCD1602里写入ABCDE五个字符,下面的程序有问题.谁能帮改一下呢,改正确了我调试通过就送分.注释后面还有几个问题.辛苦了,谢谢了
ORG 0000H
RS BIT P2.5
RW BIT P2.6
E BIT P2.7

MOV P0,#00000001B ;清屏并光标归位
LCALL WI
MOV P0,#00111000B ;功能设置
LCALL WI
MOV P0,#00001111B ;显示开关控制
LCALL WI
MOV P0,#00000110B ;输入模式设置:文字不动,光标自动右移
LCALL WI

MOV R0,#80H
MOV R1,#41H
START: MOV A,R0
XRL A,#85H
JZ SRET
MOV P0,A
LCALL WI
;MOV P0,'A' ;??('A')?=(#41H)

MOV P0,R1
SETB RS
CLR RW
CLR E
LCALL BF ;??移上行不--这语句只要放在SETB E前就可以
SETB E
INC R0
INC R1
AJMP START
SRET: AJMP $

WI: ;写指令
CLR RS
CLR RW
CLR E
LCALL BF
SETB E
RET

BF: ;检测是否忙
MOV P0,#0FFH ;??删去行吗--删去不好,防止p0有干扰的数据让LCD错读指令了
CLR RS
SETB RW
CLR E ;??删去行吗?只要满足E为高电平不就可以读状态吗?何必要加这一句呢
NOP

RS EQU P3.0 ;决定要传送的是命令还是数据
RW EQU P3.1 ;决定要读还是写,一般写的时候多.
E EQU P3.2 ;时钟信号
ORG 0000H

main:

MOV p1,#00000001B ;清屏
ACALL ENABLE

MOV p1,#00000001B ;清屏
ACALL ENABLE

MOV p1,#00111000B ;设置16*2显示,5*7点阵8位数据口
ACALL ENABLE

MOV p1,#00001100B ;开显示,显示光标光标闪烁
ACALL ENABLE

MOV p1,#00000110B ;读写一个字符地址指针加一,整屏不移动
ACALL ENABLE

LCALL DELAY1
LCALL DELAY1
MOV p1,#080H ;第一行显示起始地址
ACALL ENABLE

MOV dptr,#tab3
LCALL write1
LCALL DELAY1
LCALL DELAY1

mov p1,#0c0h ;第二行显示起始地址
call enable ;调用写指令
mov dptr,#tab2 ;第二行表头位置
call write1 ;调用第二行写子程序
AJMP $

key:
mov a,p2