新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机采用模拟时序控制点阵图形液晶程序

51单片机采用模拟时序控制点阵图形液晶程序

作者: 时间:2016-11-28 来源:网络 收藏


//////////////////////////////////////////////////////////////////////////////////
///全角字符点阵码数据输出///
//////////////////////////////////////////////////////////////////////////////////
void Putcdot(Uchar Order)
{
Uchar i,bakerx,bakery;///共定义3个局部变量///
int x;///偏移量,字符量少的可以定义为UCHAR///
bakerx = col;///暂存x,y坐标,已备下半个字符使用 ///
bakery = row;
x=Order // 0x20;///每个字符32字节///

///上半个字符输出,16列///
for(i=0;i<16;i++)
{
Wrdata(Hzk[x]);///写输出一字节///
x++;
col++;
if (col==LCMLIMIT){ col=0;row++;row++;} ///下一列,如果列越界换行///
if (row>6) row=0;///如果行越界,返回首行///
}///上半个字符输出结束 ///

///下半个字符输出,16列///
col = bakerx;
row = bakery+1;
for(i=0;i<16;i++)///下半部分///
{
Wrdata(Hzk[x]);
x++;
col++;
if (col==LCMLIMIT){col=0;row++;row++;}///下一列,如果列越界换行///
if (row>7) row=1;///如果行越界,返回首行///
}///下半个字符输出结束 ///
row = bakery;
}///整个字符输出结束///

//////////////////////////////////////////////////////////////////////////////////
///清屏,全屏幕清零///
//////////////////////////////////////////////////////////////////////////////////
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col
}

//////////////////////////////////////////////////////////////////////////////////
///从液晶片上读数据,保留在全局变量中///
//////////////////////////////////////////////////////////////////////////////////

void Rddata(void)
{
Locatexy();///坐标定位,返回时保留分区状态不变///
Datalcm=0xFF;
Dilcm = 1;///数据///
Rwlcm = 1;///读数据///
Elcm = 1;///读入到LCM///
_nop_();
cbyte = Datalcm;///虚读一次 ///
Elcm = 0;
Locatexy();///坐标定位,返回时保留分区状态不变///
Datalcm=0xFF;
_nop_();
Dilcm = 1;///数据///
Rwlcm = 1;///读数据///
Elcm = 1;///读入到LCM///
_nop_();
cbyte = Datalcm;///从数据口读数据,真读 ///
Elcm = 0;
}

//////////////////////////////////////////////////////////////////////////////////
///数据写输出///
//////////////////////////////////////////////////////////////////////////////////

void Wrdata(Uchar X)
{
Locatexy();///坐标定位,返回时保留分区状态不变///
//wtcom();
Dilcm = 1;///数据输出///
Rwlcm = 0;///写输出///
Datalcm = X;///数据输出到数据口 ///
Elcm = 1;///读入到LCM///
_nop_();
Elcm = 0;
}

//////////////////////////////////////////////////////////////////////////////////
/// 命令输出,每次输出一个分区控制口 ///
//////////////////////////////////////////////////////////////////////////////////

///void Wrcmd(Uchar X)
//{
//Locatexy();///确定分区,返回时保留分区状态不变///
//wtcom();///等待LCM操作允许 ///
//Dilcm = 0;///数据操作///
//Rwlcm = 0;///写输出///
//Datalcm = X;///数据输出到数据口 ///
//Elcm = 1;_nop_();Elcm = 0;///读入到LCM///
//}

//////////////////////////////////////////////////////////////////
/// 命令输出到左区控制口///
//////////////////////////////////////////////////////////////////

void WrcmdL(Uchar X)
{
lcdbusyL();///确定分区,返回时保留分区状态不变///
Dilcm = 0;///命令操作///
Rwlcm = 0;///写输出///
Datalcm = X;///数据输出到数据口 ///
Elcm = 1;_nop_();Elcm = 0;///读入到LCM///
}

//////////////////////////////////////////////////////////////////
/// 命令输出到中区控制口///
//////////////////////////////////////////////////////////////////

