一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用arduino直接驅(qū)動(dòng)1602液晶顯示文字

 共同成長888 2015-06-30
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液晶接口引腳定義


01.JPG 

接口說明:
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液晶的基本操作分以下四種:


02.JPG 

下圖就是1602液晶實(shí)物圖

IMGP9978_調(diào)整大小.JPG 

IMGP9984_調(diào)整大小.JPG 

1602直接與arduino通信,根據(jù)產(chǎn)品手冊(cè)描述,分8位連接法與4位連接法,咱們先使用8位連接法進(jìn)行實(shí)驗(yàn)。硬件連接方式如下圖

Snap1.jpg 

IMGP9969_調(diào)整大小.JPG 

代碼如下
ARDUINO 代碼復(fù)制打印
  1. int DI = 12;
  2. int RW = 11;
  3. int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用數(shù)組來定義總線需要的管腳
  4. int Enable = 2;
  5.  
  6. void LcdCommandWrite(int value) {
  7. // 定義所有引腳
  8. int i = 0;
  9. for (i=DB[0]; i <= DI; i++) //總線賦值
  10. {
  11.    digitalWrite(i,value & 01);//因?yàn)?602液晶信號(hào)識(shí)別是D7-D0(不是D0-D7),這里是用來反轉(zhuǎn)信號(hào)。
  12.    value >>= 1;
  13. }
  14. digitalWrite(Enable,LOW);
  15. delayMicroseconds(1);
  16. digitalWrite(Enable,HIGH);
  17. delayMicroseconds(1);  // 延時(shí)1ms
  18. digitalWrite(Enable,LOW);
  19. delayMicroseconds(1);  // 延時(shí)1ms
  20. }
  21.  
  22. void LcdDataWrite(int value) {
  23. // 定義所有引腳
  24. int i = 0;
  25. digitalWrite(DI, HIGH);
  26. digitalWrite(RW, LOW);
  27. for (i=DB[0]; i <= DB[7]; i++) {
  28.    digitalWrite(i,value & 01);
  29.    value >>= 1;
  30. }
  31. digitalWrite(Enable,LOW);
  32. delayMicroseconds(1);
  33. digitalWrite(Enable,HIGH);
  34. delayMicroseconds(1);
  35. digitalWrite(Enable,LOW);
  36. delayMicroseconds(1);  // 延時(shí)1ms
  37. }
  38.  
  39. void setup (void) {
  40. int i = 0;
  41. for (i=Enable; i <= DI; i++) {
  42.    pinMode(i,OUTPUT);
  43. }
  44. delay(100);
  45. // 短暫的停頓后初始化LCD
  46. // 用于LCD控制需要
  47. LcdCommandWrite(0x38);  // 設(shè)置為8-bit接口,2行顯示,5x7文字大小                     
  48. delay(64);                     
  49. LcdCommandWrite(0x38);  // 設(shè)置為8-bit接口,2行顯示,5x7文字大小                        
  50. delay(50);                     
  51. LcdCommandWrite(0x38);  // 設(shè)置為8-bit接口,2行顯示,5x7文字大小                        
  52. delay(20);                     
  53. LcdCommandWrite(0x06);  // 輸入方式設(shè)定
  54.                          // 自動(dòng)增量,沒有顯示移位
  55. delay(20);                     
  56. LcdCommandWrite(0x0E);  // 顯示設(shè)置
  57.                          // 開啟顯示屏,光標(biāo)顯示,無閃爍
  58. delay(20);                     
  59. LcdCommandWrite(0x01);  // 屏幕清空,光標(biāo)位置歸零  
  60. delay(100);                     
  61. LcdCommandWrite(0x80);  // 顯示設(shè)置
  62.                          // 開啟顯示屏,光標(biāo)顯示,無閃爍
  63. delay(20);                     
  64. }
  65.  
  66. void loop (void) {
  67.   LcdCommandWrite(0x01);  // 屏幕清空,光標(biāo)位置歸零  
  68.   delay(10);
  69.   LcdCommandWrite(0x80+3);
  70.   delay(10);                     
  71.   // 寫入歡迎信息
  72.   LcdDataWrite('W');
  73.   LcdDataWrite('e');
  74.   LcdDataWrite('l');
  75.   LcdDataWrite('c');
  76.   LcdDataWrite('o');
  77.   LcdDataWrite('m');
  78.   LcdDataWrite('e');
  79.   LcdDataWrite(' ');
  80.   LcdDataWrite('t');
  81.   LcdDataWrite('o');
  82.   delay(10);
  83.   LcdCommandWrite(0xc0+1);  // 定義光標(biāo)位置為第二行第二個(gè)位置  
  84.   delay(10);
  85.   LcdDataWrite('g');
  86.   LcdDataWrite('e');
  87.   LcdDataWrite('e');
  88.   LcdDataWrite('k');
  89.   LcdDataWrite('-');
  90.   LcdDataWrite('w');
  91.   LcdDataWrite('o');
  92.   LcdDataWrite('r');
  93.   LcdDataWrite('k');
  94.   LcdDataWrite('s');
  95.   LcdDataWrite('h');
  96.   LcdDataWrite('o');
  97.   LcdDataWrite('p');
  98.   delay(5000);
  99.   LcdCommandWrite(0x01);  // 屏幕清空,光標(biāo)位置歸零  
  100.   delay(10);
  101.   LcdDataWrite('I');
  102.   LcdDataWrite(' ');
  103.   LcdDataWrite('a');
  104.   LcdDataWrite('m');
  105.   LcdDataWrite(' ');
  106.   LcdDataWrite('h');
  107.   LcdDataWrite('o');
  108.   LcdDataWrite('n');
  109.   LcdDataWrite('g');
  110.   LcdDataWrite('y');
  111.   LcdDataWrite('i');
  112.   delay(3000);
  113.   LcdCommandWrite(0x02); //設(shè)置模式為新文字替換老文字,無新文字的地方顯示不變。
  114.   delay(10);
  115.   LcdCommandWrite(0x80+5); //定義光標(biāo)位置為第一行第六個(gè)位置
  116.   delay(10);  
  117.   LcdDataWrite('t');
  118.   LcdDataWrite('h');
  119.   LcdDataWrite('e');
  120.   LcdDataWrite(' ');
  121.   LcdDataWrite('a');
  122.   LcdDataWrite('d');
  123.   LcdDataWrite('m');
  124.   LcdDataWrite('i');
  125.   LcdDataWrite('n');
  126.   delay(5000);
  127. }
