Arduino入門到精通第36課:1602液晶實驗(組圖) - 文昌市Arduino學院論壇 - 海南省文昌市學校大全


Arduino入門到精通第36課:1602液晶實驗(組圖)




本次試驗使用arduino直接驅動1602液晶顯示文字

1602液晶在應用中非常廣泛,最初的1602液晶使用的是HD44780控制器,現在各個廠家的1602模塊基本上都是采用了與之兼容的IC,所以特性上基本都是一致的。

1602LCD主要技術參數
顯示容量為16×2個字符;
芯片工作電壓為4.5~5.5V;
工作電流為2.0mA(5.0V);
模塊最佳工作電壓為5.0V;
字符尺寸為2.95×4.35(W×H)mm。

1602液晶接口引腳定義

01.JPG

接口說明:
1、兩組電源 一組是模塊的電源 一組是背光板的電源 一般均使用5V供電。本次試驗背光使用3.3V供電也可以工作。
2、VL是調節對比度的引腳,串聯不大于5KΩ的電位器進行調節。本次實驗使用1KΩ的電阻來設定對比度。其連接分高電位與低電位接法,本次使用低電位接法,串聯1KΩ電阻后接GND。
3、RS 是很多液晶上都有的引腳 是命令/數據選擇引腳 該腳電平為高時表示將進行數據操作;為低時表示進行命令操作。
4、RW 也是很多液晶上都有的引腳 是讀寫選擇端 該腳電平為高是表示要對液晶進行讀操作;為低時表示要進行寫操作。
5、E 同樣很多液晶模塊有此引腳 通常在總線上信號穩定后給一正脈沖通知把數據讀走,在此腳為高電平的時候總線不允許變化。
6、D0—D7 8 位雙向并行總線,用來傳送命令和數據。
7、BLA是背光源正極,BLK是背光源負極。

1602液晶的基本操作分以下四種:

02.JPG

下圖就是1602液晶實物圖

IMGP9978_調整大小.JPG

IMGP9984_調整大小.JPG



1602直接與arduino通信,根據產品手冊描述,分8位連接法與4位連接法,咱們先使用8位連接法進行實驗。硬件連接方式如下圖

Snap1.jpg

IMGP9969_調整大小.JPG


代碼如下

int DI = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用數組來定義總線需要的管腳
int Enable = 2;

void LcdCommandWrite(int value) {
// 定義所有引腳
int i = 0;
for (i=DB[0]; i <= DI; i++) //總線賦值
{
   digitalWrite(i,value & 01);//因為1602液晶信號識別是D7-D0(不是D0-D7),這里是用來反轉信號。
   value >>= 1;
}
digitalWrite(Enable,LOW);
delayMicroseconds(1);
digitalWrite(Enable,HIGH);
delayMicroseconds(1);  // 延時1ms
digitalWrite(Enable,LOW);
delayMicroseconds(1);  // 延時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);  // 延時1ms
}

void setup (void) {
int i = 0;
for (i=Enable; i <= DI; i++) {
   pinMode(i,OUTPUT);
}
delay(100);
// 短暫的停頓后初始化LCD
// 用于LCD控制需要
LcdCommandWrite(0x38);  // 設置為8-bit接口,2行顯示,5x7文字大小                     
delay(64);                     
LcdCommandWrite(0x38);  // 設置為8-bit接口,2行顯示,5x7文字大小                        
delay(50);                     
LcdCommandWrite(0x38);  // 設置為8-bit接口,2行顯示,5x7文字大小                        
delay(20);                     
LcdCommandWrite(0x06);  // 輸入方式設定
                         // 自動增量,沒有顯示移位
delay(20);                     
LcdCommandWrite(0x0E);  // 顯示設置
                         // 開啟顯示屏,光標顯示,無閃爍
delay(20);                     
LcdCommandWrite(0x01);  // 屏幕清空,光標位置歸零  
delay(100);                     
LcdCommandWrite(0x80);  // 顯示設置
                         // 開啟顯示屏,光標顯示,無閃爍
delay(20);                     
}

void loop (void) {
  LcdCommandWrite(0x01);  // 屏幕清空,光標位置歸零  
  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);  // 定義光標位置為第二行第二個位置  
  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);  // 屏幕清空,光標位置歸零  
  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); //設置模式為新文字替換老文字,無新文字的地方顯示不變。
  delay(10);
  LcdCommandWrite(0x80+5); //定義光標位置為第一行第六個位置
  delay(10);  
  LcdDataWrite(’t’);
  LcdDataWrite(’h’);
  LcdDataWrite(’e’);
  LcdDataWrite(’ ’);
  LcdDataWrite(’a’);
  LcdDataWrite(’d’);
  LcdDataWrite(’m’);
  LcdDataWrite(’i’);
  LcdDataWrite(’n’);
  delay(5000);
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int DI = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用數組來定義總線需要的管腳
int Enable = 2;

