LCD1602四線驅動 i2c

出處:http://www.amobbs.com/thread-5503804-1-1.html

小弟新手,第一次發帖,還有很多地方不懂,希望前輩 大俠們多多指點~
板子是學校電子CAD時候發的,平時沒怎麼用,前幾天拿出來 看到上面有塊1602液晶 四線制驅動的(DB7–P1^3 DB6–P1^2 DB5–P1^1 DB4–P1^0 )
片機 STC89c52 RS–P2^6 EN–P2^7 RW接地(只寫模式) 以前沒玩過1602 4線驅動 就去網上找了不少資料 把程序燒寫進去 但是都失敗了 最多也就顯示
亂碼 後來又琢磨了一兩天 終於調試成功 既然寫成功 我就把我的心得分享給大家~
程序是 網上資料+我的理解 寫的 在這裡感謝那些提供資料的人 現在把我的程序分享給大家

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit en=P2^7; // 液晶使能端 下降沿有效
sbit rs=P2^6; // 命令–數據選擇端 rs=0 寫命令 rs=1 寫數據

uchar code table1[]=” 4_LINE DRIVER “;
uchar code table2[]=”FOR LCD1602 OK!”;

void delay(uint x) //延時 x 毫秒
{
uint i,j;
for(i=x;i>0;i–)
for(j=110;j>0;j–);
}
void write_1602(uchar cd,dat) //cd=0 寫命令 cd=1 寫數據
{
uchar i;
rs=cd;
for(i=0;i<2;i++) //循環兩次 寫完一個數據/命令
{
en=1;
P1=(P1&0xf0)|((dat>>4)&0x0f); //P1高四位數據不改動
delay(3); //先送高四位數據 再送低四位數據
en=0;
dat<<=4; //低四位左移到高四位
}
}
void init()
{
write_1602(0,2); //設置4位數據接口
write_1602(0,0×28); //顯示方式設置
write_1602(0,0x0e); //設置開顯示,不顯示光標
write_1602(0,0×06); //默認(0x06)寫入新數據後光標右移 屏幕不移動
write_1602(0,0×01); //顯示清0,數據指針清0
}
void main()
{
init();
while(1)
{
uchar num;
write_1602(0,0×80); //第一行
for(num=0;num<16;num++)
{
write_1602(1,table1[num]);
delay(3);
}
write_1602(0,0×80+0x40); //第二行
for(num=0;num<16;num++)
{
write_1602(1,table2[num]);
delay(3);
}
while(1);
}
}

接下來說說我的程序為什麼要那麼寫~
我第一次寫成功時 液晶4線設置 初始化程序是這樣的
write_1602(0,0×28);
delay(3);
write_1602(0,0×28);
delay(3);
write_1602(0,0×28);
delay(3);
en=1;
en=0;
write_1602(0,0×28);
這樣初始化 覺得很奇怪 於是改變了一下
write_1602(0,0×28);
delay(3);
en=1;
en=0;
write_1602(0,0×28);
這樣也可以初始化成功 但是如果沒有 en=1; en=0; 液晶顯示亂碼 為什麼呢?
分析一下en=1; en=0;的意思 就會知道 這是一個en下降沿 會把P1低四位數據送入液晶 當我們執行完第一個命令write_1602(0,0×28);時
P1低四位為1000 也就是說en=1; en=0; 把半個數據寫入了液晶(因為一個完整數據或命令需要寫兩次) 那意思是說四線初始化成功需要
寫一個半數據(寫三次)? 但是寫完一個數據只需要兩次噠 難道是因為高4位數據寫入之後 四線模式設置成功瞭然後後面的低4位數據
被作為了一個新的數據 也就是說 0x28的低4位1000作為了一個新數據的高4位~ 而en=1; en=0;寫入了剛才數據的低4位(也是1000) 這樣
的話 後面的數據才會被正常寫入 為了驗證我的猜想 於是我把初始化程序改為這樣
write_1602(0,0×22);
rs=0;
en=1;
P1=(P1&0xf0)|0x00; //P1低位送入0000
en=0;
//write_1602(0,0×28);
結果我很滿意 液晶確實只顯示了一行 5×7點陣 因為液晶顯示一行 5×7點陣的命令為write_1602(0,0×20);(N=0,F=0,具體看1602數據手冊)
這樣的話 0x22的低4位和P1=(P1&0xf0)|0x00;的四位組合成了一個新數據 看來我的猜想是正確的 於是我的總結是–LCD1602四線設置需要單獨設置
這樣我們也可以理解 液晶亂碼的問題了 亂碼說明你已經4線初始化成功 只是數據沒有正確寫入而已 因為如果沒有en=1; en=0; 第一次寫
write_1602(0,0×28);時低4位被作為一個新數據的高4位寫下一個數據時數據的高4位被作為了上一個數據的低4位 這樣你的數據完全被打亂了 但四線初始化
是成功了的 但顯示的就是亂碼咯~霍霍~~~~~~~

然後呢 我又把初始化這樣改了一下
rs=0;
en=1;
P1=(P1&0xf0)|0x02;
en=0;
write_1602(0,0×28);
結果很明顯 液晶正常工作 而這裡對液晶四線設置只用了半個數據(0010)就已經成功了 之後便可以正常寫入數據 所以我認為液晶4線制需要
單獨設置所以在最後我用write_1602(0,2);設置四線模式 大家也應該明白為什麼了吧~~~~~

以上是小弟的見解 有什麼不對的 還希望高手指點~

未經允許不得轉載:GoMCU » LCD1602四線驅動 i2c