實(shí)驗(yàn)效果如下


4位接法

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

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


Snap2.jpg 

IMGP9997_調(diào)整大小.jpg 

硬件接好后把下面的代碼上傳到控制板上,看看效果。
ARDUINO 代碼復(fù)制打印
  1. int LCD1602_RS=12;   
  2. int LCD1602_RW=11;   
  3. int LCD1602_EN=10;   
  4. int DB[] = { 6, 7, 8, 9};
  5. char str1[]="Welcome to";
  6. char str2[]="geek-workshop";
  7. char str3[]="this is the";
  8. char str4[]="4-bit interface";
  9.  
  10. void LCD_Command_Write(int command)
  11. {
  12. int i,temp;
  13. digitalWrite( LCD1602_RS,LOW);
  14. digitalWrite( LCD1602_RW,LOW);
  15. digitalWrite( LCD1602_EN,LOW);
  16.  
  17. temp=command & 0xf0;
  18. for (i=DB[0]; i <= 9; i++)
  19. {
  20.    digitalWrite(i,temp & 0x80);
  21.    temp <<= 1;
  22. }
  23.  
  24. digitalWrite( LCD1602_EN,HIGH);
  25. delayMicroseconds(1);
  26. digitalWrite( LCD1602_EN,LOW);
  27.  
  28. temp=(command & 0x0f)<<4;
  29. for (i=DB[0]; i <= 9; i++)
  30. {
  31.    digitalWrite(i,temp & 0x80);
  32.    temp <<= 1;
  33. }
  34.  
  35. digitalWrite( LCD1602_EN,HIGH);
  36. delayMicroseconds(1);
  37. digitalWrite( LCD1602_EN,LOW);
  38. }
  39.  
  40. void LCD_Data_Write(int dat)
  41. {
  42. int i=0,temp;
  43. digitalWrite( LCD1602_RS,HIGH);
  44. digitalWrite( LCD1602_RW,LOW);
  45. digitalWrite( LCD1602_EN,LOW);
  46.  
  47. temp=dat & 0xf0;
  48. for (i=DB[0]; i <= 9; i++)
  49. {
  50.    digitalWrite(i,temp & 0x80);
  51.    temp <<= 1;
  52. }
  53.  
  54. digitalWrite( LCD1602_EN,HIGH);
  55. delayMicroseconds(1);
  56. digitalWrite( LCD1602_EN,LOW);
  57.  
  58. temp=(dat & 0x0f)<<4;
  59. for (i=DB[0]; i <= 9; i++)
  60. {
  61.    digitalWrite(i,temp & 0x80);
  62.    temp <<= 1;
  63. }
  64.  
  65. digitalWrite( LCD1602_EN,HIGH);
  66. delayMicroseconds(1);
  67. digitalWrite( LCD1602_EN,LOW);
  68. }
  69.  
  70. void LCD_SET_XY( int x, int y )
  71. {
  72.   int address;
  73.   if (y ==0)    address = 0x80 + x;
  74.   else          address = 0xC0 + x;
  75.   LCD_Command_Write(address);
  76. }
  77.  
  78. void LCD_Write_Char( int x,int y,int dat)
  79. {
  80.   LCD_SET_XY( x, y );
  81.   LCD_Data_Write(dat);
  82. }
  83.  
  84. void LCD_Write_String(int X,int Y,char *s)
  85. {
  86.     LCD_SET_XY( X, Y );    //設(shè)置地址
  87.     while (*s)             //寫字符串
  88.     {
  89.       LCD_Data_Write(*s);   
  90.       s ++;
  91.     }
  92. }
  93.  
  94. void setup (void)
  95. {
  96.   int i = 0;
  97.   for (i=6; i <= 12; i++)
  98.    {
  99.      pinMode(i,OUTPUT);
  100.    }
  101.   delay(100);
  102.   LCD_Command_Write(0x28);//4線 2行 5x7
  103.   delay(50);
  104.   LCD_Command_Write(0x06);
  105.   delay(50);
  106.   LCD_Command_Write(0x0c);
  107.   delay(50);
  108.   LCD_Command_Write(0x80);
  109.   delay(50);
  110.   LCD_Command_Write(0x01);
  111.   delay(50);
  112.  
  113. }
  114.  
  115. void loop (void)
  116. {
  117.    LCD_Command_Write(0x01);
  118.    delay(50);
  119.    LCD_Write_String(3,0,str1);//第1行,第4個(gè)地址起
  120.    delay(50);
  121.    LCD_Write_String(1,1,str2);//第2行,第2個(gè)地址起
  122.    delay(5000);
  123.    LCD_Command_Write(0x01);
  124.    delay(50);
  125.    LCD_Write_String(0,0,str3);
  126.    delay(50);
  127.    LCD_Write_String(0,1,str4);
  128.    delay(5000);
  129.  
  130. }

