51单片机驱动1602初始化问题(汇编)
程序在硬件能成功初始化,仿真时初始化不成功,停留在如图状态,1602一直处于忙状态(P0.7一直为高电平),求高人指点,最好能写出优化后的程序!谢谢~相关程序段如下:OR...
程序在硬件能成功初始化,仿真时初始化不成功,停留在如图状态,1602一直处于忙状态(P0.7一直为高电平),求高人指点,最好能写出优化后的程序!谢谢~
相关程序段如下:
ORG 0000H
SJMP MAIN
ORG 000BH
LJMP TIME
ORG 0020H
MAIN: MOV SP,#60H;设置堆栈 60H
CALL D10MS ;D10MS延时10ms
MOV A,#38H ;初始化LCD
CALL XIEZL0
CALL D10MS
CALL XIEZL
MOV A,#08H
CALL XIEZL
MOV A,#01H
CALL XIEZL
MOV A,#06H
CALL XIEZL
MOV A,#0FH
CALL XIEZL
SJMP $
;=================
D10MS: MOV R5,#20 ; 10MS延时
LOPD: MOV R6,#249
DJNZ R6,$
DJNZ R5,LOPD
RET
;=================
DUZT: MOV P0,#0FFH ;LCD读状态
MOV P2,#11011111B
LOPT: JB P0.7,LOPT
CLR E
RET
;=================
XIEZL: CALL DUZT ;写LCD指令
XIEZL0: MOV P0,A ;指令存放 A
MOV P2,#00011111B
SETB E
CLR E
RET
;=========================
XIESJ: CALL DUZT ;写LCD数据
MOV P0,A ;数据存放 A
MOV P2,#00111111B
SETB E
CLR E
RET
;=================
DUSJ: CALL DUZT ;LCD读数据
MOV P2,#11111111B
MOV A,P0 ;数据读入 A
CLR E
RET
END
自己仔细看了一下,问题是程序初始化查询状态子程序(DUZT)有问题!仿真的LCD读状态是上升沿有效,我硬件datasheet是高电平有效~~
程序改为:
DUZT: MOV P0,#0FFH ;LCD读状态
MOV P2,#01011111B
LOPT: clr e
setb e
JB P0.7,LOPT
CLR E
RET
仿真可以了! 展开
相关程序段如下:
ORG 0000H
SJMP MAIN
ORG 000BH
LJMP TIME
ORG 0020H
MAIN: MOV SP,#60H;设置堆栈 60H
CALL D10MS ;D10MS延时10ms
MOV A,#38H ;初始化LCD
CALL XIEZL0
CALL D10MS
CALL XIEZL
MOV A,#08H
CALL XIEZL
MOV A,#01H
CALL XIEZL
MOV A,#06H
CALL XIEZL
MOV A,#0FH
CALL XIEZL
SJMP $
;=================
D10MS: MOV R5,#20 ; 10MS延时
LOPD: MOV R6,#249
DJNZ R6,$
DJNZ R5,LOPD
RET
;=================
DUZT: MOV P0,#0FFH ;LCD读状态
MOV P2,#11011111B
LOPT: JB P0.7,LOPT
CLR E
RET
;=================
XIEZL: CALL DUZT ;写LCD指令
XIEZL0: MOV P0,A ;指令存放 A
MOV P2,#00011111B
SETB E
CLR E
RET
;=========================
XIESJ: CALL DUZT ;写LCD数据
MOV P0,A ;数据存放 A
MOV P2,#00111111B
SETB E
CLR E
RET
;=================
DUSJ: CALL DUZT ;LCD读数据
MOV P2,#11111111B
MOV A,P0 ;数据读入 A
CLR E
RET
END
自己仔细看了一下,问题是程序初始化查询状态子程序(DUZT)有问题!仿真的LCD读状态是上升沿有效,我硬件datasheet是高电平有效~~
程序改为:
DUZT: MOV P0,#0FFH ;LCD读状态
MOV P2,#01011111B
LOPT: clr e
setb e
JB P0.7,LOPT
CLR E
RET
仿真可以了! 展开
1个回答
展开全部
RS BIT P2.5
RW BIT P2.6
E BIT P2.7
WRCMD EQU 30H
TIME EQU 31H
ORG 0000H
AJMP MAIN
ORG 0040H
MAIN: MOV P0,#01H ;清除屏幕
CALL ENABLE ;写到指定寄存器
MOV P0,#38H ;功能设定(8位,2行,5*7点阵式)
CALL ENABLE ;写到指定寄存器
MOV P0,#0CH ;显示器ON,光标OFF,闪烁OFF
CALL ENABLE ;写到指定寄存器
MOV P0,#80H ;第一行起始地址
CALL ENABLE ;写到指定寄存器
MOV DPTR,#TABLE1
CALL WRITE1 ;到TABLE1取码并写到数据寄存器
CALL DISPLAY
AJMP $
DISPLAY: MOV P0,#0C0H
CALL ENABLE
MOV DPTR,#TABLE2
CALL WRITE3
RET
ENABLE: CLR RS ;RS=0,写到旨令寄存器
CLR RW ;R/W=0
CLR E ;E=1--0使能
CALL DELAY ;调用延时子程序
SETB E ;E=1禁止
RET
WRITE1: MOV R1,#00H ;取码指针
A1: MOV A,R1 ;到TABLE取码
MOVC A,@A+DPTR
CALL WRITE2 ;调用写入到数据寄存器子程序
INC R1 ;取码指针加1
CJNE A,#00H,A1 ;是否取到结束码00H
RET
WRITE3:
MOV R1,#0 ;从左至右显示
A2: MOV A,R1
MOVC A,@A+DPTR
CALL WRITE2
INC R1
CJNE A,#00H,A2
RET
WRITE2: MOV P0,A ;将数据码写入数据寄存器
SETB RS ;RS=1
CLR RW ;R/W=0
CLR E ;E=1--0 使能
CALL DELAY
SETB E ;E=1 禁止
RET
DELAY: MOV R4,#05 ;延时子程序
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
RET
TABLE1: DB 'Temperature is :',00H
TABLE2: DB '3~9',00H
END
RW BIT P2.6
E BIT P2.7
WRCMD EQU 30H
TIME EQU 31H
ORG 0000H
AJMP MAIN
ORG 0040H
MAIN: MOV P0,#01H ;清除屏幕
CALL ENABLE ;写到指定寄存器
MOV P0,#38H ;功能设定(8位,2行,5*7点阵式)
CALL ENABLE ;写到指定寄存器
MOV P0,#0CH ;显示器ON,光标OFF,闪烁OFF
CALL ENABLE ;写到指定寄存器
MOV P0,#80H ;第一行起始地址
CALL ENABLE ;写到指定寄存器
MOV DPTR,#TABLE1
CALL WRITE1 ;到TABLE1取码并写到数据寄存器
CALL DISPLAY
AJMP $
DISPLAY: MOV P0,#0C0H
CALL ENABLE
MOV DPTR,#TABLE2
CALL WRITE3
RET
ENABLE: CLR RS ;RS=0,写到旨令寄存器
CLR RW ;R/W=0
CLR E ;E=1--0使能
CALL DELAY ;调用延时子程序
SETB E ;E=1禁止
RET
WRITE1: MOV R1,#00H ;取码指针
A1: MOV A,R1 ;到TABLE取码
MOVC A,@A+DPTR
CALL WRITE2 ;调用写入到数据寄存器子程序
INC R1 ;取码指针加1
CJNE A,#00H,A1 ;是否取到结束码00H
RET
WRITE3:
MOV R1,#0 ;从左至右显示
A2: MOV A,R1
MOVC A,@A+DPTR
CALL WRITE2
INC R1
CJNE A,#00H,A2
RET
WRITE2: MOV P0,A ;将数据码写入数据寄存器
SETB RS ;RS=1
CLR RW ;R/W=0
CLR E ;E=1--0 使能
CALL DELAY
SETB E ;E=1 禁止
RET
DELAY: MOV R4,#05 ;延时子程序
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
RET
TABLE1: DB 'Temperature is :',00H
TABLE2: DB '3~9',00H
END
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询