xxiangj 发表于 2012-12-8 09:06:55

大家帮忙分析下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

xwkm 发表于 2012-12-8 09:34:57

你发了复位没

xxiangj 发表于 2012-12-8 09:40:57

有发送复位命令的,倒数第3条命令

      

xxiangj 发表于 2012-12-8 09:52:46

补充一点.在跑完1602的程序后,1602后面的程序已经正常运行(已经验证),
在不显示的1分钟期间,对1602写显示数据,显示新写的数据
在不显示的1分钟期间,不对1602操作,显示原来的写的数据.

在上电后,有等待500MS的延时,才初始化的,然后延时100MS后又初始化一次.最后才送显示数据.

STM32_Study 发表于 2012-12-8 10:30:38

楼主可以试试以下实验,进一步判断

整个系统断电,确保复位。
1602上电,MCU不上电,等待一分钟,MCU再上电,看看是否显示?如果不显示,继续等待一分钟,看看是否显示?


以上流程可以判断是软件问题还是硬件问题了

skyandcity 发表于 2012-12-8 10:37:00

同意楼上的看法。

four_zhg 发表于 2012-12-8 10:50:05

5楼方法正确,可以判断软硬件故障

xxiangj 发表于 2012-12-8 10:50:59


先谢谢几位.

我会按照STM32_Study 的办法下周一测试下.(今天不上班)

我说下我的疑点:
在仿真器上初次上电也是不显示,程序运行后等段时间才显示,然后程序复位不断电再运行,正常显示,

不显示时,有时候用手摸摸接线又显示了.但前提是要程序运行后等一会才可以,不是程序一运行马上有手去摸它
要是不动它就要等上1分钟左右.
大家帮忙看下程序初始化有没有问题下.先排除软件问题.
页: [1]
查看完整版本: 大家帮忙分析下3.3V 1602上电不显示的问题?