1602 自帶的字庫(kù)只是一些字符,而并沒有漢字,其實(shí)1602是可以顯示一些簡(jiǎn)單的漢子的比如年、月、日等,還有一些比較簡(jiǎn)單的特殊符號(hào)等,下面來說一下他的現(xiàn)實(shí) 原理,其實(shí)最基本的就是一個(gè)自建字庫(kù),在就是對(duì)DDRAM的操作,只要把要顯示的漢子或符號(hào)寫入DDRAM 就可以了,下面寫說一下 漢字的編碼 比如日字,對(duì)于5*8的液晶屏分為8行5列,每一列對(duì)應(yīng)一個(gè)8位的二進(jìn)制值,需要亮的地方置1其他的地方置0.所以得出的日子的編碼就是 0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00.接下來就是將字庫(kù)寫入到CGRAM,1602片內(nèi)提供00h到0fh 的存儲(chǔ)位置,將編碼寫入對(duì)應(yīng)的地址即可,接下來就是把你要顯示的字符下乳DDRAM中就可以顯示了。 下面附程序:
1602.h
#ifndef _LCD_1602
#define _LCD_1602
#define DPORT P0
#define uchar unsigned char
#define NoDisp 0
#define NoCur 1
#define CurNoFlash 2
#define CurFlash 3
#define DDRAM 0x00
sbit RS = P3^7;
sbit RW = P3^6;
sbit E = P3^5;
extern void LcdWcn(uchar c); /*檢測(cè)忙信號(hào)的送控制字子程序*/
extern void LcdWc(uchar c); /*檢測(cè)忙信號(hào)的送控制字子程序*/
extern void WriteChar(uchar); /*在指定的行與列顯示*/
extern void LcdPos(); /*LCD 的復(fù)位程序*/
extern void LcdWd(uchar c); /*帶忙檢測(cè)的寫字符子程序*/
extern void LcdWdn(uchar c); /*不檢測(cè)忙的寫字符子程序*/
extern void mDelay(unsigned int Delay);
extern void RstLcd();
extern void ClrLcd(); /*清屏命令*/
extern void WaitIdle(); /*正常讀寫操作之前檢測(cè)LCD 控制器*/
extern void WriteString(char s[]);
extern void SetCur(uchar Cur); /*光標(biāo)設(shè)置命令Cur 為設(shè)定光標(biāo)參數(shù)*/
extern void Setlocal(uchar Xpos,Ypos); /*設(shè)置光標(biāo)開始顯示位置*/
extern void WriteDatan(uchar da); /*不檢測(cè)忙信號(hào)寫入數(shù)據(jù)*/
extern void WriteData(uchar data1); /*檢測(cè)忙信號(hào)寫入數(shù)據(jù)*/
extern void SetDDRAM(); /*置DDRAM初地址,可以通過更改DDRAM更改初地址*/
#endif
***************************************************************************************************************************
1602.c
#include "reg51.h"
#include
#include"1602.h"
/*uchar Xpos; //列方向地址指針
uchar Ypos; //行方向地址指針*/
uchar Xpos; //列方向地址指針
uchar Ypos; //行方向地址指針
void Setlocal(uchar Xposz,Yposz)
{
Xpos=Xposz;
Ypos=Yposz;
}
void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
/*光標(biāo)設(shè)置命令
Cur 為設(shè)定光標(biāo)參數(shù)
*/
void SetCur(uchar Cur)
{ switch(Cur)
{ case 0x0:
{ LcdWc(0x08); //關(guān)顯示
break;
}
case 0x1:
{ LcdWc(0x0c); //開顯示但無光標(biāo)
break;
}
case 0x2:
{ LcdWc(0x0e); //開顯示有光標(biāo)但不閃爍
break;
}
case 0x3:
{ LcdWc(0x0f); //開顯示有光標(biāo)且閃爍
break;
}
case 0x4:
{ LcdWc(0x02); //返回
break;
}
default: break;
}
}
/*清屏命令
*/
void ClrLcd()
{ LcdWc(0x01);
}
/*在指定的行與列顯示
*/
void WriteChar(uchar c)
{ LcdPos();
LcdWd(c);
}
/*正常讀寫操作之前檢測(cè)LCD 控制器
*/
void WaitIdle()
{ uchar tmp;
DPORT=0xff;
RS=0;
RW=1;
E=1;
_nop_();
for(;;)
{ tmp=DPORT;
tmp&=0x80;
if(tmp==0)
break;
}
E=0;
}
/*不檢測(cè)忙的寫字符子程序
*/
void LcdWdn(uchar c)
{
RS=1;
RW=0;
DPORT=c; //寫入待寫字符
E=1;
_nop_();
E=0;
}
/*帶忙檢測(cè)的寫字符子程序
*/
void LcdWd(uchar c)
{ WaitIdle();
LcdWdn(c);
}
/*不檢測(cè)忙信號(hào)的送控制字子程序*/
void LcdWcn(uchar c)
{ RS=0;
RW=0;
DPORT=c;
E=1;
_nop_();
E=0;
}
/*檢測(cè)忙信號(hào)的送控制字子程序*/
void LcdWc(uchar c)
{ WaitIdle();
LcdWcn(c);
}
void LcdPos()
{ uchar tmp;
Xpos&=0x0f; //16xx 型液晶的范圍是0~15
Ypos&=0x01; //Y 的范圍是0~1
tmp=Xpos;
if(Ypos==1)
{ tmp+=0x40;
}
tmp|=0x80;
LcdWc(tmp);
}
/*LCD 的復(fù)位程序
*/
void RstLcd()
{ mDelay(15); //延時(shí)15ms
LcdWcn(0x38);
mDelay(5);
LcdWcn(0x38);
mDelay(5);
LcdWcn(0x38);
LcdWc(0x38);
LcdWc(0x08);
LcdWc(0x01);
LcdWc(0x06);
LcdWc(0x0c);
}
void WriteString(char s[])
{ uchar pS=0;
for(;;)
{ WriteChar(s[pS]);
pS++;
if(s[pS]==0)
break;
if(++Xpos>=15) //每行最多顯示16 個(gè)字符
break;
}
}
void WriteDatan(uchar da) //不檢測(cè)忙信號(hào)寫入數(shù)據(jù)
{
RS=1;
RW=0;
DPORT=da;
E=1;
_nop_();
E=0;
}
void WriteData(uchar data1)//檢測(cè)忙信號(hào)寫入數(shù)據(jù)
{
WaitIdle();
WriteDatan(data1);
}
void SetDDRAM()
{
uchar p;
p=0x80|DDRAM;
LcdWc(p);
}
************************************************************************************************************************************
main.c
#include"reg51.h"
#include
#include"1602.h"
#define uchar unsigned char
#define uint unsigned int
const uchar s1[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00}; //年,月,日
const uchar s2[]={'2','0','0','9',0x00,'8',0x01};
void main()
{
uint i=0;
uint j=0;
//uchar *p=s1;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
RstLcd(); //復(fù)位LCD
ClrLcd();
SetCur(CurFlash); //光標(biāo)顯示且閃爍
LcdWc(0x40);
while(i!=16)
{
WriteData(s1[i]);
i++;
}
SetDDRAM();
while(j!=7)
{
WriteData(s2[j]);
j++;
}
}