LCD1602屏幕簡介(含代碼講解)【超級詳細(xì)教程】(lcd1602顯示屏介紹)
大家好,今天給大家介紹LCD1602屏幕,下方附有本文涉及的全部資料和源代碼的獲取方式,可進群免費領(lǐng)取。
1.接線說明
第1引腳:GND為電源地
第2引腳:VCC接5V電源正極
第3引腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。
第4引腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。
第5引腳:RW為讀寫信號線,高電平(1)時進行讀操作,以51為例的簡單原理圖低電平(0)時進行寫操作。
第6引腳:E(或EN)端為使能(enable)端,高電平(1)時讀取信息,負(fù)跳變時執(zhí)行指令。
第7~14引腳:D0~D7為8位雙向數(shù)據(jù)端。第15~16腳:空腳或背燈電源。第15引腳背光正極,第16引腳背光負(fù)極。
開發(fā)板接線圖:
2.LCD1602顯示原理
要想搞懂1602如何顯示,就只需搞懂兩個問題(在哪顯示,如何顯示)。
首先來說一下在哪顯示這個問題:
LCD1602可以顯示16*2個字符且通過D0-D7八個引腳傳輸數(shù)據(jù)八位數(shù)據(jù),每一個顯示的位置都對應(yīng)上圖的一個地址。例如我想在第一行的第三個位置顯示,那么就可以鎖定上表中的“02”,換算成二進制就是0000 0010。聽上去很簡單,但是LCD1602有個特點就是寫入顯示地址時要求最高位 D7 恒定為高電平。所以我們想顯示真實的地址應(yīng)該為1000 0010。
在哪顯示說清楚了,現(xiàn)在來搞怎么顯示這個問題:
在LCD1602的手冊中給出了這樣一個表格,我們想顯示表格中的字符只需獲取某個字符的高位和低位即可。例如我想顯示“B”這個字符,就是0100 0010轉(zhuǎn)換成16進制就是0x42,剛好對應(yīng)‘B’的ASCLL碼66。當(dāng)然我們在編程的時候無需這樣操作,只需輸入字符即可,編譯器會自動編譯成對應(yīng)的ASCLL碼。
說到這里會發(fā)現(xiàn)無論是傳輸?shù)刂返闹噶钸€是傳輸字符的指令都是通過D0-D7這八根線進行傳輸,那么我們什么時候傳輸?shù)臄?shù)據(jù),說明時候傳輸?shù)氖堑刂纺?。我們靠的是?602上的RS引腳,RS為高電平1時選擇數(shù)據(jù)寄存器(寫數(shù)據(jù))、低電平0時選擇指令寄存器(寫地址)。
3.LCD1602時序分析
LCD1602的時序分為讀操作時序和寫操作時序,我們先分析一下最重要的寫操作時序。我們無論是寫入數(shù)據(jù)還是寫入地址都必須要執(zhí)行寫操作,因此我們在編程是最好封裝兩個函數(shù)(寫地址函數(shù),寫數(shù)據(jù)函數(shù))。
寫時序分析
首先看RS,RS的時序分析非常簡單就正如上文所說我們只需搞清楚到底是是寫地址還是寫數(shù)據(jù) ,寫地址為0,寫數(shù)據(jù)為1即可,沒有太多好分析的。
R/W:可以從途中看出來R/W的時序低電平貫穿了整個時序,因此我們將R/W置0即可。
E:初始狀態(tài)為0,然后延時至少tR之后置1(tR的值參考上表,25ns執(zhí)行一個_nop_();函數(shù)即可),置1后要延時至少tPW(上圖給出的tPW值為150ns,建議執(zhí)行兩個_nop_();函數(shù)),接著再至少延時tF(執(zhí)行一個_nop_();函數(shù))后置0。
代碼如下(基于51單片機),其它單片機此原理都可適用。
#include "reg52.h"#include "intrins.h"#include "delay.h" #define databuffer P0 //定義D0-D7引腳sbit EN = P2^7;sbit RS = P2^6;sbit RW = P2^5; void Write_cmd_Func(char cmd) //寫命令函數(shù){ check_busy(); //檢測忙信號函數(shù) RS = 0; //RS為低電平:寫指令 RW = 0; EN = 0; _nop_(); //執(zhí)行一個空函數(shù),延時約1us databuffer = cmd; _nop_(); EN = 1; _nop_(); _nop_(); EN = 0; _nop_(); } void Write_data_Func(char datashow) //寫命令函數(shù){ check_busy(); //檢測忙信號函數(shù) RS = 1; //RS為高電平:寫內(nèi)容 RW = 0; EN = 0; _nop_(); databuffer = datashow; _nop_(); EN = 1; _nop_(); _nop_(); EN = 0; _nop_(); }
讀操作時序:
讀操作時序主要應(yīng)用在檢測忙信號,忙信號也在手冊初始化中使用到,下文會提到。所以我們分析讀操作時序的目的也就是為了寫檢測忙信號函數(shù)。
RS:置0,寫命令
RW:高電平貫穿整個時序,因此置1。
E:初始狀態(tài)為0,延時tR后拉高,之后再延時tPW后拉低。
讀操作時序與寫操作時序的區(qū)別在于:寫操作時序在E=0的時候就開始傳輸數(shù)據(jù),而讀操作時序要等E=1之后才開始傳輸數(shù)據(jù)。
代碼如下:
void check_busy()//檢測忙信號函數(shù){ char tmp = 0x80; //創(chuàng)建一個變量,存放數(shù)據(jù) databuffer=0x80; //初始值為忙,只要當(dāng)單片機發(fā)數(shù)據(jù)后高位變低后才為不忙 while(tmp & 0x80){ //檢測tmp的高位bf的值是否為高電平,如果為忙程序卡住不往下執(zhí)行 //高電平:忙 低電平:不忙 RS = 0; RW = 1; EN = 0; _nop_(); EN = 1; _nop_(); _nop_(); tmp=databuffer; EN = 0; _nop_(); }}
LCD1602初始化:
當(dāng)然這里還需注意LCD1602的手冊給出了使用前還需將LCD1602初始化,具體初始化內(nèi)容如下,我們只需調(diào)用我們剛剛封裝好的寫命令函數(shù)一步一步執(zhí)行手冊所給的內(nèi)容即可。
(1)延時 15ms
(2)寫指令 38H(不檢測忙信號)
(3)延時 5ms
(4)以后每次寫指令,讀/寫數(shù)據(jù)操作均需要檢測忙信號
(5)寫指令 38H:顯示模式設(shè)置
(6)寫指令 08H:顯示關(guān)閉
(7)寫指令 01H:顯示清屏
(8)寫指令 06H:顯示光標(biāo)移動設(shè)置
(9)寫指令 0CH:顯示開及光標(biāo)設(shè)置
void LCD1602_Init() //LCD1602初始化{ Delay15ms(); Write_cmd_Func(0x38); Delay5ms(); Write_cmd_Func(0x38); Write_cmd_Func(0x08); Write_cmd_Func(0x01); Write_cmd_Func(0x06); Write_cmd_Func(0x0c);}
4.LCD1602顯示一個字符
我們上面已經(jīng)把寫命令函數(shù),寫數(shù)據(jù)函數(shù),初始化函數(shù)等都已經(jīng)寫完了,現(xiàn)在就可以在main函數(shù)里面操作讓我們的LCD1602顯示一個字符了。
代碼如下:
void main(){ char position = 0x80 0x08; //定義顯示的位置 char datashow = 'E' //定義顯示的字符 LCD1602_Init(); Write_cmd_Func(position); Write_data_Func(datashow);}
效果如下:
完整資料可進群免費領(lǐng)?。。?!
嵌入式物聯(lián)網(wǎng)的學(xué)習(xí)之路非常漫長,不少人因為學(xué)習(xí)路線不對或者學(xué)習(xí)內(nèi)容不夠?qū)I(yè)而錯失高薪offer。不過別擔(dān)心,我為大家整理了一份150多G的學(xué)習(xí)資源,基本上涵蓋了嵌入式物聯(lián)網(wǎng)學(xué)習(xí)的所有內(nèi)容。點擊下方鏈接,0元領(lǐng)取學(xué)習(xí)資源,讓你的學(xué)習(xí)之路更加順暢!記得點贊、關(guān)注、收藏、轉(zhuǎn)發(fā)哦!