|
四位總線驅(qū)動LCD1602
很多人都因?yàn)樵谑褂肔CD1602的液晶屏做電子制作時(shí)都有這樣一個(gè)煩惱,LCD占用的IO口太多了,傳統(tǒng)的八位總線驅(qū)動加上三個(gè)控制位就占用了11個(gè)接口。往往都是因?yàn)檫@個(gè)問題導(dǎo)致原本20腳單片機(jī)能做的事情現(xiàn)在得用28腳或40腳的單片機(jī)做了。有什么解決方案嗎?.......當(dāng)然是有啦。如果你正在被以上的問題困擾著,或者你是追求電路精簡、完美的DIYer,那就繼續(xù)看下去。這篇文章將會教你怎么用四位總線驅(qū)動LCD1602液晶屏,從11個(gè)IO口控制LCD變成7個(gè)IO口控制LCD將會大大減少你電路上的復(fù)雜度。
接線圖
四位總線IO口改怎么驅(qū)動呢? 看看下面的接線圖, Px.4接DB4 Px.5接DB5以此類推,接到DB7時(shí)就用了4個(gè)IO口,是不是大大的減少了電路上的復(fù)雜哈。
這是LCD的接口定義。看看就行 ,主要看上面的接線圖
DB7測忙: 測忙就是看看LCD現(xiàn)在的狀態(tài)看看他在不在忙處理你上次給他的命令,如果他忙完了,才可以給他發(fā)送下一個(gè)命令
注意:單片機(jī)每次對LCD進(jìn)行讀寫時(shí)都需要對DB7進(jìn)行監(jiān)測,確保DB7為0才能讀寫。
void read_busy() //測忙的函數(shù) 看看LCD有空處理你的指令沒,有空了,就可以給它發(fā)數(shù)據(jù)了
{ // 根據(jù)上面圖片1.1讀狀態(tài)寫函數(shù)。
RS=0;RW=1;//因?yàn)闇y忙是要從LCD讀出狀態(tài),所以根據(jù)上面的操作時(shí)序表寫程序就是這樣,L就是0(低電平)H就是1(高電平)
DB7=1; //如果LCD不忙的話他就會給出一個(gè)低電平在DB7,我們這先拉高電平,做準(zhǔn)備接他的低電平
E=1; //E=H所以拉高電平
while(DB7); //等待返回一個(gè)低電平就可以執(zhí)行下一步了。
E=0; //E置0,方便下面的函數(shù)用
}
函數(shù)里面的RS、RW、E、DB7需要定義sbit 根據(jù)上面的接線圖定義應(yīng)該是:
sbit RW=P3^1;
sbit RS=P3^0;
sbit E =P3^5;
sbit DB7=P1^7;
void write_data(unsigned char c,unsigned char a) //發(fā)送指令函數(shù)。i=0寫指令 i=1寫數(shù)據(jù)
定義了兩個(gè)子程序參數(shù)
{
read_busy(); //先測忙,調(diào)用了上面那個(gè)函數(shù)
RS=a;RW=0;//根據(jù)基本操作時(shí)序圖,RS=1 RW=0時(shí)是寫數(shù)據(jù),也就是你要顯示在LCD上的數(shù)據(jù)。RS=0 RW=0時(shí)是寫指令,指令就是讓它對自己的一些處理,下面圖是指令說明
P1=c/16*16;//這里就是到送指令的命令了,送高四位
E=1;//每次送完要給E一個(gè)脈沖
E=0;//要拉低為下面的做準(zhǔn)備
P1=c%16*16; //送低四位
E=1; //送完給E一個(gè)脈沖
E=0; //拉低E
}
程序說明:
P1=c/16*16;//這里就是到送指令的命令了,送高四位
E=1; //每次送完要給E一個(gè)脈沖
E=0; //要拉低為下面的做準(zhǔn)備
P1=c%16*16; //送低四位
E=1; //送完給E一個(gè)脈沖
E=0; //拉低E
P1=c/16*16;//這里就是到送指令的命令了,送高四位
P1=c%16*16; //送低四位
c/16*16 這是把指令的高四位取出來 /就是整除
比如說 指令是0xAF; 經(jīng)過這個(gè)公式的運(yùn)算就出來就是 0xA0;高四位就出來了;
C%16*16 這是把指令的低四位取出來 %就是除余 得的是余數(shù)
經(jīng)過這個(gè)公式的運(yùn)算就出來就是 0xF0;低四位就出來了;
在分兩次送入LCD。
送完一次要給E一個(gè)高脈沖就是E=1;E=0;
指令說明:
說明一下上面這個(gè)圖怎么用(會LCD 8位總線的可以跳過)
比如4.1.2 顯示開/關(guān)及光標(biāo)設(shè)置
指令碼是: 0 0 0 0 1 D C B D是開液晶屏的顯示 1為開 所以D我們把它置1就是 0 0 0 0 1 1 C B 這樣設(shè)置
例子:
我要開顯示,不顯示光標(biāo),光標(biāo)閃爍 就是 D=1 C=0 B=1
指令碼就是 0 0 0 0 1 1 0 1 這是2進(jìn)制數(shù),在C語言里要用16進(jìn)制數(shù),所以轉(zhuǎn)換成16進(jìn)制數(shù)就是0x0D
操作步驟:
有了上面那兩個(gè)低層的函數(shù)。我們就可以對LCD進(jìn)行操作了。
1、首先要多LCD進(jìn)行初始化
要用到上面write_data的函數(shù)。我們用一個(gè)函數(shù)把他再次封裝起來
void LCD_initialization()
{
write_data(0x28,0); // 告訴LCD我們要四位總線驅(qū)動 因?yàn)檫@是指令所有函數(shù)的參數(shù)就是(0x28,0)
write_data(0x01,0); //讓他清屏,數(shù)據(jù)指針清零
write_data(0x06,0); //這個(gè)是上面指令碼是 000001NS的設(shè)置 大家自己上去看看
write_data(0x0f,0); //設(shè)置光標(biāo) 開顯示,顯示光標(biāo),光標(biāo)閃爍
}//初始化用到的都是指令 所以write_data( ,0); 函數(shù)的第二個(gè)參數(shù)都是0
2、初始化完后就可以送入要顯示的函數(shù)了,用到的函數(shù)
void print(unsigned char a,unsigned char *str) //送入顯示的數(shù)據(jù)
{//函數(shù)參數(shù)說明,a你要送入的地址,看下圖 如果是在第一行第二個(gè)顯示就是0x01,*str這個(gè)就填你要顯示的字
write_data(a | 0x80,0);
while(*str != '\0')
{
write_data(*str++,1); //因?yàn)樗腿氲氖秋@示的字所以第二個(gè)參數(shù)為1
}
*str = 0;
}
|
|