LCD1602顯示中文漢字
LCD1602相比大家都比較了解,但是我們一般只用來(lái)顯示字符,數(shù)字。
最近在網(wǎng)上看許多人用LCD1602來(lái)顯示漢字,覺(jué)得有趣
于是拜讀了一些資料,教程,但感覺(jué)大部分相當(dāng)晦澀難懂,本人認(rèn)為既然是教程,就不必要相當(dāng)?shù)膹?fù)雜,畢竟人家看完許久后還是不能得出實(shí)驗(yàn)結(jié)果~?。?br />
接下我談?wù)勎业米龇?,保證你10分鐘之內(nèi)一樣可以在LCD1602上顯示你想顯示的各種符號(hào),漢字?。?!
首先:我們要弄清楚一個(gè)概念,其實(shí)我們使用1602顯示中文漢字,就是利用其內(nèi)部的自定義字節(jié)空間,我們都知道LCD1602內(nèi)部有一個(gè)64字節(jié)的自定義CGRAM,那么好,我們就是要利用自定義字節(jié)來(lái)達(dá)到顯示漢字的效果.
我們知道一個(gè)字符占8個(gè)字節(jié),所以在CGRAM能夠存放8個(gè)字符。
也就是說(shuō),這個(gè)64字節(jié)的CGRAM是給我們提供寫入數(shù)據(jù)的,
那么我們?cè)趺窗盐覀円臐h字寫入CGRAM呢?
不要急,大家查看LCD1602的用戶手冊(cè),里面提到當(dāng)我們需要想CGRAM寫入數(shù)據(jù)時(shí),我們需要先寫入CGRAM的地址,從手冊(cè)上可知,CGRAM的地址為0x40.所以當(dāng)我們要寫入數(shù)據(jù)時(shí),要先寫入一條地址命令 write_com(0x040);
然后把你要寫入的數(shù)據(jù)通過(guò)寫數(shù)據(jù)命令寫入 write_date( 你要寫得數(shù)據(jù));
做完以上步驟了,是不是LCD1602就會(huì)顯示你輸入的漢字呢?
不要急,以上你只是把你要顯示漢字的代碼存放在CGRAM里,就相當(dāng)于其他常用字符一樣固定在LCD里面了,如果你不把它讀出來(lái),LCD是不會(huì)顯示的。。
當(dāng)你把上面的步驟做完后,接下來(lái)要做的與你平常怎么使用LCD1602是一樣的,只不過(guò)是LCD1602里面增加了一些你自定義的字符,漢字。
可能到這里,也許會(huì)有些疑問(wèn),既然自定義字符、漢字的代碼需要我們自己輸入,那么我該怎么編寫這些代碼,呵呵,不要著急,接下來(lái)就要用到下面這個(gè)取字模軟件。。
相信有的朋友應(yīng)該都用過(guò)這個(gè)軟件。那么我們?cè)趺磥?lái)使用這個(gè)軟件來(lái)獲取代碼呢?大家有沒(méi)有注意到,我們的LCD1602是5*8點(diǎn)陣(可以數(shù)一數(shù))。但是5*8不能提取代碼,最少只能8*8,所以我們這里只用后前5列,前3列不用。。
新建圖像 8*8.然后再圖像里面點(diǎn)你要顯示的字符,漢字,注意是在后5列中點(diǎn),黑點(diǎn)表示顯示,白點(diǎn)不顯示,用鼠標(biāo)左鍵可以切換,下面是我點(diǎn)得一個(gè)坦克~~
點(diǎn)好后,就可以產(chǎn)生代碼了,這軟件里面可以選擇C51或匯編,這里選擇C51。
下面的8個(gè)代碼就是要產(chǎn)生這個(gè)字符的數(shù)據(jù)。。也就是要輸入到自定義字符CGRAM里面的
。
好的,怎么把獲取漢字代碼,怎么把代碼輸入到CGRAM里面都知道了,
下面就是要把我們的自定義漢字、字符顯示在LCD1602屏幕上了。。
我們知道常用字符是從0x20開(kāi)始顯示,而0x00—0x0f都是沒(méi)有用的,其實(shí)這個(gè)正式為我們自定義顯示字符準(zhǔn)備的。當(dāng)你把上面的代碼輸入到CGRAM中,LCD1602機(jī)會(huì)把漢字或字符賦予地址,這個(gè)地址是從0x00開(kāi)始,因?yàn)樽疃嘀荒?個(gè)字符,所以當(dāng)在CGRAM里面輸入8個(gè)字符代碼時(shí),這8個(gè)字符的代碼的數(shù)據(jù)地址就是0x00開(kāi)始到0x07。
所以當(dāng)你要在LCD1602上顯示自定義字符時(shí),只需要把這個(gè)地址用數(shù)據(jù)輸入就OK。
Write_date(0x00—0x07);
也就是說(shuō)現(xiàn)在你要顯示自定義字符和你顯示常用字符一樣的做法了,先寫地址,然后寫數(shù)據(jù)
自定義字符的數(shù)據(jù)就是0x00—0x07。也就是你自定義的8個(gè)字符。
這里用 Proteus 仿真軟件演示
附程序
編寫時(shí)間:2011-11-25
功能:LCD顯示自定義字符、漢字
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^4;
sbit lcdrw=P2^5;
sbit lcden=P2^6;
uchar code table[]={
0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,//一
0x00,0x00,0x0E,0x00,0x1F,0x00,0x00,0x00,//二
0x00,0x1F,0x00,0x0E,0x00,0x1F,0x00,0x00,//三
0x02,0x04,0x0F,0x12,0x0F,0x0A,0x1F,0x02,//年
0x0F,0x09,0x0F,0x09,0x0F,0x09,0x09,0x11,//月
0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,//日
0x00,0x00,0x00,0x0A,0x15,0x0A,0x04,0x00,//心型
0x00,0x04,0x15,0x0E,0x1F,0x0E,0x11,0x00//坦克
};
uchar code table1[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //自定義字符數(shù)據(jù)地址
uchar code table2[]="QQ:598852247";
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=122;y>0;y--);
}
void write_cmd(uchar cmd)
{
lcdrs=0;
lcdrw=0; //選擇指令寄存器
lcden=1;
P0=cmd; //寫了命令
delay(5);
lcden=0; //使能拉低
lcden=1;
}
void write_date(uchar date)
{
lcdrs=1;
lcdrw=0; //選擇數(shù)據(jù)寄存器
lcden=1;
P0=date; //寫了命令
delay(5);
lcden=0; //使能拉低
lcden=1;
}
void init_lcd1602()
{
write_cmd(0x01); //清屏
write_cmd(0x38); //功能設(shè)置
write_cmd(0x0c); //顯示設(shè)置
write_cmd(0x06); //輸入方式從左到右
delay(1);
}
void main()
{
uchar i;
init_lcd1602();
delay(1);
while(1)
{
write_cmd(0x40); //開(kāi)始寫入你要顯示的自定義字符、漢字代碼
for(i=0;i<64;i++)
{
write_date(table[i]);
delay(5);
}
write_cmd(0x80); //從第一行第一列開(kāi)始顯示
for(i=0;i<8;i++) //顯示自定義字符
{
write_date(table1[i]);
delay(5);
}
write_cmd(0xc0); //顯示QQ:598852247
for(i=0;i<12;i++)
{
write_date(table2[i]);
delay(5);
}
}
}