4位接法實(shí)驗(yàn)效果如下




這里我們講解一下最關(guān)鍵的部分,就是LCD的控制命令。
在上面兩段代碼中,我們常常可以遇到0x01,0x38這種參數(shù)。這些參數(shù)代表什么呢?
在C/C++語言中,0x38代表的是十六進(jìn)制的數(shù)值"38","0x"的意思就是十六進(jìn)制。
先打開win7下的計(jì)算器,選擇“程序員”“基本”,


Snap3.jpg 

然后咱們選擇“十六進(jìn)制”,輸入“38”,

Snap5.jpg 

然后再點(diǎn)擊“二進(jìn)制”。這時(shí)十六進(jìn)制的“38”就會(huì)轉(zhuǎn)換為二進(jìn)制下的數(shù)值“111000”。

Snap6.jpg 

以8位控制法接LCD是,對(duì)應(yīng)的控制信息就是“00111000”

0x38.jpg 

同理,也可以把二進(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è),供大家深入研究。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本欧美一区二区三区在线播| 三级理论午夜福利在线看| 国产盗摄精品一区二区视频| 国产又粗又黄又爽又硬的| 亚洲中文字幕三区四区| 一区二区不卡免费观看免费| 亚洲精品国男人在线视频| 久久永久免费一区二区| 日本加勒比在线观看一区| 手机在线观看亚洲中文字幕| 中文字幕日韩欧美亚洲午夜 | 国产精品乱子伦一区二区三区| 亚洲国产成人av毛片国产| 色婷婷日本视频在线观看| 成人欧美精品一区二区三区| 国产精品午夜福利免费在线| 精品国产亚洲区久久露脸| 国产免费一区二区不卡| 日韩三极片在线免费播放| 在线观看那种视频你懂的| 国产在线一区二区免费| 99久久无色码中文字幕免费| 色综合久久六月婷婷中文字幕| 亚洲av熟女一区二区三区蜜桃| 国产精品亚洲一区二区| 亚洲精品福利视频你懂的| 成人免费视频免费观看| 婷婷激情四射在线观看视频| 欧美色婷婷综合狠狠爱| 亚洲av秘片一区二区三区| 国产精品一区欧美二区| 亚洲国产天堂av成人在线播放| 日韩欧美三级视频在线| 无套内射美女视频免费在线观看| 加勒比人妻精品一区二区| 国产精品第一香蕉视频| 在线免费国产一区二区三区| 亚洲欧美一二区日韩高清在线| 国产一区国产二区在线视频| 亚洲精品偷拍一区二区三区| 亚洲国产丝袜一区二区三区四|