




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
LCD1602液晶顯示器簡介一概述液晶〔LiquidCrystal〕是一種高分子材料,因其特殊的物理、化學(xué)、光學(xué)特性,廣泛應(yīng)用輕薄顯示器上。液晶顯示器〔LiquidCrystalDisplay,LCD〕的主要原理是以電流刺激液晶分子產(chǎn)生點、線、面并配合背部燈管構(gòu)成畫面。各種型號的液晶通常是按照顯示字符的行數(shù)或液晶點陣的行、列數(shù)來命名。例如,1602表示每行顯示16個字符,一共可以顯示兩行。這類液晶通常稱為字符型液晶,只能顯示ASCII碼字符。12232表示液晶顯示畫面由122列、32行組成,共有122*32個點來顯示各種圖形。用戶可以通過程序控制這些點中任何一個點顯示或不顯示,從而構(gòu)成各種圖形畫面。因此,12232稱為圖形型液晶。液晶體積小,功耗低,顯示操作簡單。但其有致命的弱點,即使用溫度范圍很窄。通用型液晶工作溫度為0到+55攝氏度,存儲溫度為-20到+60攝氏度。二LCD160211602的外形尺寸〔毫米〕2主要技術(shù)參數(shù)接口信號說明4根本操作時序RAM地址映射圖控制器內(nèi)部帶有80B的RAM緩沖區(qū)。對應(yīng)關(guān)系如下列圖所示。向圖中的00~0F、40~4F地址中的任意處寫入顯示數(shù)據(jù)時,液晶可立即顯示出來;當(dāng)寫入到10~27或50~67地址時,必須通過移屏指令將他們一移入可顯示區(qū)域方可正常顯示。1602液晶模塊內(nèi)部的字符發(fā)生存儲器〔CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,如下表所示。這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比方大寫的英文字母“A〞的代碼是01000001B〔41H〕,顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A〞。狀態(tài)字說明說明:原那么上每次對控制器進(jìn)行讀寫操作前,都必須進(jìn)行讀寫檢測,確保STA7為0。實際上,由于單片機(jī)的操作速度慢于液晶控制器的反響速度,因此可以不進(jìn)行檢測,或只進(jìn)行簡短的延時即可。7指令說明1602液晶模塊內(nèi)部的控制器共有11條控制指令。顯示模式設(shè)置顯示開/關(guān)及光標(biāo)設(shè)置數(shù)據(jù)指針設(shè)置其它設(shè)置8控制接口時序說明時序參數(shù)讀操作時序?qū)懖僮鲿r序9初始化過程1〕延時15ms2〕寫指令38H(不檢測忙信號)3〕延時5ms4〕寫指令38H(不檢測忙信號)5〕延時5ms6〕寫指令38H(不檢測忙信號)7〕(以后每次寫指令、讀/寫數(shù)據(jù)操作之前均需檢測忙信號)8〕寫指令38H:顯示模式設(shè)置9〕寫指令08H:顯示關(guān)閉10〕寫指令01H:顯示清屏11〕寫指令06H:顯示光標(biāo)移動設(shè)置12〕寫指令0CH:顯示開及光標(biāo)設(shè)置三驅(qū)動程序舉例1I/O方式驅(qū)動程序程序如下:/*=========================================================SMC1602A(16*2)I/O口線接線方式連接線圖:---------------------------------------------------|LCM-----51|LCM-----51|LCM------51|---------------------------------------------||DB0-----P1.0|DB4-----P1.4|RW-------P2.0||DB1-----P1.1|DB5-----P1.5|RS-------P2.1||DB2-----P1.2|DB6-----P1.6|E--------P2.2||DB3-----P1.3|DB7-----P1.7|VLCD接1K電阻到GND|---------------------------------------------------[注:AT89S51使用12M晶體震蕩器]=========================================================*/#include<reg51.h>sbitLCM_RW=P2^0;
//定義引腳sbitLCM_RS=P2^1;sbitLCM_E
=P2^2;#defineLCM_Data
P1#defineBusy0x80//用于檢測LCM狀態(tài)字中的Busy標(biāo)識voidWriteDataLCM(unsignedcharWDLCM);voidWriteCommandLCM(unsignedcharWCLCM,BuysC);unsignedcharReadDataLCM(void);unsignedcharReadStatusLCM(void);voidLCMInit(void);voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);voidDelayms(unsignedintn);voiddellay(unsignedint
h);unsignedcharcodeblog_adr[]={"EDNchina"};unsignedcharcodeemail[]={"tengjingshu@126"};voidmain(void){
//Delay400Ms();
//啟動等待,等LCM講入工作狀態(tài)
LCMInit();
//LCM初始化
DisplayListChar(6,0,blog_adr);
DisplayListChar(0,0,email);
while(1);}//寫數(shù)據(jù)RS="H",RW=L,D0~D7=數(shù)據(jù),E=高脈沖voidWriteDataLCM(unsignedcharWDLCM)
{
dellay(100);
LCM_E=0;
LCM_RS=1;
LCM_RW=0;LCM_Data=WDLCM;//dellay(100);
//短暫延時,代替檢測忙狀態(tài)
//ReadStatusLCM();//檢測忙
LCM_E=1;
LCM_E=0;}//寫指令RS="L",RW=L,D0~D7=指令碼,E=高脈沖voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC為0時忽略忙檢測{
//if(BuysC)ReadStatusLCM();//根據(jù)需要檢測忙
dellay(100);
//短暫延時,代替檢測忙狀態(tài)
LCM_E=0;
LCM_RS=0;
LCM_RW=0;
LCM_Data=WCLCM;
LCM_E
=1;
LCM_E=0;}//讀數(shù)據(jù)RS="H",RW=H,E=HunsignedcharReadDataLCM(void){
LCM_RS=1;
LCM_RW=1;
LCM_E=1;
return(LCM_Data);}//讀狀態(tài)RS="L",RW=H,E=HunsignedcharReadStatusLCM(void){
LCM_Data=0xFF;
LCM_RS=0;
LCM_RW=1;
LCM_E=1;
//while(LCM_Data&Busy);//檢測忙信號
return(LCM_Data);}voidLCMInit(void)//LCM初始化{
LCM_Data=0;
Delayms(15);
WriteCommandLCM(0x38,0);//三次顯示模式設(shè)置,不檢測忙信號
Delayms(5);
WriteCommandLCM(0x38,0);
Delayms(5);
WriteCommandLCM(0x38,0);
WriteCommandLCM(0x38,1);//顯示模式設(shè)置,開始要求每次檢測忙信號
WriteCommandLCM(0x08,1);//關(guān)閉顯示
WriteCommandLCM(0x01,1);//顯示清屏
WriteCommandLCM(0x06,1);//顯示光標(biāo)移動設(shè)置
WriteCommandLCM(0x0C,1);//顯示開及光標(biāo)設(shè)置}//按指定位置顯示一個字符voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData){Y&=0x1;X&=0xF;//限制X不能大于15,Y不能大于1if(Y)X|=0x40;
//當(dāng)要顯示第二行時地址碼+0x40;X|=0x80;
//算出指令碼WriteCommandLCM(X,1);//這里不檢測忙信號,發(fā)送地址碼WriteDataLCM(DData);}//按指定位置顯示一串字符voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData){unsignedcharListLength;ListLength=0;Y&=0x1;X&=0xF;
//限制X不能大于15,Y不能大于1while(DData[ListLength]>0x1f)//假設(shè)到達(dá)字串尾那么退出
{
if(X<=0xF)//X坐標(biāo)應(yīng)小于0xF
{
DisplayOneChar(X,Y,DData[ListLength]);//顯示單個字符
ListLength++;X++;
}}}//延時程序voidDelayms(unsignedintn){
unsignedinti,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);}/****************************************************函數(shù)名稱:dellay**入口參數(shù):h〔unsignedint型〕**出口參數(shù):無**功能描述:短暫延時,使用12MHz晶體,約0.01MS****************************************************/voiddellay(unsignedint
h){
while(h--);
//0.01MS}要注意的是在讀寫程序中,沒有用“檢測忙〞,其實對于1602來說,沒有檢測忙信號對于實際來說還好,因為常常因為檢測忙,而使1602沒顯示〔一直處于忙檢測中〕?!懊z測〞用一個小延時代替。對于LCM1602來說,讀寫時序最重要。
LCM1602寫操作時序//寫數(shù)據(jù)RS="H",RW=L,D0~D7=數(shù)據(jù),E=高脈沖voidWriteDataLCM(unsignedcharWDLCM)
{
dellay(100);
//短暫延時,代替檢測忙狀態(tài)LCM_E=0;
LCM_RS=1;
LCM_RW=0;LCM_Data=WDLCM;
LCM_E=1;
LCM_E=0;}//寫指令RS="L",RW=L,D0~D7=指令碼,E=高脈沖voidWriteCommandLCM(unsignedcharWCLCM){
dellay(100);
//短暫延時,代替檢測忙狀態(tài)
LCM_E=0;
LCM_RS=0;
LCM_RW=0;
LCM_Data=WCLCM;
LCM_E
=1;LCM_E=0;}上面兩個分別為寫數(shù)據(jù)函數(shù)和寫命令函數(shù),檢測忙已用小延時代替。其實這個時序好似不太嚴(yán)格,但要保證的是E高脈沖時,寫的數(shù)據(jù)/命令是有效的。好似函數(shù)也可以寫成這樣:voidWriteCommandLCM(unsignedcharWCLCM){dellay(100);
//短暫延時,代替檢測忙狀態(tài)
LCM_Data=WCLCM;
LCM_RS=0;
LCM_RW=0;LCM_E
=0;
dellay(100);
LCM_E
=1;}//按指定位置顯示一串字符函數(shù)DisplayListChar的作用是在指定位置顯示一串字符,其中有一句“while(DData[ListLength]>0x1f)//假設(shè)到達(dá)字串尾那么退出〞
為什么要大于0x20呢?
unsignedcharcodeblog_adr[]={"EDNchina"};unsignedcharcodeemail[]={"tengjingshu@126"};
用單引號’’()括起來的字符為字符的ASCII碼值,而不是字符串。
用雙引號〞〞(shift+)括起來的一串字符,成為字符串常量。C編譯器會自動地在字符末尾加上結(jié)束符’\0’(NULL)(ASCII碼為0x00也就是00H)。chara[]={“BeiJing〞};chara[]={‘B’,’e’,’I’,’‘,’J’,’i’,’n’,’g’,’\0’};兩者是等價的,數(shù)組的每個元素為對應(yīng)字符的ASCII碼,如a[3]數(shù)組a的第四個元素是’‘空格,那么a[3]里面放著的是空格’‘的ASCII碼0x20。還要注意的是數(shù)組的元素數(shù)目一定要比字符多一個。以便C編譯器自動在其后面參加結(jié)束符’\0’。可以知道‘\0’ASCII碼為0x00‘\n’ASCII碼為0x0A那知道為什么有這句了吧“while(DData[ListLength]>0x1F)//假設(shè)到達(dá)字串尾那么退出〞因為大于0x1f才能顯示字符,小于和等于0x1f的都是鍵盤控制符。當(dāng)然我們也可以檢測’\0’(0x00)“while(DData[ListLength]!='\0')
//檢測到字符串結(jié)束符那么退出〞總線方式驅(qū)動程序LCM1602總線方式C51程序//********************Lcd1602B.c***********************************#include<delay.h>#include<lcd1602b.h>#include<absacc.h>/*=======================================================
顯示字符串=======================================================*/voidLcdDisplayString(unsignedcharx,unsignedchary,unsignedchar*ptr){unsignedchari,l=0;
while(ptr[l]>31){l++;};
//
for(i=0;i<l;i++){
LcdDisplayChar(x++,y,ptr[i]);
if(x==16){
x=0;y^=1;//異或,第一行的話變第二行,第二行的話變第一行
}
}}/*=======================================================
顯示光標(biāo)定位=======================================================*/voidLocateXY(charposx,charposy){unsignedchartemp;
temp=posx&0x0f;
//確保只選0~16個格子
posy&=0x01;
//確保不是在第一行就在第二行
if(posy)temp|=0x40;
//在第二行的時候加40H
temp|=0x80;
//數(shù)據(jù)指針設(shè)置指令碼80H+地址碼〔0-27H,40H-67H〕
LcdWriteCommand(temp,1);}/*=======================================================
按指定位置顯示數(shù)出一個字符=======================================================*/voidLcdDisplayChar(unsignedcharx,unsignedchary,unsignedcharWdata){
LocateXY(x,y);
//定位顯示地址
LcdWriteData(Wdata);
//寫字符}/*=======================================================
初始化程序,必須按照產(chǎn)品資料介紹的初始化過程進(jìn)行=======================================================*/voidLcdReset(void){
Delayms(400);
//啟動時必須的延時,等待lcm進(jìn)入工作狀態(tài)
LcdWriteCommand(0x38,0);
//顯示模式設(shè)置(不檢測忙信號)
Delayms(15);
LcdWriteCommand(0x38,0);
//共三次
Delayms(15);
LcdWriteCommand(0x38,0);
Delayms(15);
LcdWriteCommand(0x38,1);
//顯示模式設(shè)置(以后均檢測忙信號)
LcdWriteCommand(0x08,1);
//顯示關(guān)閉
LcdWriteCommand(0x06,1);
//顯示光標(biāo)移動設(shè)置
LcdWriteCommand(0x0c,1);
//顯示開及光標(biāo)設(shè)置
LcdClear();}/*=======================================================
clear=======================================================*/voidLcdClear(void){
LcdWriteCommand(0x01,1);
//顯示清屏}/*=======================================================
寫控制字符子程序:E="1"RS="0"RW="0"=======================================================*/voidLcdWriteCommand(unsignedcharCMD,unsignedcharAttribC){
//AttribC=1檢查忙狀態(tài),AttribC=0不檢查忙狀態(tài)
if(AttribC)while(Lcd1602StatusPort&Busy);
//檢測忙信號?
//busy=0x80
每次讀寫操作都要進(jìn)行讀寫檢測,確保SAT7=0
Lcd1602CmdPort=CMD;}/*=======================================================
當(dāng)前位置寫字符子程序:E=1RS="1"RW="0"=======================================================*/voidLcdWriteData(chardataW){
while(Lcd1602StatusPort&Busy);
//檢測忙信號
//busy=0x80
每次讀寫操作都要進(jìn)行讀寫檢測,確保SAT7=0
Lcd1602WdataPort=dataW;精確微秒級延時〔詳細(xì)可以參考我另一篇博文51單片機(jī)C51微秒級〔ms〕精確延時〕//********************delay.h***********************************#include<delay.h>//forcrystal11.0592MvoidDelayms(unsignedintn){
unsignedinti,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);}//********************lcd1602b.h***********************************#ifndef__LCD1602B_H__#define__LCD1602B_H__#defineLcd1602CmdPortXBYTE[0x8000]
//E=1RS="0"RW="0"
//寫指令#defineLcd1602WdataPortXBYTE[0x8100]
//E=1RS="1"RW="0"http://寫數(shù)據(jù)#defineLcd1602StatusPortXBYTE[0x8200]
//E=1RS="0"RW="1"
//讀狀態(tài)#defineBusy0x80
//busyexternvoidLcdClear(void);externvoidLcdWriteData(chardataW);externvoidLcdWriteCommand(unsignedcharCMD,unsignedcharAttribC);externvoidLcdReset(void);externvoidDisplay(unsignedchardd);externvoidLcdDisplayChar(unsignedcharx,unsignedchary,unsignedcharWdata);externvoidLcdDisplayString(unsignedcharx,unsignedchary,unsignedchar*ptr);#endif其中要注意寫指令的地址0x8000寫數(shù)據(jù)的地址0x8100讀狀態(tài)的地址0x8200這三個地址值是根據(jù)硬件電路連接確定的。//********************absacc.h***********************************#ifndef__ABSACC_H__#define__ABSACC_H__#defineCBYTE((unsignedcharvolatilecode
*)0)#defineDBYTE((unsignedcharvolatiledata
*)0)#definePBYTE((unsignedcharvolatilepdata*)0)#defineXBYTE((unsignedcharvolatilexdata*)0)#defineCWORD((unsi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年上海浦東房屋買賣合同范文
- 2025年公園綠化工程分包合作合同
- 2025年育兒嫂勞動合同模板
- 物業(yè)管理委托合同經(jīng)典版樣式5篇
- 2025年軟件授權(quán)使用合同范文性標(biāo)準(zhǔn)文本
- 核桃小學(xué)維修課桌凳合同8篇
- 立柱廣告位出租合同5篇
- 黑龍江省存量房屋合同范本8篇
- 會務(wù)沙發(fā)租賃合同范本
- 養(yǎng)殖場合作合同范例
- 北京市東城區(qū)2025年公開招考539名社區(qū)工作者高頻重點提升(共500題)附帶答案詳解
- 2025福建福州地鐵集團(tuán)限公司運營分公司校園招聘高頻重點提升(共500題)附帶答案詳解
- 2025至2030年中國電子護(hù)眼臺燈數(shù)據(jù)監(jiān)測研究報告
- 2025年浙江省溫州樂清市融媒體中心招聘4人歷年高頻重點提升(共500題)附帶答案詳解
- 2025夏季廣東廣州期貨交易所招聘高頻重點提升(共500題)附帶答案詳解
- 2025上海市嘉定工業(yè)區(qū)農(nóng)村青年干部招聘22人歷年高頻重點提升(共500題)附帶答案詳解
- 《獸醫(yī)基礎(chǔ)》練習(xí)題及參考答案
- 2025年煤礦探放水證考試題庫
- 農(nóng)業(yè)機(jī)械設(shè)備運輸及調(diào)試方案
- 污水處理設(shè)備的故障處理指南考核試卷
- ps 課件教學(xué)課件
評論
0/150
提交評論