1602液晶在應(yīng)用中非常廣泛,最初的1602液晶使用的是HD44780控制器,現(xiàn)在各個(gè)廠家的1602模塊基本上都是采用了與之兼容的IC,所以特性上基本都是一致的。
1602LCD主要技術(shù)參數(shù) 顯示容量為16×2個(gè)字符; 芯片工作電壓為4.5~5.5V; 工作電流為2.0mA(5.0V); 模塊最佳工作電壓為5.0V; 字符尺寸為2.95×4.35(W×H)mm。
1602液晶接口引腳定義
接口說明: 1、兩組電源 一組是模塊的電源 一組是背光板的電源 一般均使用5V供電。本次試驗(yàn)背光使用3.3V供電也可以工作。 2、VL是調(diào)節(jié)對(duì)比度的引腳,串聯(lián)不大于5KΩ的電位器進(jìn)行調(diào)節(jié)。本次實(shí)驗(yàn)使用1KΩ的電阻來設(shè)定對(duì)比度。其連接分高電位與低電位接法,本次使用低電位接法,串聯(lián)1KΩ電阻后接GND。 注意:不同液晶的對(duì)比度電阻是不同的,最好是接一個(gè)電位器進(jìn)行測(cè)試,本次實(shí)驗(yàn)使用的1KΩ電阻在其他液晶上不一定正確。 3、RS 是很多液晶上都有的引腳 是命令/數(shù)據(jù)選擇引腳 該腳電平為高時(shí)表示將進(jìn)行數(shù)據(jù)操作;為低時(shí)表示進(jìn)行命令操作。 4、RW 也是很多液晶上都有的引腳 是讀寫選擇端 該腳電平為高是表示要對(duì)液晶進(jìn)行讀操作;為低時(shí)表示要進(jìn)行寫操作。 5、E 同樣很多液晶模塊有此引腳 通常在總線上信號(hào)穩(wěn)定后給一正脈沖通知把數(shù)據(jù)讀走,在此腳為高電平的時(shí)候總線不允許變化。 6、D0—D7 8 位雙向并行總線,用來傳送命令和數(shù)據(jù)。 7、BLA是背光源正極,BLK是背光源負(fù)極。
1602液晶的基本操作分以下四種:
下圖就是1602液晶實(shí)物圖
1602直接與arduino通信,根據(jù)產(chǎn)品手冊(cè)描述,分8位連接法與4位連接法,咱們先使用8位連接法進(jìn)行實(shí)驗(yàn)。硬件連接方式如下圖
代碼如下int DI = 12; int RW = 11; int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用數(shù)組來定義總線需要的管腳 int Enable = 2; void LcdCommandWrite(int value) { // 定義所有引腳 int i = 0; for (i=DB[0]; i <= DI; i++) //總線賦值 { digitalWrite(i,value & 01);//因?yàn)?602液晶信號(hào)識(shí)別是D7-D0(不是D0-D7),這里是用來反轉(zhuǎn)信號(hào)。 value >>= 1; } digitalWrite(Enable,LOW); delayMicroseconds(1); digitalWrite(Enable,HIGH); delayMicroseconds(1); // 延時(shí)1ms digitalWrite(Enable,LOW); delayMicroseconds(1); // 延時(shí)1ms } void LcdDataWrite(int value) { // 定義所有引腳 int i = 0; digitalWrite(DI, HIGH); digitalWrite(RW, LOW); for (i=DB[0]; i <= DB[7]; i++) { digitalWrite(i,value & 01); value >>= 1; } digitalWrite(Enable,LOW); delayMicroseconds(1); digitalWrite(Enable,HIGH); delayMicroseconds(1); digitalWrite(Enable,LOW); delayMicroseconds(1); // 延時(shí)1ms } void setup (void) { int i = 0; for (i=Enable; i <= DI; i++) { pinMode(i,OUTPUT); } delay(100); // 短暫的停頓后初始化LCD // 用于LCD控制需要 LcdCommandWrite(0x38); // 設(shè)置為8-bit接口,2行顯示,5x7文字大小 delay(64); LcdCommandWrite(0x38); // 設(shè)置為8-bit接口,2行顯示,5x7文字大小 delay(50); LcdCommandWrite(0x38); // 設(shè)置為8-bit接口,2行顯示,5x7文字大小 delay(20); LcdCommandWrite(0x06); // 輸入方式設(shè)定 // 自動(dòng)增量,沒有顯示移位 delay(20); LcdCommandWrite(0x0E); // 顯示設(shè)置 // 開啟顯示屏,光標(biāo)顯示,無閃爍 delay(20); LcdCommandWrite(0x01); // 屏幕清空,光標(biāo)位置歸零 delay(100); LcdCommandWrite(0x80); // 顯示設(shè)置 // 開啟顯示屏,光標(biāo)顯示,無閃爍 delay(20); } void loop (void) { LcdCommandWrite(0x01); // 屏幕清空,光標(biāo)位置歸零 delay(10); LcdCommandWrite(0x80+3); delay(10); // 寫入歡迎信息 LcdDataWrite('W'); LcdDataWrite('e'); LcdDataWrite('l'); LcdDataWrite('c'); LcdDataWrite('o'); LcdDataWrite('m'); LcdDataWrite('e'); LcdDataWrite(' '); LcdDataWrite('t'); LcdDataWrite('o'); delay(10); LcdCommandWrite(0xc0+1); // 定義光標(biāo)位置為第二行第二個(gè)位置 delay(10); LcdDataWrite('g'); LcdDataWrite('e'); LcdDataWrite('e'); LcdDataWrite('k'); LcdDataWrite('-'); LcdDataWrite('w'); LcdDataWrite('o'); LcdDataWrite('r'); LcdDataWrite('k'); LcdDataWrite('s'); LcdDataWrite('h'); LcdDataWrite('o'); LcdDataWrite('p'); delay(5000); LcdCommandWrite(0x01); // 屏幕清空,光標(biāo)位置歸零 delay(10); LcdDataWrite('I'); LcdDataWrite(' '); LcdDataWrite('a'); LcdDataWrite('m'); LcdDataWrite(' '); LcdDataWrite('h'); LcdDataWrite('o'); LcdDataWrite('n'); LcdDataWrite('g'); LcdDataWrite('y'); LcdDataWrite('i'); delay(3000); LcdCommandWrite(0x02); //設(shè)置模式為新文字替換老文字,無新文字的地方顯示不變。 delay(10); LcdCommandWrite(0x80+5); //定義光標(biāo)位置為第一行第六個(gè)位置 delay(10); LcdDataWrite('t'); LcdDataWrite('h'); LcdDataWrite('e'); LcdDataWrite(' '); LcdDataWrite('a'); LcdDataWrite('d'); LcdDataWrite('m'); LcdDataWrite('i'); LcdDataWrite('n'); delay(5000); }
實(shí)驗(yàn)效果如下
4位接法
在正常使用下,8位接法基本把a(bǔ)rduino的數(shù)字端口占滿了,如果想要多接幾個(gè)傳感器就沒有端口了,這種情況下怎么處理呢,咱們可以使用4位接法。
4位接法的硬件連接方法如下圖
硬件接好后把下面的代碼上傳到控制板上,看看效果。int LCD1602_RS=12; int LCD1602_RW=11; int LCD1602_EN=10; int DB[] = { 6, 7, 8, 9}; char str1[]="Welcome to"; char str2[]="geek-workshop"; char str3[]="this is the"; char str4[]="4-bit interface"; void LCD_Command_Write(int command) { int i,temp; digitalWrite( LCD1602_RS,LOW); digitalWrite( LCD1602_RW,LOW); digitalWrite( LCD1602_EN,LOW); temp=command & 0xf0; for (i=DB[0]; i <= 9; i++) { digitalWrite(i,temp & 0x80); temp <<= 1; } digitalWrite( LCD1602_EN,HIGH); delayMicroseconds(1); digitalWrite( LCD1602_EN,LOW); temp=(command & 0x0f)<<4; for (i=DB[0]; i <= 9; i++) { digitalWrite(i,temp & 0x80); temp <<= 1; } digitalWrite( LCD1602_EN,HIGH); delayMicroseconds(1); digitalWrite( LCD1602_EN,LOW); } void LCD_Data_Write(int dat) { int i=0,temp; digitalWrite( LCD1602_RS,HIGH); digitalWrite( LCD1602_RW,LOW); digitalWrite( LCD1602_EN,LOW); temp=dat & 0xf0; for (i=DB[0]; i <= 9; i++) { digitalWrite(i,temp & 0x80); temp <<= 1; } digitalWrite( LCD1602_EN,HIGH); delayMicroseconds(1); digitalWrite( LCD1602_EN,LOW); temp=(dat & 0x0f)<<4; for (i=DB[0]; i <= 9; i++) { digitalWrite(i,temp & 0x80); temp <<= 1; } digitalWrite( LCD1602_EN,HIGH); delayMicroseconds(1); digitalWrite( LCD1602_EN,LOW); } void LCD_SET_XY( int x, int y ) { int address; if (y ==0) address = 0x80 + x; else address = 0xC0 + x; LCD_Command_Write(address); } void LCD_Write_Char( int x,int y,int dat) { LCD_SET_XY( x, y ); LCD_Data_Write(dat); } void LCD_Write_String(int X,int Y,char *s) { LCD_SET_XY( X, Y ); //設(shè)置地址 while (*s) //寫字符串 { LCD_Data_Write(*s); s ++; } } void setup (void) { int i = 0; for (i=6; i <= 12; i++) { pinMode(i,OUTPUT); } delay(100); LCD_Command_Write(0x28);//4線 2行 5x7 delay(50); LCD_Command_Write(0x06); delay(50); LCD_Command_Write(0x0c); delay(50); LCD_Command_Write(0x80); delay(50); LCD_Command_Write(0x01); delay(50); } void loop (void) { LCD_Command_Write(0x01); delay(50); LCD_Write_String(3,0,str1);//第1行,第4個(gè)地址起 delay(50); LCD_Write_String(1,1,str2);//第2行,第2個(gè)地址起 delay(5000); LCD_Command_Write(0x01); delay(50); LCD_Write_String(0,0,str3); delay(50); LCD_Write_String(0,1,str4); delay(5000); }
4位接法實(shí)驗(yàn)效果如下
這里我們講解一下最關(guān)鍵的部分,就是LCD的控制命令。 在上面兩段代碼中,我們常常可以遇到0x01,0x38這種參數(shù)。這些參數(shù)代表什么呢? 在C/C++語言中,0x38代表的是十六進(jìn)制的數(shù)值"38","0x"的意思就是十六進(jìn)制。 先打開win7下的計(jì)算器,選擇“程序員”“基本”,
然后咱們選擇“十六進(jìn)制”,輸入“38”,
然后再點(diǎn)擊“二進(jìn)制”。這時(shí)十六進(jìn)制的“38”就會(huì)轉(zhuǎn)換為二進(jìn)制下的數(shù)值“111000”。
以8位控制法接LCD是,對(duì)應(yīng)的控制信息就是“00111000”
同理,也可以把二進(jìn)制的控制信息,逆運(yùn)算為十六進(jìn)制的。
有的產(chǎn)品說明書寫的控制命令是"38H" 這里說明一下,一般情況下 十六進(jìn)制 前綴0x 后綴h 十進(jìn)制 后綴D 八進(jìn)制 后綴Q 二進(jìn)制 后綴B 但是不同的程序語言,對(duì)于十六進(jìn)制的表達(dá)方式不完全相同,在arduino下,表達(dá)十六進(jìn)制數(shù)值“38”只能使用“0x38”而不能用“38H”
最后放三個(gè)附件,是三個(gè)不同廠家的1602 LCD手冊(cè),供大家深入研究。 |
|
|