void WrcmdM(Uchar X)
{
lcdbusyM();///确定分区,返回时保留分区状态不变///
Dilcm = 0;///命令操作///
Rwlcm = 0;///写输出///
Datalcm = X;///命令输出到数据口 ///
Elcm = 1;_nop_();Elcm = 0;///读入到LCM///
}

//////////////////////////////////////////////////////////////////
/// 命令输出到右区控制口///
//////////////////////////////////////////////////////////////////

void WrcmdR(Uchar X)
{
lcdbusyR(); ///确定分区,返回时保留分区状态不变///
Dilcm = 0;///命令操作///
Rwlcm = 0;///写输出///
Datalcm = X;///命令输出到数据口 ///
Elcm = 1;_nop_();Elcm = 0;///读入到LCM///
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 分区操作允许等待,返回时保留分区选择状态///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void lcdbusyL(void)
{
CS1LCM = 0;///CLRCS1///
CS2LCM = 1;///SETBCS2///
CS3LCM = 1;///SETBCS3///
wtcom();/// waitting for enable///
}

void lcdbusyM(void)
{
CS1LCM = 1;///SETBCS1///
CS2LCM = 0;///CLRCS2///
CS3LCM = 1;///SETBCS3///
wtcom();/// waitting for enable///
}

void lcdbusyR(void)
{
CS1LCM = 1;///SETBCS1///
CS2LCM = 1;///SETBCS2///
CS3LCM = 0;///CLRCS3///
wtcom();/// waitting for enable///
}

void wtcom(void)
{
Dilcm = 0;///CLRDI///
Rwlcm = 1;///SETBRW///
Datalcm = 0xFF;///MOVDATA_LCM,#0FFH///
Elcm= 1;_nop_();
while(Datalcm & Lcdbusy);
Elcm= 0;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///根据设定的坐标数据,定位LCM上的下一个操作单元位置///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Locatexy(void)
{
unsigned charx,y;
switch (col&0xc0)///col.and.0xC0///
{///条件分支执行///
case 0:{lcdbusyL();break;} ///左区///
case 0x40:{lcdbusyM();break;} ///中区///
case 0x80:{lcdbusyR();break;} ///右区///
}
x = col&0x3F|SETX;///col.and.0x3f.or.setx///
y = row&0x07|SETY;///row.and.0x07.or.sety///
wtcom();///waitting for enable///
Dilcm = 0;///CLRDI///
Rwlcm = 0;///CLRRW///
Datalcm = y;///MOVP0,Y///
Elcm = 1;_nop_();Elcm = 0;
wtcom();///waitting for enable///
Dilcm = 0;///CLRDI///
Rwlcm = 0;///CLRRW///
Datalcm = x;///MOVP0,X///
Elcm = 1;_nop_();Elcm = 0;
}

//////////////////////////////////////////////////////////////////
///液晶屏初始化///
//////////////////////////////////////////////////////////////////

void Lcminit(void)
{
cbyte = DISPOFF;///关闭显示屏 ///
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPON;///打开显示屏 ///
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte = DISPFIRST;///定义显示起始行为零 ///
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
Lcmcls();
col=0;///清屏///
row=0;
Locatexy();
}
//////////////////////////////////////////////////////////////////
/// 延时///
//////////////////////////////////////////////////////////////////
void Delay(Uchar MS)
{
Uchar us,usn;
while(MS!=0)
{ usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0){us--;};
usn--;
}
MS--;
}
}

//////////////////////////////////////////////////////////////////
//定义字符串数组///
//////////////////////////////////////////////////////////////////

Uchar code STR1[]=
{
0x80,0x81,0x82,0x83,0x84,0x85,
0x86,0x87,0x88,0x89,0x8a,0x8B
};

Uchar code STR2[]="Our friend over the wold";
Uchar code STR3[]="Program by Keil C51 6.12";
Uchar code STR4[]="Thank you ~v~ 1234567890";


评论


技术专区

关闭