找回密码
 注册
搜索
查看: 3456|回复: 23

[讨论] LCD调屏高手请进

[复制链接]
发表于 2006-2-21 16:14:00 | 显示全部楼层 |阅读模式
函数
void LCD_Delay(kal_uint8 time)
{
        volatile kal_uint16 delay;
        for (delay =0;delay <time*400;delay++) {} // 85us
}

Q1:让LCD延时是让LCD怎么延时?具体表现在什么指标上?
Q2:为什么上面的程序使得LCD延时85us?400的设定是否取决于MCU的主频?
Q3:LCD为什么要延时?
[em09]
发表于 2006-2-21 16:46:00 | 显示全部楼层
LCD driver IC 某些 functional block 在啟動的時候, 通常會需要一些時間穩定, 之後才能對它作其他的設置, 這些 block 通常都是 IC 內部的一些 analog 電路. 一般都是以 ms 等級的時間來等待, 不同 driver IC 或 LCM 需要的時間不同, 大多也只是粗略估計. 延遲一個迴圈的時間與 MCU 的速度有關.[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-2-22 10:29:00 | 显示全部楼层
这个函数是MTK平台的吧。。。
点评回复

使用道具 举报

 楼主| 发表于 2006-2-22 12:38:00 | 显示全部楼层
<P>是的,高手一看就知道是MTK平台的。</P><P>上面的程序我发错了,应该是:</P><P>void LCD_Delay(kal_uint8 time)
{
        volatile kal_uint16 delay;
        for (delay =0;delay &lt;time*400;delay++) {} // 85us
}</P><P>为什么上面的程序使得LCD延时85us?400的设定是否取决于MCU的主频?</P>
点评回复

使用道具 举报

发表于 2006-2-22 15:09:00 | 显示全部楼层
<P>85us 只是估計吧!也許是用示波器量測出來的, 400 也只是隨便選的, 這只是個人習慣問題. 不過, 在不同的平台下, 400 個迴圈所花的時間長短不同, 跟 MCU 的 clock 成反比. 另外, 不同的 compiler 也有些微的影響.</P>[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-2-23 23:36:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>liujienaya</I>在2006-2-22 12:38:09的发言:</B>

<P>是的,高手一看就知道是MTK平台的。</P>
<P>上面的程序我发错了,应该是:</P>
<P>void LCD_Delay(kal_uint8 time)
{
        volatile kal_uint16 delay;
        for (delay =0;delay &lt;time*400;delay++) {} // 85us
}</P>
<P>为什么上面的程序使得LCD延时85us?400的设定是否取决于MCU的主频?</P></DIV>


这个延时的意思,就是让CPU执行400*TIME个空指令,一般对于12M单片机来说,一个指令的时间应该是1US,手机上的ARM系统时钟频率比这个快多了,具体要看时钟为多少,再来计算.用400应该是个人习惯.
至于LCD上的延时是必要的,在LCD的初始化过程中,必要给IC一段延,才能初始化成功,通常,在初始化之前要RESET,这个时候要加延时,而且在某些寄存器时,也要延时,只有满足他们的时序,才能初始化成功.[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-2-24 15:49:00 | 显示全部楼层
<P>为什么是85us?</P><P>输入参数time都不知道,MTK就知道有85us了,佩服啊</P><P>而且似乎如果用OS后还这样写延时函数真有点s</P>
点评回复

使用道具 举报

发表于 2006-2-24 16:55:00 | 显示全部楼层
可以用MTK提供的TRACE工具打印出来看看。。。
点评回复

使用道具 举报

发表于 2006-3-2 21:36:00 | 显示全部楼层
<P>尤其是在初始化lcm会有一个关于power的reg,在对它进行设置以后最好有一个延时</P><P>不过我们一般是用10ms,或者100ms也没关系</P>
点评回复

使用道具 举报

发表于 2006-3-13 15:09:00 | 显示全部楼层
<P>个人看法:</P><P>针对ARM,其实上面的语句是执行空指令,根据空指令的指令周期和ARM的工作频率来确定最终要循环多少次,多数这个值都是估计出来的,如果想精确些那么可以通过示波器或者逻辑分析仪测定,然后设置一个相对比较精确的循环次数。</P><P>同时,要在编译的时候,注意不要利用ARM的空语句的优化功能,可能会将这些空循环优化掉!出现一些莫名奇妙的错误!</P><P>仅为个人看法,如有不对,请执教!谢谢!</P>
点评回复

使用道具 举报

发表于 2006-3-14 09:51:00 | 显示全部楼层
如果要算的精确,光有ARM的主频是没有用的(这里假设你使用的是没有MMU的ARM系列,也就是所谓的平板地址系统)。还要看你这段代码的存储区,如果是在flash上,ARM在取指令的时候肯定要delay,一个取指周期是比较长的。所以推荐用示波器测量。[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-3-20 16:55:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>zorro7758</I>在2006-2-23 23:36:00的发言:</B>



这个延时的意思,就是让CPU执行400*TIME个空指令,一般对于12M单片机来说,一个指令的时间应该是1US,手机上的ARM系统时钟频率比这个快多了,具体要看时钟为多少,再来计算.用400应该是个人习惯.
至于LCD上的延时是必要的,在LCD的初始化过程中,必要给IC一段延,才能初始化成功,通常,在初始化之前要RESET,这个时候要加延时,而且在某些寄存器时,也要延时,只有满足他们的时序,才能初始化成功.

<P align=right><FONT color=red>+3 RD币</FONT></P></DIV>



就是这个意思,补充下400*TIME这个使自己定的根据mcu的时钟和lcd的时序确定的,居个例子,信利的+6219在初始化写LCD寄存器的时候,这个值通常是0x1000,至于那个85,哈哈,MTK培训的时候都讲过的,哈哈,就是那个安全值拉,哈哈[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-3-21 15:50:00 | 显示全部楼层
<P>根据液晶显示特性开机时必须要有延时,另外,IC稳定工作也许要一段时间。</P><P>开机有花屏现象或由sleep mode 进入 wake up mode 有白屏现象,也可通过增加延时改善。</P>[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-4-11 21:55:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>aquasnake</I>在2006-2-24 15:49:00的发言:</B>

<P>为什么是85us?</P>
<P>输入参数time都不知道,MTK就知道有85us了,佩服啊</P>
<P>而且似乎如果用OS后还这样写延时函数真有点s</P></DIV>


就是用time来决定不同平台上的85us的,快的平台time就小些
点评回复

使用道具 举报

发表于 2006-4-12 21:51:00 | 显示全部楼层
<P>比如将LCD 初始化时,需要内部的晶体起振,一般均要延迟10ms ,也是这个道理。</P>
点评回复

使用道具 举报

发表于 2006-4-13 22:02:00 | 显示全部楼层
<P>首先,你這個循環在有的軟件平台在被優化後可能會沒有的,一般應當在循環體內加一條asm("nop");語句。</P><P>其次,你寫的是C語言,而執行指令是按照匯編代碼執行的,並且也不是每個匯編代碼都是一個指令完成。</P><P>再次,CPU運行的速度不是永遠都一樣的,所以,在不同的主頻下,延時不一樣。</P><P>最後,如果有中斷打斷或切換任務,那就慘了!最壞的情況下,可能用的時間比你想象的多幾十倍。</P>[br]<p align=right><font color=red>+5 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-4-13 22:04:00 | 显示全部楼层
忘了,還要考慮cache的問題喔,所以這樣子的延時,只是個大概,以及確保最小延時值的。
点评回复

使用道具 举报

发表于 2006-4-17 11:55:00 | 显示全部楼层
<P>楼上的分析很有道理嘛,呵呵</P>
点评回复

使用道具 举报

发表于 2006-4-23 11:01:00 | 显示全部楼层
<P>呵呵,我来解释一下吧,注释的85us和实际的延时时间未必对的上。可能当初写代码的人,是想实现延时85us,但这个delay时间,后面调试的人,可能改过,但注释未必更改。</P><P>而且,这个delay函数的调用,一般只在初始化LCD时调用,也就采用了纯消耗时间delay的方式。</P>[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-10-16 18:55:00 | 显示全部楼层
OS的时间不准确,用这个基本的办法可以得到精确的时间,特别是时间是US级数的时候又是在刚刚开机初始化的时候,用指令周期比用timer好得多.呵呵,这个,我想就是MTK工程师的初衷吧
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-16 02:36 , Processed in 0.051188 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表