用現(xiàn)成模抉做吧
1602液晶顯示模塊的應(yīng)用http://tech.ddvip.com??
液晶顯示器以其微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧的諸多優(yōu)點(diǎn),在各類儀表和低功耗系統(tǒng)中得到廣泛的應(yīng)用。
根據(jù)顯示內(nèi)容可以分為字符型液晶,圖形液晶。根據(jù)顯示容量又可以分為單行16字,2行16字,兩行20字等等。
這里介紹常用的字16字X2行的字符型液晶模塊的使用方法。這是一種通用模塊。與數(shù)碼管相比該模塊有如下優(yōu)點(diǎn):
1.位數(shù)多,可顯示32位,32個(gè)數(shù)碼管體積相當(dāng)龐大了
2.顯示內(nèi)容豐富,可顯示所有數(shù)字和大、小寫字母
3.程序簡(jiǎn)單,如果用數(shù)碼管動(dòng)態(tài)顯示,會(huì)占用很多時(shí)間來刷新顯示,而1602自動(dòng)完成此功能。
1602采用標(biāo)準(zhǔn)的16腳接口,其中:(模塊背面有標(biāo)注)
第1腳:VSS為地電源
第2腳:VDD接5V正電源
第3腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度(建議接地,弄不好有的模塊會(huì)不顯示)
第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。
第5腳:RW為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。
第15~16腳:空腳(有的用來接背光)
1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了不同的點(diǎn)陣字符圖形,這些字符有,阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,其中數(shù)字與字母同ASCII碼兼容。
其內(nèi)部還有自定義字符(CGRAM),可用業(yè)存儲(chǔ)自已定義的字符。
查看原圖(大圖)
1602模塊的設(shè)定,讀寫,與光標(biāo)控制都是通過指令來完成,共有11條指令,如下:
指令 RS RW D7 D6 D5 D4 D3 D2 D1 D0 1 清屏 0 0 0 0 0 0 0 0 0 1 2 光標(biāo)返回 0 0 0 0 0 0 0 0 1 * 3 輸入模式 0 0 0 0 0 0 0 1 I/D S 4 顯示控制 0 0 0 0 0 0 1 D C B 5 光標(biāo)/字符移位 0 0 0 0 0 1 S/C R/L * * 6 功能 0 0 0 0 1 DL N F * * 7 置字符發(fā)生器地址 0 0 0 1
字符發(fā)生存貯器地址
8 置數(shù)據(jù)存貯器地址 0 0 1
顯示數(shù)據(jù)存貯器地址
9 讀忙標(biāo)志和地址 0 1 BF
計(jì)數(shù)器地址
10 寫數(shù)據(jù)到指令7.8所設(shè)地址 1 0
要寫的數(shù)據(jù)
11 從指令7.8所設(shè)的地址讀數(shù)據(jù) 1 1
讀出的數(shù)據(jù)
指令1:
清顯示,光標(biāo)復(fù)位到地址00H位置。
指令2:
光標(biāo)復(fù)位,光標(biāo)返回到地址00H。
指令3:
光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移,S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。
指令4:
顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。
指令5:
光標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。R/L,高向左,低向右。
指令6:
功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線 N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F: 低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。(有些模塊是 DL:高電平時(shí)為8位總線,低電平時(shí)為4位總線)
指令7:
字符發(fā)生器RAM地址設(shè)置,地址:字符地址*8+字符行數(shù)。(將一個(gè)字符分成5*8點(diǎn)陣,一次寫入一行,8行就組成一個(gè)字符)
指令8:
置顯示地址,第一行為:00H——0FH,第二行為:40H——4FH。
指令9:
讀忙信號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。
指令10:
寫數(shù)據(jù)。
指令11:
讀數(shù)據(jù)。
以下是在液晶模塊的第二行第一個(gè)字符的位置顯示字母“A”的程序:
[Keil uVision2編譯通過,AT89S51+12M晶振+JHD 162A模塊成功顯示]
MCS51單片機(jī)匯編程序
ORG 0000H
RS EQU P3.7 ;確定具體硬件的連接方式
RW EQU P3.6 ;確定具體硬件的連接方式
E EQU P3.5 ;確定具體硬件的連接方式
MOV P1,#00000001B ;清屏并光標(biāo)復(fù)位
ACALL ENABLE ;調(diào)用寫入命令子程序
MOV P1,#00111000B ;設(shè)置顯示模式,8位2行5X7點(diǎn)陣
ACALL ENABLE ;調(diào)用寫入命令子程序
MOV P1,#00001111B ;顯示器開、光標(biāo)開、光標(biāo)允許閃爍
ACALL ENABLE ;調(diào)用寫入命令子程序
MOV P1,#00000110B ;文字不動(dòng),光標(biāo)自動(dòng)右移
ACALL ENABLE ;調(diào)用寫入命令子程序
MOV P1,#0C0H ;寫入顯示起始地址(第二行第一個(gè)位置)
ACALL ENABLE ;調(diào)用寫入命令子程序
MOV P1,#01000001B ;字母A的代碼
SETB RS ;RS=1
CLR RW ;RW=0 ;準(zhǔn)備寫入數(shù)據(jù)
CLR E ;E=0 ;執(zhí)行顯示命令
ACALL DELAY ;判斷液晶模塊是否忙?
SETB E ;E=1 ;顯示完成,程序停車
AJMP $
ENABLE:
CLR RS ;寫入控制命令的子程序
CLR RW
CLR E
ACALL DELAY
SETB E
RET
DELAY:
MOV P1,#0FFH ;判斷液晶顯示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,DELAY ;如果P1.7為高電平表示忙就循環(huán)等待
RET
END
http://hi.baidu.com/yuzeshze/blog/item/b0eed4ed1172b8d92e2e211b.html
1602液晶漢字顯示
1602是一款最常用也是最便宜的液晶顯示屏。最多可以顯示兩行標(biāo)準(zhǔn)字符,每行最多可以顯示16個(gè)字符。
1602可以顯示內(nèi)部常用字符(包括阿拉伯?dāng)?shù)字,英文字母大小寫,常用符號(hào)和日文假名等),也可以顯示自定義字符(單或多個(gè)字符組成的簡(jiǎn)單漢字,符號(hào),圖案等,最多可以產(chǎn)生8個(gè)自定義字符)。
顯示操作的過程:
首先確認(rèn)顯示的位置,即在第幾行,第幾個(gè)字符開始顯示。也就是要顯示的地址,如下表所示的顯示地址。

