新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用STC系列MCU的IO口直接驅(qū)動(dòng)段碼LCD

用STC系列MCU的IO口直接驅(qū)動(dòng)段碼LCD

作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
當(dāng)產(chǎn)品需要段碼LCD顯示時(shí),如果使用不帶LCD驅(qū)動(dòng)器的MCU,則需要外接LCD驅(qū)動(dòng)IC,這會(huì)增加成本和PCB面積。事實(shí)上,很多小項(xiàng)目,比如大量的小家電,需要顯示的段碼不多,常見的是4個(gè)8帶小數(shù)點(diǎn)或時(shí)鐘的冒號(hào)“:”,這樣如果使用IO口直接掃描顯示,則會(huì)減小PCB面積,降低成本。

但是,本方案不合適驅(qū)動(dòng)太多的段(占用IO太多),也不合適非常低功耗的場合。

本文引用地址:http://m.butianyuan.cn/article/201611/315897.htm

段碼LCD驅(qū)動(dòng)簡單原理:如圖1所示。

LCD是一種特殊的液態(tài)晶體,在電場的作用下晶體的排列方向會(huì)發(fā)生扭轉(zhuǎn),因而改變其透光性,從而可以看到顯示內(nèi)容。LCD有一個(gè)扭轉(zhuǎn)閥值,當(dāng)LCD兩端電壓高于此閥值時(shí),顯示內(nèi)容,低于此閥值時(shí),不顯示。通常LCD有3個(gè)參數(shù):工作電壓、DUTY(對(duì)應(yīng)COM數(shù))和BIAS(即偏壓,對(duì)應(yīng)閥值),比如4.5V、1/4DUTY、1/3BIAS,表示LCD顯示電壓為4.5V,4個(gè)COM,閥值大約是1.5V,當(dāng)加在某段LCD兩端電壓大于1.5V時(shí)(一般加4.5V)顯示,而加1.5V時(shí)不顯示。但是LCD對(duì)于驅(qū)動(dòng)電壓的反應(yīng)不是很明顯的,比如加2V時(shí),可能會(huì)微弱顯示,這就是通常說的“鬼影”。所以要保證驅(qū)動(dòng)顯示時(shí),要大于閥值電壓比較多,而不顯示時(shí),要用比閥值小比較多的電壓。

注意:LCD的兩端不能加直流電壓,否則時(shí)間稍長就會(huì)損壞,所以要保證加在LCD兩端的驅(qū)動(dòng)電壓的平均電壓為0。LCD使用時(shí)分割掃描法,任何時(shí)候一個(gè)COM掃描有效,另外的COM處于無效狀態(tài)。

驅(qū)動(dòng)1/4Duty1/2BIAS3V的方案電路見圖1,LCD掃描原理見圖3,MCU為3V工作,用雙向口做COM,PUSH-PULL或STANDARD輸出口接SEG,并且每個(gè)COM都接一個(gè)47K電阻到一個(gè)電容,RC濾波后得到一個(gè)中點(diǎn)電壓。在輪到某個(gè)COM掃描時(shí),設(shè)置成PUSH-PULL輸出,如果與本COM連接的SEG不顯示,則SEG輸出與COM同相,如果顯示,則反相。掃描完后,這個(gè)COM的IO就設(shè)置成高阻,這樣這個(gè)COM就通過47K電阻連接到1/2VDD電壓,而SEG繼續(xù)輸出方波,這樣加在LCD上的電壓,顯示時(shí)是+-VDD,不顯示時(shí)是+-1/2VDD,保證了LCD兩端平均直流電壓為0。

驅(qū)動(dòng)1/4Duty1/3BIAS3V的方案電路見圖4,LCD掃描原理見圖5,,MCU為5V工作,SEG線通過電阻分壓輸出1.5V、3.5V,COM線通過電阻分壓輸出0.5V、2.5V(高阻時(shí))、4.5V。在輪到某個(gè)COM掃描時(shí),設(shè)置成PUSH-PULL輸出,如果與本COM連接的SEG不顯示,則SEG輸出與COM同相,如果顯示,則反相。掃描完后,這個(gè)COM的IO就設(shè)置成高阻,這樣這個(gè)COM就通過47K電阻連接到2.5V電壓,而SEG繼續(xù)輸出方波,這樣加在LCD上的電壓,顯示時(shí)是+-3.0V,不顯示時(shí)是+-1.0V,完全滿足LCD的掃描要求。

當(dāng)需要睡眠省電時(shí),把所有COM和SEG驅(qū)動(dòng)IO全部輸出低電平,LCD驅(qū)動(dòng)部分不會(huì)增加額外電流。

圖1:驅(qū)動(dòng)1/4Duty1/2BIAS3VLCD的電路

圖2:段碼名稱圖

圖3:1/4Duty1/2BIAS掃描原理圖

圖4:驅(qū)動(dòng)1/4Duty1/3BIAS3VLCD的電路

圖5:1/4Duty1/3BIAS掃描原理圖

為了使用方便,顯示內(nèi)容放在一個(gè)顯存中,其中的各個(gè)位與LCD的段一一對(duì)應(yīng),見圖6。

圖6:LCD真值表和顯存影射表

圖7:驅(qū)動(dòng)效果照片

本LCD掃描程序僅需要兩個(gè)函數(shù):

1、LCD段碼掃描函數(shù)void LCD_scan(void)

程序隔一定的時(shí)間調(diào)用這個(gè)函數(shù),就會(huì)將LCD顯示緩沖的內(nèi)容顯示到LCD上,全部掃描一次需要8個(gè)調(diào)用周期,調(diào)用間隔一般是1~2ms,假如使用1ms,則掃描周期就是8ms,刷新率就是125HZ。

2、LCD段碼顯示緩沖裝載函數(shù)voidLCD_load(u8n,u8dat)

本函數(shù)用來將顯示的數(shù)字或字符放在LCD顯示緩沖中,比如LCD_load(1,6),就是要在第一個(gè)數(shù)字位置顯示數(shù)字6,支持顯示0~9,A~F,其它字符用戶可以自己添加。

另外,用宏來顯示、熄滅或閃爍冒號(hào)或小數(shù)點(diǎn)。

詳細(xì)的程序請(qǐng)從STC的官網(wǎng)www.stcmcu.com下載。

/******************LCD段碼掃描函數(shù)***************************

u8 codeT_COM[4]={0x08,0x04,0x02,0x01};

void LCD_scan(void) //5us@22.1184MHZ

{u8 j;

j=scan_index>>1;//COMx

P2n_pure_input(0x0f);//全部COM輸出高阻,COM為中點(diǎn)電壓

if(scan_index&1)//反相掃描

{P1=~LCD_buff[j]; //送SEG驅(qū)動(dòng)碼

P2=~(LCD_buff[j|4]&0xf0);//送SEG驅(qū)動(dòng)碼和COM驅(qū)動(dòng)碼

}

else //正相掃描

{P1=LCD_buff[j];//送SEG驅(qū)動(dòng)碼

P2=LCD_buff[j|4]&0xf0;//送SEG驅(qū)動(dòng)碼和COM驅(qū)動(dòng)碼

}

P2n_push_pull(T_COM[j]); //某個(gè)COM設(shè)置為推挽輸出

if(++scan_index>=8) scan_index=0;//掃描完成,重復(fù)掃描

}

/******************LCD段碼顯示緩沖裝載函數(shù)***************************/

/******************對(duì)第1~6數(shù)字裝載顯示函數(shù)***************************/

u8 codeT_LCD_mask[4]={~0xc0,~0x30,~0x0c,~0x03};

u8 codeT_LCD_mask4[4]={~0x40,~0x10,~0x04,~0x01};

void LCD_load(u8n,u8dat) //n為第幾個(gè)數(shù)字,為1~6,dat為要顯示的數(shù)字 10us@22.1184MHZ

{u8 i,k;

u8 *p;

if((n==0)||(n>6)) return;

i=t_display[dat];

if(n<=4) //1~4

{n--;

p=LCD_buff;

}

else

{n=n-5;

p=&LCD_buff[4];

}

k=0;

if(i&0x08) k|=0x40; //D

*p=(*p&T_LCD_mask4[n])|(k>>2*n);

p++;

k=0;

if(i&0x04) k|=0x40; //C

if(i&0x10) k|=0x80; //E

*p=(*p&T_LCD_mask[n])|(k>>2*n);

p++;

k=0;

if(i&0x02) k|=0x40; //B

if(i&0x40) k|=0x80; //G

*p=(*p&T_LCD_mask[n])|(k>>2*n);

p++;

k=0;

if(i&0x01) k|=0x40; //A

if(i&0x20) k|=0x80; //F

*p=(*p&T_LCD_mask[n])|(k>>2*n);

}

文檔完畢。



評(píng)論


技術(shù)專區(qū)

關(guān)閉