LCD 1602的響應速度相對於單片機的速度來說是偏慢的。
舉個簡單的例子,把壹桶油通過漏鬥向壹個瓶子裏倒,倒油的速度,即流量必須維持在壹定範圍之內,倒得太快油會從漏鬥頂部溢出來,這樣就浪費掉了。我們通過眼睛可以判斷並使油面保持在頂面以下,以漏鬥的額定流量來倒油,這樣效率最高。
而對於單片機來說,1602好比那個瓶子漏鬥,寫入1602中要顯示的數據好比油,如果以單片機的高運行速度向1602寫數據就很可能造成上面所說的溢出,比如連續寫入abc,結果只顯示出了a,這是因為1602的顯示芯片每次都要花時間來處理輸入的ascii碼數據,並把它顯示出來。而我們卻不容易主動地去控制寫入數據的速度,所以1602使用忙信號就有必要了,每次單片機只有檢測到忙信號為0,即不忙時,才向1602發數據。比如要顯示abc,則這樣操作,寫a---判忙---寫b---判忙---寫c---判忙。這樣就不會出錯了。
這幾年推出的lcd,像手機的屏響應速度就比較快,而1602這個古董我用示波器測過,大約40us左右的忙處理時間,而很多速度快的單片機的指令周期都是ns級的。也就是說單片機相當壹段時間都在‘等’LCD。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void busy(void)
{ uchar temp=0x80; //初始化temp最高位為1,使得能夠進入下面
//的while循環
P0=0xff;(P0就是8個數據口)
rs=0; //設置命令操作
rw=1; //設置讀操作
en=1; //使能
delay(100);(這是設的延時函數,不用解釋)
while(temp & 0x80) //判忙,壹旦表達式為假,即temp最高位為0,
//則表示1602不忙,跳出while.
{temp=P0;delay(20);} //把p0的的高位讀入temp,延時
en=0; //關閉使能信號
}
每次讀寫操作都要調用這個busy函數