TBCTL&=~MC_2;//停止计数
TBCTL&=~BIT0;//清除中断标志
}
classYeJing
{
private:
uchar*shujudir;
uchar*kongzhidir;
ucharrs;
ucharrw;
ucharen;
uchar*shujuin;
uchar*shujuout;
uchar*kongzhiout;
voidLCDChuShiHua(void);
voidXieMingLing(ucharcmd);
voidXieShuJu(uchardat);
ucharDuShuJu(void);
public:
YeJing(void);
YeJing(ucharsj,ucharkz);
YeJing(ucharsj,ucharkz,ucharrs_,ucharrw_,ucharen_);
voidQingChuGDRAM(void);
voidTuXiang1616(unsignedcharYaddr,unsignedcharXaddr,constunsignedchar*dp,ucharfanbai=ZHENGCHANG);
voidXianShiHanZi(ucharaddr,constuchar*pt,ucharnum);
voidXianShiZiFu(ucharaddr,constucharpt,ucharfangxiang=ZUO);
voidXianShiTuPian(constuchar*ptr,ucharfanbai=ZHENGCHANG);
voidXianShiRenYiTuPian(ucharxddr,ucharyddr,ucharx,uchary,constuchar*ptr);
/*******************************************
函数名称:
QingChuHanZi
功能:
清除液晶上显示的汉字。
参数:
无
返回值:
无
********************************************/
voidQingChuHanZi(void)
{
XieMingLing(0x01);
}
};
/*
以下三个构造函数将液晶的端口和控制位设置好。
使用构造函数时,参数为各端口的DIR寄存器。
注意:
参数后要加_,如P7DIR_。
默认P7口为数据口,P8口前4位(0-3)为控制口。
*/
YeJing:
:
YeJing(void)
{
shujudir=(uchar*)P7DIR_;
kongzhidir=(uchar*)P8DIR_;
rs=BIT0;
rw=BIT1;
en=BIT2;
shujuin=(uchar*)P7IN_;
shujuout=(uchar*)P7OUT_;
kongzhiout=(uchar*)P8OUT_;
LCDChuShiHua();
}
YeJing:
:
YeJing(ucharsj,ucharkz)
{
shujudir=(uchar*)sj;
kongzhidir=(uchar*)kz;
rs=BIT0;
rw=BIT1;
en=BIT2;
if((shujudir==(uchar*)P7DIR_)||(shujudir==(uchar*)P8DIR_))
{
shujuin=(uchar*)(sj-4);
shujuout=(uchar*)(sj-2);
}
else
{
shujuin=(uchar*)(sj-2);
shujuout=(uchar*)(sj-1);
}
if((kongzhidir==(uchar*)P7DIR_)||(kongzhidir==(uchar*)P8DIR_))
kongzhiout=(uchar*)(kz-2);
else
kongzhiout=(uchar*)(kz-1);
LCDChuShiHua();
}
YeJing:
:
YeJing(ucharsj,ucharkz,ucharrs_,ucharrw_,ucharen_)
{
shujudir=(uchar*)sj;
kongzhidir=(uchar*)kz;
rs=rs_;
rw=rw_;
en=en_;//注意:
控制位设置要用只有一位为1的uchar数值,如0x02、BIT3等。
if((shujudir==(uchar*)P7DIR_)||(shujudir==(uchar*)P8DIR_))
{
shujuin=(uchar*)(sj-4);
shujuout=(uchar*)(sj-2);
}
else
{
shujuin=(uchar*)(sj-2);
shujuout=(uchar*)(sj-1);
}
if((kongzhidir==(uchar*)P7DIR_)||(kongzhidir==(uchar*)P8DIR_))
kongzhiout=(uchar*)(kz-2);
else
kongzhiout=(uchar*)(kz-1);
LCDChuShiHua();
}
/*******************************************
函数名称:
LCDChuShiHua
功能:
初始化液晶模块
参数:
无
返回值:
无
********************************************/
voidYeJing:
:
LCDChuShiHua(void)
{
DingShiQiBFenPin;
_EINT();
LCD_CMDOut;//液晶控制端口设置为输出
//Delay_Nms(500);
XieMingLing(0x30);//基本指令集
YanChiNms
(1);
XieMingLing(0x02);//地址归位
YanChiNms
(1);
XieMingLing(0x0c);//整体显示打开,游标关闭
YanChiNms
(1);
XieMingLing(0x01);//清除显示
YanChiNms
(1);
XieMingLing(0x06);//游标右移
YanChiNms
(1);
XieMingLing(0x80);//设定显示的起始地址
}
/*******************************************
函数名称:
XieMingLing
功能:
向液晶中写控制命令
参数:
cmd--控制命令
返回值:
无
********************************************/
voidYeJing:
:
XieMingLing(ucharcmd)
{
ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data=cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:
XieShuJu
功能:
向液晶中写显示数据
参数:
dat--显示数据
返回值:
无
********************************************/
voidYeJing:
:
XieShuJu(uchardat)
{
ucharlcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data=dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:
DuShuJu
功能:
从液晶中读显示数据
参数:
无
返回值:
显示数据
********************************************/
ucharYeJing:
:
DuShuJu(void)
{
ucharlcdtemp=0;
uchardat;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do//判忙
{
LCD_EN_H;
_NOP();
lcdtemp=LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp&0x80);
LCD_DataIn;
LCD_RS_H;
LCD_RW_H;
LCD_EN_H;
_NOP();
dat=LCD2MCU_Data;
LCD_EN_L;
returndat;
}
/*******************************************
函数名称:
QingChuGDRAM
功能:
清除液晶GDRAM中的随机数据
参数:
无
返回值:
无
********************************************/
voidYeJing:
:
QingChuGDRAM(void)
{
uchari,j,k;
XieMingLing(0x34);//打开扩展指令集
i=0x80;
for(j=0;j<32;j++)
{
XieMingLing(i++);
XieMingLing(0x80);
for(k=0;k<16;k++)
{
XieShuJu(0x00);
}
}
i=0x80;
for(j=0;j<32;j++)
{
XieMingLing(i++);
XieMingLing(0x88);
for(k=0;k<16;k++)
{
XieShuJu(0x00);
}
}
XieMingLing(0x30);//回到基本指令集
}
/*******************************************
函数名称:
TuXiang1616
功能:
显示一个16*16大小的图形
参数:
Yaddr--Y地址
Xaddr--X地址
dp--指向图形数据存放地址的指针
返回值:
无
屏幕分两块显示,上面两行的X坐标和显示汉字的相同,第二行和第一行的X坐标等效。
Y坐标表示图片距上边距的像素点,范围为0x80~0x9f。
********************************************/
voidYeJing:
:
TuXiang1616(unsignedcharYaddr,unsignedcharXaddr,constunsignedchar*dp,ucharfanbai)
{
ucharj;
uchark=0;
//XieMingLing(0x01);//清屏,只能清除DDRAM
XieMingLing(0x34);//使用扩展指令集,关闭绘图显示
if(fanbai)
for(j=0;j<16;j++)
{
XieMingLing(Yaddr++);//Y地址
XieMingLing(Xaddr);//X地址
XieShuJu(~dp[k++]);
XieShuJu(~dp[k++]);
}
else
for(j=0;j<16;j++)
{
XieMingLing(Yaddr++);//Y地址
XieMingLing(Xaddr);//X地址
XieShuJu(dp[k++]);
XieShuJu(dp[k++]);
}
XieMingLing(0x36);//打开绘图显示
XieMingLing(0x30);//回到基本指令集模式
}
/*******************************************
函数名称:
XianShiHanZi
功能:
控制液晶显示汉字
参数:
addr--显示位置的首地址
pt--指向显示数据的指针
num--显示字符个数
返回值:
无
第一行:
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
第二行:
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
第三行:
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
第四行:
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
********************************************/
voidYeJing:
:
XianShiHanZi(ucharaddr,constuchar*pt,ucharnum)
{
uchari;
XieMingLing(addr);
for(i=0;i<(num*2);i++)
XieShuJu(*(pt++));
}
/*******************************************
函数名称:
XianShiZiFu
功能:
控制液晶显示汉字
参数:
addr--显示位置的首地址
pt--要显示的字符
fangxiang--字符靠左还是靠右
返回值:
无
第一行:
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87
第二行:
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97
第三行:
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
第四行:
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
********************************************/
voidYeJing:
:
XianShiZiFu(ucharaddr,constucharpt,ucharfangxiang)
{
XieMingLing(addr);
if(fangxiang)
{
XieShuJu(pt);
XieShuJu(0x20);
}
else
{
XieShuJu(0x20);
XieShuJu(pt);
}
}
/*******************************************
函数名称:
XianShiTuPian
功能:
在整个液晶屏幕上画图
参数:
ptr--图像指针
返回值:
无
********************************************/
voidYeJing:
:
XianShiTuPian(constuchar*ptr,ucharfanbai)
{
uchari,j,k;
XieMingLing(0x01);
XieMingLing(0x34);//打开扩展指令集
i=0x80;
if(fanbai)
{
for(j=0;j<32;j++)
{
XieMingLing(i++);
XieMingLing(0x80);
for(k=0;k<16;k++)
{
XieShuJu(~(*ptr++));
}
}
i=0x80;
for(j=0;j<32;j++)
{
XieMingLing(i++);
XieMingLing(0x88);
for(k=0;k<16;k++)
{
XieShuJu(~(*ptr++));
}
}
}
else
{
for(j=0;j<32;j++)
{
XieMingLing(i++);
XieMingLing(0x80);
for(k=0;k<16;k++)
{
XieShuJu(*ptr++);
}
}
i=0x80;
for(j=0;j<32;j++)
{
XieMingLing(i++);
XieMingLing(0x88);
for(k=0;k<16;k++)
{
XieShuJu(*ptr++);
}
}
}
XieMingLing(0x36);//打开绘图显示
XieMingLing(0x30);//回到基本指令集
}
/*******************************************
函数名称:
XianSHiRenYiTuPian
功能:
在任意位置显示任意分辨率的图片。
参数:
xddr--X地址,yddr--Y地址,x--X方向的图的大小,y--Y方向图的大小,ptr--图像指针。
返回值:
无
********************************************/
voidYeJing:
:
XianShiRenYiTuPian(ucharxddr,ucharyddr,ucharx,uchary,constuchar*ptr)
{
uchari,j,k,w,z,m,n,xzuobiao,xzuobiao2,yzuobiao;
uchartemp[5];
XieMingLing(0x34);//打开扩展指令集
/*if(xddr<0)
xddr=0;
elseif(xddr>127)
xddr=127;
if(yddr<0)
yddr=0;
elseif(yddr>63)
yddr=63;*///限定坐标范围,防止误