yada___ 发表于 2009-8-6 14:50:15

请教液晶稳定显示

各位达人:小弟请教。我用89C51单片机,汇编语言,来写一个128*64的液晶,驱动芯片是T6963C,想问一下啊,就是明明只写了显示一行的程序,可下面几行却和第一行显示的一模一样,这是为什么呢??
期待解答…………

machao 发表于 2009-8-6 15:00:42

第一行能显示,说明硬件连接基本正确(如果是买的板,就基本不要考虑硬件问题了)。
那么肯定是你的代码有问题了。
为什么使用汇编?

yada___ 发表于 2009-8-6 15:05:18

硬件没又问题!
用汇编是因为需要!
代码很简单的,就是往显存里写了一行的内容!都没用循环的!

machao 发表于 2009-8-6 16:14:22

代码很简单的,就是往显存里写了一行的内容!都没用循环的!

调试要用循环:往显存里写了一行的内容,然后什么也不做,死循环等待,看显示如何。

yada___ 发表于 2009-8-6 16:23:45

循环的方式我也试过的。还是一样的问题!就在那让它死循环的。
HERE:
       MOV R2,#00H      ;设置数据指针地址
       MOV R3,#00H
       MOV R4,#24H
       LCALL OUTI2

       MOV R2,#00H
AGAIN: MOVDPTR,#TAB
       MOVA,R2
       MOVC A,@A+DPTR
       MOV R3,A
       MOV R4,#0C0H
       LCALLOUTI1
       INCR2
       CJNE   R2,#80H,AGAIN
AJMPHERE
这就是那部分显示的程序。很简单的一个程序。
还望马老师指点!

yada___ 发表于 2009-8-6 16:29:01

HERE:
       MOV R2,#00H      ;设置数据指针地址
       MOV R3,#00H
       MOV R4,#24H
       LCALL OUTI2

       MOV R2,#00H
AGAIN: MOVDPTR,#TAB   
       MOVA,R2
       MOVC A,@A+DPTR
       MOV R3,A
       MOV R4,#0C0H
       LCALLOUTI1   
       INCR2
       CJNE   R2,#10H,AGAIN ()
AJMPHERE
显示部分程序是这样的。
然后就是我重新上电复位时,有时候显示对的,有时候是错的!对的少,错的多!
为什么呢?

machao 发表于 2009-8-6 16:38:03

什么时候表示一行写完?是这段吗:

       MOV R2,#00H
AGAIN: MOVDPTR,#TAB   
       MOVA,R2
       MOVC A,@A+DPTR
       MOV R3,A
       MOV R4,#0C0H
       LCALLOUTI1   
       INCR2
       CJNE   R2,#80H,AGAIN
AJMPHERE

看代码,R0从00H到80H,循环128次,调用了128次OUTI1,然后完成AGAIN的循环,是否表示送出一行数据?
那么应该改成这样进行测试:

       MOV R2,#00H
AGAIN: MOVDPTR,#TAB   
       MOVA,R2
       MOVC A,@A+DPTR
       MOV R3,A
       MOV R4,#0C0H
       LCALLOUTI1   
       INCR2
       CJNE   R2,#80H,AGAIN
stop:AJMPstop

machao 发表于 2009-8-6 16:54:18

注意:驱动芯片T6963C内部的存储器地址寄存器好象是自动加1的,请查手册看一下。

你的代码循环是从头部HERE开始的,你认为是多次循环送第一行,如果T6963C内部的存储器地址是自动加1的,那么后面的循环就送到了第2、3、4行了。

我说的死循环是:只往显存里写了一行的内容,然后什么也不做(不能再送了),死循环等待,看显示如何。stop:AJMPstop 就是这个意思。

yada___ 发表于 2009-8-7 07:55:55

MOV R2,#00H
AGAIN: MOVDPTR,#TAB   
       MOVA,R2
       MOVC A,@A+DPTR
       MOV R3,A
       MOV R4,#0C0H
       LCALLOUTI1   
       INCR2
       CJNE   R2,#10H,AGAIN
stop:AJMPstop
就是这样的程序也不行的。我也试过!还是会出现一样的问题!把循环的值变成10H也不行

请看5楼的留言!

yada___ 发表于 2009-8-7 08:00:01

还有就是硬件连接电路是我自己搭的。我想有没有可能是连接的问题呢?不过既然能显示内容了,连接就应该没问题啊!而且有的时候还是对的!

yada___ 发表于 2009-8-7 08:25:16

这是我完整的程序:
      ORG0000H
      LJMP STAR
      ORG0100H
