1602液晶显示汉字程序Word文档格式.docx
《1602液晶显示汉字程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《1602液晶显示汉字程序Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
RW=0;
RS=0;
EN=1;
DB=out_data;
EN=0;
delay(10);
voidOUTD(charout_data)
RS=1;
DB=out_data;
OUTI()是写入指令的函数,OUTD()是写入数据的函数。
如:
左上角第一个5*7的显示数据为:
0x00,0x01,0x81,0x12,0x24,0x41,0x81,0x10
蓝色区域的相应位为1
这样就可以写出全部4个5*7点阵的显示数据了,把它封装在一个数组中,如数组,
hanzi[]={0x00,0x01,0x81,0x12,0x24,0x41,0x81,0x10,
……
之后利用命令:
OUTI(0X40);
64;
i++)
{OUTD(neu[i]);
将这个数组中的数据赋值到1602内部CGRAM中。
完成后,再设置数据在1602上的
显示地址,根据图1的结构,设置好位置,如在第一行第一个字符和第二个字符以及第二行
第一个字符和第二个字符处显示:
Command_out(0x80+0x00);
4;
{data_out(i);
}
Command_out(0x80+0x40);
for(i=4;
8;
{data_out(i);
command_out()的作用是设置显示的起始地址,data_out()的作用是将hanzi[]数组中的16
进制数据发送出去,每一个16进制数字对应之5*7点阵上的每一行内容。
第1行第1个字
符需要8个16进制数据,第1行第2个字符处也需要816进制数据。
还有第2行的两个字
符点阵,这样显示一个汉字需要32个16进制数据。
下面列举一个实例(proteus仿真通过)
//***************************************************************************************
//硬件连接:
1602VDD接5V,VO接地,BL1接5V,BL2接地,8根数据线接P0口,RSRWE分别接P2.0、P2.1、P.4口
#include<
reg52.h>
string.h>
#defineBusy0x80//用于检测LCM状态字中的Busy标识
#defineLCM_DataP0
sbitLCM_RS=P2^0;
//寄存器选择
sbitLCM_RW=P2^1;
//读/写控制
sbitLCM_E=P2^4;
//读/写使能
inti,j;
//自定义字符列表
//=====================================================================================
unsignedcharcharacter0[8]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02},//年
character1[8]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11},//月
character2[8]={0x0f,0x09,0x09,0x09,0x0f,0x09,0x09,0x0f},//日
characterN[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//日
//==========================================================
//=========================================================
//延时程序
//=======================================================
voidDelay5Ms(void)
unsignedlongintTempCyc=5552;
while(TempCyc--);
voidDelay400Ms(void)
unsignedcharTempCycA=5;
unsignedintTempCycB;
while(TempCycA--)
TempCycB=7269;
while(TempCycB--);
};
//===================================================================
//读写子程序
//=================================================================
//读数据
unsignedcharReadDataLCM(void)
LCM_RS=1;
LCM_RW=1;
LCM_E=1;
LCM_E=0;
for(i=0;
100;
return(LCM_Data);
//读状态
unsignedcharReadStatusLCM(void)
LCM_Data=0xFF;
LCM_RS=0;
//while(LCM_Data&
Busy);
//检测忙信号
//写数据
voidWriteDataLCM(unsignedcharWDLCM)
ReadStatusLCM();
//检测忙
LCM_Data=WDLCM;
LCM_RW=0;
//若晶振速度太高可以在这后加小的延时
//延时
//写指令
voidWriteCommandLCM(unsignedcharWCLCM,BuysC)//BuysC为0时忽略忙检测
if(BuysC)ReadStatusLCM();
//根据需要检测忙
LCM_Data=WCLCM;
//===========================================================
//初始化子程序
voidLCMInit(void)//LCM初始化
LCM_Data=0;
WriteCommandLCM(0x38,0);
//三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,1);
//显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1);
//关闭显示
WriteCommandLCM(0x01,1);
//清屏
WriteCommandLCM(0x06,1);
//显示光标移动设置
WriteCommandLCM(0x0c,1);
//显示开及光标设置
//================================================================
//按指定位置显示一个字符
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)
Y&
=0x1;
X&
=0xF;
//限制X不能大于15,Y不能大于1
if(Y)X|=0x40;
//当要显示第二行时地址码+0x40;
X|=0x80;
//算出指令码
WriteCommandLCM(X,0);
//这里不检测忙信号,发送地址码
WriteDataLCM(DData);
//按指定位置显示一串字符
//voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData)
//说明:
x(0-15):
x参数y(0-1):
y参数DData(字符串):
要显示的内容(英文、数字、符号)
//========================================================================
voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData)
unsignedcharListLength,j;
ListLength=strlen(DData);
if(X<
=0xF)//X坐标应小于0xF
{
for(j=0;
j<
ListLength;
j++)
DisplayOneChar(X,Y,DData[j]);
//显示单个字符
X++;
//显示自定义字符
//voidmychar(charxx,charyy,unsignedchar*character,unsignedcharsaveto)
xx(0-15):
为x参数.yy(0-1):
y参数.character:
要显示的字符的列表地址,在程序前面有定义
//saveto(1-7)为字符保存的RAM,每屏最多显示7个自定义字符
//(0x00-0x0h是自定义字符)
//=============================================================
voidmychar(charxx,charyy,unsignedchar*character,unsignedcharsaveto)
unsignedcharadd=(saveto<
<
3)|0x40;
unsignedchart;
//临时变量,每一行的值
/*
t=*(character+0);
WriteCommandLCM(add,0);
//第1行
WriteDataLCM(t);
t=*(character+1);
WriteCommandLCM(add+1,0);
//第2行
t=*(character+2);
WriteCommandLCM(add+2,0);
//第3行
t=*(character+3);
WriteCommandLCM(add+3,0);
//第4行
t=*(character+4);
WriteCommandLCM(add+4,0);
//第5行
t=*(character+5);
WriteCommandLCM(add+5,0);
//第6行
t=*(character+6);
WriteCommandLCM(add+6,0);
//第7行
t=*(character+7);
WriteCommandLCM(add+7,0);
//第8行
*/
for(i=0;
WriteCommandLCM(add+i,0);
WriteDataLCM(*(character+i));
DisplayOneChar(xx,yy,saveto);
//显示字符
//===============================================================
//主函数
main()
Delay400Ms();
LCMInit();
//1602初始化
while
(1)
DisplayListChar(0,0,"
ThisisListChar"
);
DisplayListChar(0,1,"
!
"
for(j=0;
30;
j++)for(i=0;
30000;
//清屏
ThisisOneChar:
DisplayOneChar(0,1,0x4f);
DisplayOneChar(1,1,0x6e);
DisplayOneChar(2,1,0x65);
DisplayOneChar(3,1,0x21);
ThisisMyChar:
mychar(0,1,character0,1);
mychar(1,1,character1,2);
mychar(2,1,character2,3);
}