PIC16F946中如何使用LCD
由PIC16F946的Datasheet中得知,將值寫到LCD做顯示有兩種方法
1.直接將值寫入LCDDATA1~LCDDATA23
2.利用斷開將值寫入LCDDATA1~LCDDATA23
第一種方法有一個(gè)缺點(diǎn)需判斷LCDPS里的WA,若WA=1,才可以寫入LCDDATA1~LCDDATA23
這在程序中是非常不好寫,也容易造成錯(cuò)誤,若WA=0時(shí)將值寫入LCDDATA1~LCDDATA23,會(huì)造成錯(cuò)誤(LCDCON的WERR會(huì)變成1),
若在程序中用回圈一直判斷WA是否為1然后再將值寫入LCDDATA,對(duì)系統(tǒng)而言這個(gè)等待時(shí)間太長了(幾個(gè)ms),且寫入錯(cuò)誤時(shí)
(WERR=1),不只值 沒有寫入成功,還需用軟件將WERR清為零,非常的不好用.
第二種方法只是比第一種麻煩一點(diǎn),它是在LCD允許你寫入時(shí)產(chǎn)生斷開,斷開可以寫入的時(shí)間為
TFRAME/(2*(LMUX<1:0>+1))+TCY/2
若是FRAME FREQUENCY=64Hz,TFRAME=1/64=15.625ms
我是用1/4 multiplex及1/3 LCD Bias,所以LMUX<1:0>=11
所以15.625/(2*(3+1))+TCY/2=15.625/8+TCY/2=1.953125+TCY/2,TCY是一個(gè)命令運(yùn)行的時(shí)間,這個(gè)可忽略不計(jì),因?yàn)橹堤×?
這約2ms的時(shí)間,表示你可以寫入LCDDATA的時(shí)間,以下是我的做法
斷開副程序如下
if(T0IE && T0IF)
{
//30ms斷開一次
LCDIE=1;
}
if(LCDIF && LCDIE)
{
LCDDATA0=lcddata0;
LCDDATA1=lcddata1;
LCDDATA2=lcddata2;
LCDDATA3=lcddata3;
LCDDATA4=lcddata4;
LCDDATA5=lcddata5;
LCDDATA6=lcddata6;
LCDDATA7=lcddata7;
LCDDATA8=lcddata8;
LCDDATA9=lcddata9;
LCDDATA10=lcddata10;
LCDDATA11=lcddata11;
LCDDATA12=lcddata12;
LCDDATA13=lcddata13;
LCDDATA14=lcddata14;
LCDDATA15=lcddata15;
LCDDATA16=lcddata16;
LCDDATA17=lcddata17;
LCDDATA18=lcddata18;
LCDDATA19=lcddata19;
LCDDATA20=lcddata20;
LCDDATA21=lcddata21;
LCDDATA22=lcddata22;
LCDDATA23=lcddata23;
LCDIE=0;
}
其中l(wèi)cddata1~lcddata23是自己定義的變量名稱,在主程序中需點(diǎn)亮某一段LCD,只需將lcddata1~lcddata23的bit設(shè) 為1即可,
當(dāng)然主程序中還需設(shè)置LCDPS,LCDCON,LCDSE0~LCDSE5及LCDIE,這樣的做法保證一定能將數(shù)據(jù)寫入LCDDATA且不會(huì)發(fā)生錯(cuò)誤,
因?yàn)門imer0 30ms才斷開一次也就是30ms才enable LCD的斷開,這樣的好處是LCD不會(huì)很頻繁的斷開,當(dāng)然30ms可以再延長,因?yàn)?/span>
畢竟人的眼睛沒法反應(yīng)那么快,這同時(shí)解決了LCDDATA不易寫入的問 題及LCD不會(huì)時(shí)常在斷開