论坛风格切换切换到宽版
  • 4702阅读
  • 11回复

请教2个液晶编程的问题 [复制链接]

上一主题 下一主题
离线BG4ABM
 
发帖
1139
只看楼主 倒序阅读 0楼 发表于: 2007-04-11
1:如果要往液晶中写命令(或数据),下面2种写法似乎都可以,请问是不是这样?
clr   rs(setb rs)                        
clr   rw                        
clr   e                          
延时                            
setb e  
还有一种是 :  
clr   rs(setb rs)                        
clr   rw                        
setb   e                          
延时                            
clr e  
                         

2:虽然液晶的使用说明中写着每次读写前都要进行忙信号检测,但我看到有许多程序中并没有使用忙信号检测,也可正常工作,请问,忙信号检测是不是可有可无的?
离线Sullivan
发帖
4817
只看该作者 1楼 发表于: 2007-04-11
如果不是连续往lcm里写东西,而是间隔很长时间写东西,就不必要去检测是否忙. 但检测忙这个功能建议还是在程序里保留.呵呵
离线BG4UVR
发帖
11288
只看该作者 2楼 发表于: 2007-04-11
1、不可能。只有1种时序才可以正常工作。不过要注意,写入和读出有可能是相反的哟

2、如果不进行忙检测,要想系统能正常工作,必须有前提:
  1)你的cpu足够慢。

或者:
  2)进行延时。
离线Jimmysz
发帖
141
只看该作者 3楼 发表于: 2007-04-11
普通的液晶对于时序的要求并不是非常严格,如果是用单片机来控制,只需要按着读写的时序图配一下就可以了。
忙信号我是没检查过,具体要看你的控制器和系统的主频了。
离线BG4ABM
发帖
1139
只看该作者 4楼 发表于: 2007-04-12
很想和bg4uvr讨论这个问题
这是一段用1602液晶显示一个字母“a”的程序,我已经在试验板上试过,大写部分可以用括号中的命令,也可以不使用括号中的命令,最后显示的效果是一样的,也就是说的确有2种时序可以达到同一目的,希望能有高手对这种情况作出解释。

rs equ p2.0
rw equ p2.1
e equ p2.2
sj equ p0

org 030h
lcall delay
mov sj,#38h
acall enable
mov sj,#38h
acall enable
mov sj,#38h
acall enable
mov sj,#38h
acall enable
mov sj,#08h
acall enable
mov sj,#01h
acall enable
mov sj,#06h
acall enable
mov sj,#0ch
acall enable

main:
mov sj,#80h
acall enable
mov dptr,#table
acall write
ljmp main

enable:
clr rs
clr rw
clr e(setb e)
acall delay
setb e(clr e)
ret

write:
mov a,#00h
movc a,@a+dptr
mov sj,a
setb rs
clr rw
clr e(setb e)
call delay
setb e(clr e)
ret

delay:
mov r7,#255
d1:mov r6,#255
d2:djnz r6,d2
djnz r7,d1
ret

table:db"a"

end
离线BG4UVR
发帖
11288
只看该作者 5楼 发表于: 2007-04-12
'
很想和bg4uvr讨论这个问题
……
'

不好意思,今天才抽出时间来仔细研究一下这个问题。

经过仔细查看你的程序,并仔细研究了一下1602的时序,结合自己的1602驱动程序,现得出如下结论:

1、1602无论读出还是写入,都是要求en信号为一个正脉冲(可以看成是上升沿)。
2、至于你的程序为什么改掉还会能正常工作,我想,应该是你程序的结构问题。

仔细说一下2。相信你现在非常不能理解,为什么你的程序改了后,还能完全正常工作。其实原因只有一个,那就是你的主程序,是一个循环结构,一直在向lcm写“a”。

为了更好的理解这个问题,你可以在纸上画一个rs、rw、en信号的时序图,按照你的程序画。你就会发现,送出数据后,如果你把en的电位从高变低,这时候,虽然不符合它的时序,但在一下次写a的过程中,你会再次把en从低变高后,再变低。这相当于,你给了lcm一个非常宽的正脉冲en信号。

以上内容仅为分析,我并未做实验。不过有一个方法可以判断我的分析是否正确,就是你把主程序,改成只运行一次(即只写一次“a”),然后让主程序进入死循环。这时,你再改变en信号的极性,应该发现,有一种极性(给负脉冲的),lcm是不能正常显示的。如果你的实验结果和我说的一样,那么我的分析就是正确的了。

因为我现在用的是avr,实验51程序需要把开发板改动一下,所以以上猜想,没有进行实验。

我觉得时序用文字表述起来,很难说清,你可以看一下我附件pdf中最后一页的时序图。
附件: SMC1602A.pdf (0 K) 下载次数:9789
离线BG4UVR
发帖
11288
只看该作者 6楼 发表于: 2007-04-15
已回复123
离线BG4ABM
发帖
1139
只看该作者 7楼 发表于: 2007-04-15
好的,明天上班后我按你的方法来试一下
离线BG4ABM
发帖
1139
只看该作者 8楼 发表于: 2007-04-16
我分别写了2个程序,都没有使用循环结构,而是使用ljmp $,一个使用上升沿写入数据的方法,一个使用下降沿写入数据的方法,结果都可以正常显示。
离线BG4UVR
发帖
11288
只看该作者 9楼 发表于: 2007-04-16
'
我分别写了2个程序,都没有使用循环结构,而是使用ljmp $,一个使用上升沿写入数据的方法,一个使用下降沿写入数据的方法,结果都可以正常显示。
'

那我也强烈搞不懂了
离线sniperjack
发帖
4003
只看该作者 10楼 发表于: 2007-04-23
今天在做一个试验,发现只要1602有10微秒左右的延时就可以显示东西了,低于这个数容易出现乱码。
离线JohnsonRen
只看该作者 11楼 发表于: 2007-05-11
'
1:如果要往液晶中写命令(或数据),下面2种写法似乎都可以,请问是不是这样?
clr   rs(setb rs)                        
clr   rw                        
clr   e                          
延时                            
setb e  
还有一种是 :  
clr   rs(setb rs)                        
clr   rw                        
setb   e                          
延时                            
clr e  
                         
2:虽然液晶的使用说明中写着每次读写前都要进行忙信号检测,但我看到有许多程序中并没有使用忙信号检测,也可正常工作,请问,忙信号检测是不是可有可无的?
'


這兩種方式是有區別的,後一種是正確的,前一種在應用中可能出問題,你不妨試一下,在main程序中,acall write這一句之前加一句clr e,你就會發現前一種沒有顯示,而後一種正常顯示。這主要是因為,mcu在上電時,p2口是高電平。此時lcm已經被使能了所以隻要設置好p0,rs,rw之後就開始顯示了。因為lcm中帶有ram,再在後面設置和清除e位,對顯示沒有影響,除非寫入新的數據或是指令。
另外,我想你可能是用軟件仿真時出現的這樣的情況,在實際電路中可能不會出現這樣的情況,我也是在對你的程序用proteus仿真之後得出這樣的結論的。