void LcdCommandWrite(int value) {
 // 定義所有引腳
 int i = 0;
 for (i=DB[0]; i <= DI; i++) //總線賦值
{
   digitalWrite(i,value & 01);//因為1602液晶信號識別是D7-D0(不是D0-D7),這里是用來反轉信號。
   value >>= 1;
 }
 digitalWrite(Enable,LOW);
 delayMicroseconds(1);
 digitalWrite(Enable,HIGH);
 delayMicroseconds(1);  // 延時1ms
 digitalWrite(Enable,LOW);
 delayMicroseconds(1);  // 延時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);  // 延時1ms
}

void setup (void) {
 int i = 0;
 for (i=Enable; i <= DI; i++) {
   pinMode(i,OUTPUT);
 }
 delay(100);
 // 短暫的停頓后初始化LCD
 // 用于LCD控制需要
 LcdCommandWrite(0x38);  // 設置為8-bit接口,2行顯示,5x7文字大小                     
 delay(64);                      
 LcdCommandWrite(0x38);  // 設置為8-bit接口,2行顯示,5x7文字大小                        
 delay(50);                      
 LcdCommandWrite(0x38);  // 設置為8-bit接口,2行顯示,5x7文字大小                        
 delay(20);                      
 LcdCommandWrite(0x06);  // 輸入方式設定
                         // 自動增量,沒有顯示移位
 delay(20);                      
 LcdCommandWrite(0x0E);  // 顯示設置
                         // 開啟顯示屏,光標顯示,無閃爍
 delay(20);                      
 LcdCommandWrite(0x01);  // 屏幕清空,光標位置歸零  
 delay(100);                      
 LcdCommandWrite(0x80);  // 顯示設置
                         // 開啟顯示屏,光標顯示,無閃爍
 delay(20);                      
}

void loop (void) {
  LcdCommandWrite(0x01);  // 屏幕清空,光標位置歸零  
  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);  // 定義光標位置為第二行第二個位置  
  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);  // 屏幕清空,光標位置歸零  
  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); //設置模式為新文字替換老文字,無新文字的地方顯示不變。
  delay(10);
  LcdCommandWrite(0x80+5); //定義光標位置為第一行第六個位置
  delay(10);  
  LcdDataWrite(’t’);
  LcdDataWrite(’h’);
  LcdDataWrite(’e’);
  LcdDataWrite(’ ’);
  LcdDataWrite(’a’);
  LcdDataWrite(’d’);
  LcdDataWrite(’m’);
  LcdDataWrite(’i’);
  LcdDataWrite(’n’);
  delay(5000);
}

4位接法

在正常使用下,8位接法基本把arduino的數字端口占滿了,如果想要多接幾個傳感器就沒有端口了,這種情況下怎么處理呢,咱們可以使用4位接法。

4位接法的硬件連接方法如下圖

Snap2.jpg

IMGP9997_調整大小.jpg



硬件接好后把下面的代碼上傳到控制板上,看看效果。

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 <= 10; 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 <= 10; 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 );    //設置地址
    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個地址起
   delay(50);
   LCD_Write_String(1,1,str2);//第2行,第2個地址起
   delay(5000);
   LCD_Command_Write(0x01);
   delay(50);
   LCD_Write_String(0,0,str3);
   delay(50);
   LCD_Write_String(0,1,str4);
   delay(5000);
   
}
普通瀏覽復制代碼保存代碼打印代碼
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 <= 10; 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 <= 10; 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 );    //設置地址 
    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個地址起
   delay(50);
   LCD_Write_String(1,1,str2);//第2行,第2個地址起
   delay(5000);
   LCD_Command_Write(0x01);
   delay(50);
   LCD_Write_String(0,0,str3);
   delay(50);
   LCD_Write_String(0,1,str4);
   delay(5000);
   
}


【相關精彩閱讀】
Arduino入門到精通第35課:紅外遙控解碼實驗(組圖)
http://www.dsbfho.live/t126560.html
Arduino入門到精通第34課:舵機控制實驗(組圖)
http://www.dsbfho.live/t126559.html

Arduino入門到精通第36課:1602液晶實驗(組圖)
此貼來源于:http://tieba.aiwenwen.com/tie/126561.html(查看完整版)
為避免你的回帖被刪除,請嚴格按照帖子內容和愛問問原則進行評論。
  •  放大   縮小
  • 驗證碼,看不清楚?請點擊刷新驗證碼 看不清楚?請點擊刷新驗證碼
  • 在網頁中搜索相關內容>> [每位會員第一次評論可獲5分]
  • 正在提交數據,請稍后……

特別推薦:心情不好,釋放自己,來玩發泄小游戲吧>> 极速时时彩官方开奖 庆时时彩下载版 百盈快三的技巧规律 淘客是怎样赚钱的 重庆时时开奖360走势图 时时彩三星走势图彩经网 抖音里刷宝赚钱是真的吗 北京塞车计划全天计划 彩票助赢计划软件手机版 福建11选5走势图完整 后二直选复式七码 广西快乐10分钟开奖结果 扑克牌比大小玩法示意图 幸运飞艇计划软件安卓 海南琼崖麻将有群进吗 天天捕鱼赢话费兑换码 欢乐捕鱼人的话费怎么用