大家帮忙分析下3.3V 1602上电不显示的问题?
问题描述:
我用3.3V单片机控制3.3V的1602,现在发现一个问题就是在上电后不显示,什么都不动它,等上1分钟左右它才显示出来了.然后就可以正常控制了,
在1602正常显示后,不断1602的电的前提下,断单片机的电又上电,可以正常显示.把1602和单片机同时断电又上电就要等上1分钟左右它才显示.
连线:
PA-->D0~D7
PB.5->E
PB.6->RS
PB.7->RW
用10K电位器调挑背光
单片机是51内核的,但把端口作为外部寄存器来读写.这点跟8051不同.
mov DPTR, #PB
MOVX A, @DPTR ;读PB口
mov DPTR, #PB
MOVX @DPTR A; 写PB口
MOV DPTR, #PACONH
MOV A, #10101010B ;set pa4~7 output
MOV DPTR, #PACONH
MOV A, #01010101B ;set pa4~7 input
程序如下:
;======================================================
;======================================================
PORT_E EQU ACC_5
PORT_RS EQU ACC_6
PORT_RW EQU ACC_7
PORT_BY EQU ACC_7
Read_1602_BY:
mov DPTR, #PB
MOVX A, @DPTR
CLR PORT_E
CLR PORT_RS ;=1:DATA;=0:CMD
SETB PORT_RW ;=1:READ;=0:WRITE
MOVX @DPTR, A
MOV DPTR, #PACONH
MOV A, #01010101B ;set pa input
MOVX @DPTR, A
MOV DPTR, #PACONL
MOV A, #01010101B
MOVX @DPTR, A
MOV DPTR, #PA
MOV A, #0FFH
MOVX @DPTR, A
read_1602_by_lp:
mov DPTR, #PB
MOVX A, @DPTR
SETB PORT_E
CLR PORT_RS ;=1:DATA;=0:CMD
SETB PORT_RW ;=1:READ;=0:WRITE
MOVX @DPTR, A
NOP
NOP
NOP
MOV DPTR, #PA
MOVX A, @DPTR
JNB PORT_BY, end_read_1602_by
JMP read_1602_by_lp
end_read_1602_by:
RET
Write_1602_cmd:
CALL Delay40us
CALL Read_1602_BY ;wait BY=0
MOV DPTR, #PB
MOVX A, @DPTR
CLR PORT_E
CLR PORT_RS ;=1:DATA;=0:CMD
CLR PORT_RW ;=1:READ;=0:WRITE
MOVX @DPTR, A
MOV DPTR, #PACONH
MOV A, #10101010B ;set pa output
MOVX @DPTR, A
MOV DPTR, #PACONL
MOV A, #10101010B
MOVX @DPTR, A
MOV DPTR, #PA
MOV A, R7
MOVX @DPTR, A
MOV DPTR, #PB
MOVX A, @DPTR
CLR PORT_RS ;=1:DATA;=0:CMD
CLR PORT_RW ;=1:READ;=0:WRITE
SETB PORT_E ;rising
MOVX @DPTR, A
NOP
NOP
NOP
NOP
CLR PORT_E
MOVX @DPTR, A
RET
Write_1602_cmd0:
MOV DPTR, #PB
MOVX A, @DPTR
CLR PORT_E
CLR PORT_RS ;=1:DATA;=0:CMD
CLR PORT_RW ;=1:READ;=0:WRITE
MOVX @DPTR, A
MOV DPTR, #PACONH
MOV A, #10101010B ;set pa output
MOVX @DPTR, A
MOV DPTR, #PACONL
MOV A, #10101010B
MOVX @DPTR, A
MOV DPTR, #PA
MOV A, R7
MOVX @DPTR, A
MOV DPTR, #PB
MOVX A, @DPTR
CLR PORT_RS ;=1:DATA;=0:CMD
CLR PORT_RW ;=1:READ;=0:WRITE
SETB PORT_E ;rising
MOVX @DPTR, A
NOP
NOP
NOP
NOP
CLR PORT_E
MOVX @DPTR, A
RET
Write_1602_data:
CALL Delay40us
CALL Read_1602_BY ;wait BY=0
MOV DPTR, #PB
MOVX A, @DPTR
CLR PORT_E
CLR PORT_RW ;=1:READ;=0:WRITE
SETB PORT_RS ;=1:DATA;=0:CMD
MOVX @DPTR, A
MOV DPTR, #PACONH
MOV A, #10101010B ;set pa output
MOVX @DPTR, A
MOV DPTR, #PACONL
MOV A, #10101010B
MOVX @DPTR, A
MOV DPTR, #PA
MOV A, R7
MOVX @DPTR, A
MOV DPTR, #PB
MOVX A, @DPTR
CLR PORT_RW ;=1:READ;=0:WRITE
SETB PORT_RS ;=1:DATA;=0:CMD
SETB PORT_E
MOVX @DPTR, A
NOP
NOP
NOP
NOP
NOP
NOP
CLR PORT_E
MOVX @DPTR, A
RET
main_1602_ini:
CALL Delay5ms
CALL Delay5ms
MOV R7, #038H
CALL Write_1602_cmd0 ;set 8bit,two line,5*11
CALL Delay5ms
CALL Delay250ms
MOV R7, #038H
CALL Write_1602_cmd0 ;不等忙信号
CALL Delay5ms
CALL Delay250ms
MOV R7, #038H
CALL Write_1602_cmd0 ;不等忙信号
CALL Delay5ms
CALL Delay5ms
MOV R7, #038H
CALL Write_1602_cmd0 ;不等忙信号
CALL Delay5ms
CALL Delay5ms
MOV R7, #00001000b ;set show off,cursor off,cursor no flash
CALL Write_1602_cmd0 ;不等忙信号
CALL Delay5ms
CALL Delay5ms
MOV R7, #01H ;set clr lcd data
CALL Write_1602_cmd0 ;不等忙信号
CALL Delay5ms
CALL Delay5ms
MOV R7, #00000110b ;set AC inc
CALL Write_1602_cmd0 ;不等忙信号
CALL Delay5ms
CALL Delay5ms
MOV R7, #00001100b ;#00001100b ;set show on,cursor off,cursor no flash
CALL Write_1602_cmd0 ;不等忙信号
CALL Delay5ms
CALL Delay5ms
ret 你发了复位没 有发送复位命令的,倒数第3条命令
补充一点.在跑完1602的程序后,1602后面的程序已经正常运行(已经验证),
在不显示的1分钟期间,对1602写显示数据,显示新写的数据
在不显示的1分钟期间,不对1602操作,显示原来的写的数据.
在上电后,有等待500MS的延时,才初始化的,然后延时100MS后又初始化一次.最后才送显示数据. 楼主可以试试以下实验,进一步判断
整个系统断电,确保复位。
1602上电,MCU不上电,等待一分钟,MCU再上电,看看是否显示?如果不显示,继续等待一分钟,看看是否显示?
以上流程可以判断是软件问题还是硬件问题了
同意楼上的看法。 5楼方法正确,可以判断软硬件故障
先谢谢几位.
我会按照STM32_Study 的办法下周一测试下.(今天不上班)
我说下我的疑点:
在仿真器上初次上电也是不显示,程序运行后等段时间才显示,然后程序复位不断电再运行,正常显示,
不显示时,有时候用手摸摸接线又显示了.但前提是要程序运行后等一会才可以,不是程序一运行马上有手去摸它
要是不动它就要等上1分钟左右.
大家帮忙看下程序初始化有没有问题下.先排除软件问题.
页:
[1]