请教液晶稳定显示
各位达人:小弟请教。我用89C51单片机,汇编语言,来写一个128*64的液晶,驱动芯片是T6963C,想问一下啊,就是明明只写了显示一行的程序,可下面几行却和第一行显示的一模一样,这是为什么呢??期待解答………… 第一行能显示,说明硬件连接基本正确(如果是买的板,就基本不要考虑硬件问题了)。
那么肯定是你的代码有问题了。
为什么使用汇编? 硬件没又问题!
用汇编是因为需要!
代码很简单的,就是往显存里写了一行的内容!都没用循环的! 代码很简单的,就是往显存里写了一行的内容!都没用循环的!
调试要用循环:往显存里写了一行的内容,然后什么也不做,死循环等待,看显示如何。 循环的方式我也试过的。还是一样的问题!就在那让它死循环的。
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
这就是那部分显示的程序。很简单的一个程序。
还望马老师指点! 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
显示部分程序是这样的。
然后就是我重新上电复位时,有时候显示对的,有时候是错的!对的少,错的多!
为什么呢? 什么时候表示一行写完?是这段吗:
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 注意:驱动芯片T6963C内部的存储器地址寄存器好象是自动加1的,请查手册看一下。
你的代码循环是从头部HERE开始的,你认为是多次循环送第一行,如果T6963C内部的存储器地址是自动加1的,那么后面的循环就送到了第2、3、4行了。
我说的死循环是:只往显存里写了一行的内容,然后什么也不做(不能再送了),死循环等待,看显示如何。stop:AJMPstop 就是这个意思。 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楼的留言! 还有就是硬件连接电路是我自己搭的。我想有没有可能是连接的问题呢?不过既然能显示内容了,连接就应该没问题啊!而且有的时候还是对的! 这是我完整的程序:
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 搞定了,原来是液晶屏坏了!最不可能坏的地方坏了!真晕!麻烦马老师了! 搞定了就好。
不过不太象液晶屏的问题,用其它好的测试程序测试一下。 make
页:
[1]