LCD1602顯示中文漢字
LCD1602相比大家都比較了解,但是我們一般只用來顯示字符,數(shù)字。
最近在網(wǎng)上看許多人用LCD1602來顯示漢字,覺得有趣
于是拜讀了一些資料,教程,但感覺大部分相當晦澀難懂,本人認為既然是教程,就不必要相當?shù)膹碗s,畢竟人家看完許久后還是不能得出實驗結(jié)果~!!
接下我談?wù)勎业米龇ǎWC你10分鐘之內(nèi)一樣可以在LCD1602上顯示你想顯示的各種符號,漢字!??!
首先:我們要弄清楚一個概念,其實我們使用1602顯示中文漢字,就是利用其內(nèi)部的自定義字節(jié)空間,我們都知道LCD1602內(nèi)部有一個64字節(jié)的自定義CGRAM,那么好,我們就是要利用自定義字節(jié)來達到顯示漢字的效果.
我們知道一個字符占8個字節(jié),所以在CGRAM能夠存放8個字符。
也就是說,這個64字節(jié)的CGRAM是給我們提供寫入數(shù)據(jù)的,
那么我們怎么把我們要的漢字寫入CGRAM呢?
不要急,大家查看LCD1602的用戶手冊,里面提到當我們需要想CGRAM寫入數(shù)據(jù)時,我們需要先寫入CGRAM的地址,從手冊上可知,CGRAM的地址為0x40.所以當我們要寫入數(shù)據(jù)時,要先寫入一條地址命令 write_com(0x040);
然后把你要寫入的數(shù)據(jù)通過寫數(shù)據(jù)命令寫入 write_date( 你要寫得數(shù)據(jù));
做完以上步驟了,是不是LCD1602就會顯示你輸入的漢字呢?
不要急,以上你只是把你要顯示漢字的代碼存放在CGRAM里,就相當于其他常用字符一樣固定在LCD里面了,如果你不把它讀出來,LCD是不會顯示的。。
當你把上面的步驟做完后,接下來要做的與你平常怎么使用LCD1602是一樣的,只不過是LCD1602里面增加了一些你自定義的字符,漢字。
可能到這里,也許會有些疑問,既然自定義字符、漢字的代碼需要我們自己輸入,那么我該怎么編寫這些代碼,呵呵,不要著急,接下來就要用到下面這個取字模軟件。。
相信有的朋友應(yīng)該都用過這個軟件。那么我們怎么來使用這個軟件來獲取代碼呢?大家有沒有注意到,我們的LCD1602是5*8點陣(可以數(shù)一數(shù))。但是5*8不能提取代碼,最少只能8*8,所以我們這里只用后前5列,前3列不用。。
新建圖像 8*8.然后再圖像里面點你要顯示的字符,漢字,注意是在后5列中點,黑點表示顯示,白點不顯示,用鼠標左鍵可以切換,下面是我點得一個坦克~~
點好后,就可以產(chǎn)生代碼了,這軟件里面可以選擇C51或匯編,這里選擇C51。
下面的8個代碼就是要產(chǎn)生這個字符的數(shù)據(jù)。。也就是要輸入到自定義字符CGRAM里面的
。
好的,怎么把獲取漢字代碼,怎么把代碼輸入到CGRAM里面都知道了,
下面就是要把我們的自定義漢字、字符顯示在LCD1602屏幕上了。。
我們知道常用字符是從0x20開始顯示,而0x00—0x0f都是沒有用的,其實這個正式為我們自定義顯示字符準備的。當你把上面的代碼輸入到CGRAM中,LCD1602機會把漢字或字符賦予地址,這個地址是從0x00開始,因為最多只能8個字符,所以當在CGRAM里面輸入8個字符代碼時,這8個字符的代碼的數(shù)據(jù)地址就是0x00開始到0x07。
所以當你要在LCD1602上顯示自定義字符時,只需要把這個地址用數(shù)據(jù)輸入就OK。
Write_date(0x00—0x07);
也就是說現(xiàn)在你要顯示自定義字符和你顯示常用字符一樣的做法了,先寫地址,然后寫數(shù)據(jù)
自定義字符的數(shù)據(jù)就是0x00—0x07。也就是你自定義的8個字符。
這里用 Proteus 仿真軟件演示
附程序
編寫時間: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); //開始寫入你要顯示的自定義字符、漢字代碼
for(i=0;i<64;i++)
{
write_date(table[i]);
delay(5);
}
write_cmd(0x80); //從第一行第一列開始顯示
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);
}
}
}