STAR:SETBP3.0               ;C/D
       SETBP3.1               ;WR
       SETBP3.2               ;RD
                              ;我的CE是接地的。RES是硬件复位
       MOV R4,#90H
       LCALL OUTIN;关显示

       MOV R2,#00H    ;设置数据地址指针
       MOV R3,#00H
       MOV R4,#24H
       LCALL OUTI2

       MOV R4,#0B0H    ;连续写开始
       LCALL OUTIN

       MOV R2,#01FH    ;1FH=31D             ;8k显存清空
CLRS0:
       MOV R3,#0FFH    ;FFH=255D
CLRS1:
       CLR A
       MOVR5,A
       LCALL LIANXU
       DJNZ R3,CLRS1      ;
       DJNZ R2,CLRS0
       MOV R4,#0B2H   ;连续写结束
       LCALL OUTIN

;初始化
MAIN:MOV R2,#00H
       MOV R3,#00H;   设置显示文本缓冲区首地址
       MOV R4,#40H
       LCALL OUTI2

       MOV R2,#16;
       MOV R3,#00   ;设置显示文本区宽度
       MOV R4,#41H
       LCALL OUTI2

       MOV R2,#00H
       MOV R3,#08H
       MOV R4,#42H
       LCALL OUTI2;设置图形缓冲区首地址

       MOV R2,#16
       MOV R3,#00H;设置显示图形区宽度
       MOV R4,#43H;
       LCALL OUTI2

       MOVR4,#80H
       LCALLOUTIN

       MOV R4,#0A2H    ;光标形状
       LCALLOUTIN

       MOV R2,#00H    ;设置光标位置
       MOV R3,#01H   ;
       MOV R4,#21H
       LCALL OUTI2

       MOV R4,#97H; 文本显示开,图形显示关
       LCALLOUTIN

       MOV R2,#00H      ;设置数据指针地址
       MOV R3,#00H
       MOV R4,#24H
       LCALL OUTI2

       MOV R2,#00H               ;显示WELCOME TO CHINA !
AGAIN: MOVDPTR,#TAB
       MOVA,R2
       MOVC A,@A+DPTR
       MOV R3,A
       MOV R4,#0C0H
       LCALLOUTI1
       INCR2
       CJNE   R2,#10H,AGAIN
HERE: AJMPHERE

;下面全是调用的程序

OUTI2:   LCALL PR01                  ;THE ENTRANCE OF TWO BYTE PARA. COMMAND
    MOV A,R2
    LCALL OUTD
        ;OUTI1 IS FOR ONE PARA.
OUTI1:   LCALL PR01
    MOV A,R3
    LCALL OUTD
        ;OUTIN IS FOR NO PARA.
OUTIN:   LCALL PR01
    MOV A,R4
    SJMPOUTD1
        ;OUTD IS FOR DATA OUTPUT
OUTD:      CLRP3.0                   ;FOR WRTIE DATA C/D=0
OUTD1:                                 ;FOR WRITE COMMAND C/D=1
    CLRP3.1                   ;WR=0
    nop
    nop
    MOVP1,A
    MOVP1,A
    SETB P3.1                   ;W/R = 1
    SETB P3.0                   ;C/D =1
    RET

LIANXU: LCALL PR03
        MOV   A,R5
        LCALL OUTD
RET


PR01:   LCALL PR0            ;Check the state of the LCD Module
    JNB ACC.0,PR01            ;JUDGE STA0
    JNB ACC.1,PR01            ;JUDGE STA1
    RET


PR03:LCALL PR0
    JNBACC.3,PR03             ;FOR STA3
    RET

PR0:   SETB P3.0               ;C/D = 1
       ORL P1,#0FFH                ;P1 PORT IS FOR INPUT
       CLR P3.2                  ;RD =0
       NOP
       NOP
       MOV A,P1
       SETB P3.2                   ;RD = 1
       RET

MS40:MOV R7,#00FH
MS2:   MOV R6,#01FH
MS1:   DJNZ R6,MS1
       DJNZ R7,MS2
       RET

TIME:MOV 23H,#03H                        ;延时程序
TIME1:MOV 21H,#0FFH
TIME2:       LCALL MS40
DJNZ 21H,TIME2
DJNZ 23H,TIME1
RET
TAB:DB37H 25H 2cH 23H 2fH 2dH 25H 00H 34H 2fH 00H 23H 28H 29H 2eH 21H      ;welcome to china
      DB   01H                                                                  ;!

END

yada___ 发表于 2009-8-7 14:43:59

搞定了,原来是液晶屏坏了!最不可能坏的地方坏了!真晕!麻烦马老师了!

machao 发表于 2009-8-9 00:53:50

搞定了就好。

不过不太象液晶屏的问题,用其它好的测试程序测试一下。

wajlh 发表于 2009-8-10 14:33:46

make
页: [1]
查看完整版本: 请教液晶稳定显示