一、顯示常用字符。
1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,如下表所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是41H,顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來,我們就能看到字母“A”。
顯示操作的過程:
首先確認(rèn)顯示的位置,即在第幾行,第幾個(gè)字符開始顯示。也就是要顯示的地址,如下表所示的顯示地址。
[attachment=4688]
第一行的顯示地址是0x80-0x8F,第二行的顯示地址是0xC0-0xCF。例如想要在第2行,第3個(gè)位置顯示一個(gè)字符,那么地址碼就是 0xC2。在編程過程中,通常編寫一個(gè)函數(shù)確定在某行某個(gè)位置顯示數(shù)據(jù)。函數(shù)需要 行參數(shù)(y),和 列參數(shù)(x)來確定顯示位置。程序參考如下
/***************設(shè)置顯示位置**************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
? ? if (0 == y) x |= 0x80; //當(dāng)要顯示第一行時(shí)地址碼+0x80;
? ? else x |= 0xC0; //在第二行顯示是地址碼+0xC0;
? ? Write_com(x); //發(fā)送地址碼 0x80-0x8F 或者0xC0-0xCF
}? ?
以上地址碼,在顯示過程中,可以直接應(yīng)用,至于地址碼的計(jì)算原理,如果想要研究,請(qǐng)參考其它資料,這里不做描述。
其次設(shè)置要顯示的內(nèi)容,即上面提到的CGROM內(nèi)的字符編碼。如顯示“A”,將編碼41H寫入到液晶屏顯示即可。通常設(shè)置地址和顯示內(nèi)容用一個(gè)函數(shù)來完成。代碼參考如下:
[size=+0]//功能:按指定位置顯示一個(gè)字符
//輸入:列顯示地址x(取值范圍0-15) 行顯示地址y(取值范圍0-1), 指定字符
void DisplayOneChar(unsigned char x, unsigned char y, unsigned char Data)
{
? ? if (0 == y) x |= 0x80; //當(dāng)要顯示第一行時(shí)地址碼+0x80;
? ? else x |= 0xC0; //在第二行顯示是地址碼+0xC0;
? ? Write_com(x); //發(fā)送地址碼
? ? Write_dat(Data); //發(fā)送要顯示的字符編碼
}
[size=+0]顯示字符“A”調(diào)用過程如下代碼:
[size=+0]DisplayOneChar(0,0,0x41);//功能:在第1行 第1個(gè)字符 顯示一個(gè)大寫字母A
[size=+0]在C語言操作時(shí),還可以顯示整個(gè)字符串。定義一個(gè)字符串顯示函數(shù),可以通過直接輸入字符方式進(jìn)行顯示
[size=+0]//功能:按指定位置顯示一串字符
//輸入:列顯示地址x(取值范圍0-15) 行顯示地址y(取值范圍0-1), 指定字符串指針*p,要顯示的字符個(gè)數(shù)count (取值范圍1-16)
void Disp_1602(unsigned char x,unsigned char y,unsigned char *p,unsigned char count)
{
unsigned char i;? ?
? ? for(i=0;i
? ? {
? ?? ???if (0 == y) x |= 0x80; //當(dāng)要顯示第一行時(shí)地址碼+0x80;
? ?? ???else x |= 0xC0; //在第二行顯示是地址碼+0xC0;
? ?? ???Write_com(x); //發(fā)送地址碼
? ?? ???Write_dat(*p); //發(fā)送要顯示的字符編碼
? ?? ???x++;
? ?? ???p++;
? ? }? ?? ???
}? ?? ?
調(diào)用方法如下:
DisplayListChar(0,0,"hello world",11); //液晶1602第一行顯示
? ? DisplayListChar(0,1,"www.qm999.cn",12);? ? //液晶1602第二行顯示二、顯示自定義字符。
[size=+0]二、顯示自定義字符。
1、首先取得想要的中文或者圖形的字模數(shù)組。通過字模軟件不能直接提取5*8點(diǎn)陣的字模數(shù)據(jù),可以通過手動(dòng)提取的方法。如下圖所示,對(duì)應(yīng)一個(gè)字符顯示區(qū)域。每8個(gè)字節(jié),組成一個(gè)點(diǎn)陣數(shù)組。
[size=+0]

“日”的點(diǎn)陣數(shù)組即為 {0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}
2個(gè)點(diǎn)陣組成一個(gè)漢字取模舉例:

“車”字取模數(shù)組為:{0x00,0x0f,0x02,0x04,0x07,0x00,0x0f,0x00,
0x10,0x1e,0x00,0x10,0x1c,0x10,0x1e,0x10}
將生成的點(diǎn)陣數(shù)組保存到CGRAM存儲(chǔ)器中,生成自定義字符。1602內(nèi)部CGRAM用于自定義的字符點(diǎn)陣的存儲(chǔ),總共64字節(jié)。由上一步點(diǎn)陣提取可知,每一個(gè)字符由8個(gè)字節(jié)數(shù)據(jù)組成。所以64字節(jié)CGRAM存儲(chǔ)器,能夠存儲(chǔ)8組自定義字符的點(diǎn)陣數(shù)組。按照CGRAM地址劃分為 0-7為第一組,8-15為第二組,依次類推56-63為第8組數(shù)據(jù)。把自定義字符的數(shù)組按8個(gè)字節(jié)一組存儲(chǔ)到CGRAM中,程代碼參考如下。
//功能:將自定義字符的編碼數(shù)組 寫入到CGRAM中.
//輸入:自定義字符的編碼數(shù)組
void Write_CGRAM(unsigned char *p)
{
unsigned char i,j,kk;
unsigned char tmp=0x40; //操作CGRAM的命令碼
kk=0;
for(j=0;j<8;j++)? ?? ???//64 字節(jié)存儲(chǔ)空間,可以生成 8 個(gè)自定義字符點(diǎn)陣
{
? ? for(i=0;i<8;i++)? ? // 8 個(gè)字節(jié)生成 1 個(gè)字符點(diǎn)陣
? ? {
? ?? ???Write_com(tmp+i);? ? //操作CGRAM的命令碼+寫入CGRAM地址.
? ?? ???Write_dat(p[kk]);? ? //寫入數(shù)據(jù)
? ?? ???kk++;
? ? }
? ? tmp += 8;
}
}? ?
上一步中,自定義字符存儲(chǔ)到CGRAM的任意一組以后,每一個(gè)組(8個(gè)字節(jié))也有一個(gè)顯示編碼。按順序依次為00H-07H 。顯示時(shí),只要調(diào)用每一組的編碼,即可以顯示相應(yīng)的字符。

[size=+0]注:內(nèi)部常用字符顯示時(shí),顯示編碼是從0x20開始的。0x00-0x0f是專門留給自定義字符顯示的。0x00-0x07和0x08-0x0f內(nèi)容是一樣的。例如:調(diào)用0x01 位置和0x09位置,顯示的內(nèi)容是一樣的。
直接按照單個(gè)字符的顯示方式調(diào)用顯示函數(shù),就可以顯示自定義字符了。代碼參考如下:
[size=+0]//在第1行,第7個(gè)位置顯示自定義漢字 “年”
DisplayOneChar(6,0,0);? ? //顯示 "年" //CGRAM 碼 00
說明:此時(shí)“年”的8個(gè)字節(jié)點(diǎn)陣數(shù)組 ,存儲(chǔ)空間為CGRAM的 00-07地址
也就是CGRAM的第1組數(shù)據(jù)存儲(chǔ)區(qū)域,編碼為0。 如果存儲(chǔ)在CGRAM的08-15地址,那么編碼就應(yīng)該是 1了。
[size=+0]很多資料中,都沒有詳細(xì)介紹過CGRAM和CGROM的區(qū)別和用法,在1602調(diào)試過程中經(jīng)常會(huì)被搞混。這里總結(jié)一點(diǎn)小技巧,希望能給需要的人一點(diǎn)幫助。
以下是顯示效果:
常用字符顯示:

單個(gè)和兩個(gè)點(diǎn)陣的漢字顯示:

圖形顯示效果: