#include"intrins.h"
#include"lcd.h"
sbit WR = P2^7;
sbit RD = P2^6;
sbit CE = P2^5;
sbit CD = P2^4;
sbit RST = P2^3;
sbit FS1 = P2^2;
sbit datadir = P3^7;
unsigned char Width = 30 ;
void delayx(unsigned int delx)
{
unsigned int i=0;
while(i<delx)
{
i++;
}
}
void SdCmd(uchar Command)
{
uchar busy;
CE = 0; // 选择模块
CD = 1; // 选择指令通道
// datadir=0;
datadir=1;
do
{
dataport=0xff;
RD = 0; // 读信号有效
_nop_(); _nop_(); _nop_();
P4MDIN=0xff;
busy = dataport&0x03; //读忙标志位
RD = 1; //读信号无效
}
while (busy!=3); //判断忙标志*/
P4MDOUT=0xff;
delayx(50);
datadir=0;
dataport = Command; //指令代码送入数据端
WR = 0; // 写信号有效
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
WR = 1; //写信号无效
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
CE = 1; //封闭模块
_nop_(); _nop_(); _nop_();
}
//---------数据传送子程序-------------------------
void SdData(uchar DData)
{
uchar busy;
CE = 0; // 选择模块
CD = 1; // 选择指令通道
// datadir=0;
datadir=1;
do
{
dataport=0xff;
RD = 0; // 读信号有效
_nop_(); _nop_(); _nop_();
P4MDIN=0xff;
busy = dataport&0x03; //读忙标志位
RD = 1; //读信号无效
}
while (busy!=3); //判断忙标志*/
delayx(50);
P4MDOUT=0xff;
datadir=0;
CD=0; //选择数据通道
dataport= DData; //数据送入数据端
WR = 0; // 写信号有效
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
WR = 1; //写信号无效
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
CE = 1; //封闭模块
_nop_(); _nop_(); _nop_();
}
//--------清屏程序(间接控制方式)----------------------------
void ClearRAM()
{
uint i;
uchar busy=0;
SdData(0x00); SdData(0x08); SdCmd(0x24); //设置RAM地址
SdCmd(0xb0); //设置自动写方式
CE=0; //选择模块
for (i=0;i<3840;i++) // 清7000个RAM单元(不破坏CGRAM区)
{
CD = 1;
// datadir=0;
datadir=1;
do
{
dataport=0xff;
RD = 0; //读信号有效
P4MDIN=0xff;
busy=dataport&0x08; //读忙标志位
RD = 1; //读信号无效
}
while (busy!=8); //判断忙标志*/
delayx(50);
P4MDOUT=0xff;
datadir=0;
CD=0; //选择数据通道
dataport= 0x00; //写数据00h
WR = 0; //写信号有效
_nop_(); _nop_(); _nop_();
WR = 1; //写信号无效
_nop_(); _nop_(); _nop_();
}
CE = 1; //封闭模块
SdCmd(0xb2); //结束自动写方式
}
void Draw_Dot(uint x,y)
{
uint addr;
addr=y*Width+x/8+0x0800;
SdData(addr);
SdData(addr>>8);
SdCmd(0x24);
x=0x07-x%8;
SdCmd(x|0xf8); //置"1"
}
void Clear_Dot(uint x,y)
{
uint addr;
addr=y*Width+x/8+0x0800;
SdData(addr);
SdData(addr>>8);
SdCmd(0x24);
x=0x07-x%8;
SdCmd(x|0xf0); //置"0"
}
/*************************************************
函数功能:在指定位置画一个指定大小的汉字子程序
函数名:void Draw_Character(unsigned char X_coordinate,Y_coordinate,Character_size, *character_code )
入口参数:显示汉字区域在X,Y方向上的起始坐标,要显示汉字的大小,存放汉字编码的数组名
出口参数:无
**************************************************/
void Draw_Character(unsigned char X_coordinate,Y_coordinate,Character_size,unsigned char *Character_code)
{
unsigned char i=0,j=0,k=0;
unsigned char X_width=0;
X_width=Character_size/8;
for(k=0;k<Character_size;k++)
{
for(i=0;i<X_width;i++)
{
for(j=0;j<8;j++)
{
if(*Character_code&0x80)
{
Draw_Dot(X_coordinate++,Y_coordinate);
}
else
{
Clear_Dot(X_coordinate++,Y_coordinate);
}
*Character_code>>=1;
}
Character_code++;
}
Y_coordinate++;
}
}
/*****************************************************
函数功能:在指定位置画一个指定大小的ASC字符子函数
函数名:void Draw_ASC(uchar X_coordinate,Y_coordinate,X_size,Y_size,*ASC_Ccode)
入口参数:显示ASC字符区域在X,Y方向上的起始坐标,要显示的ASC字符在X,Y方向上的大小,存放ASC字符编码的数组名
出口参数:无
******************************************************/
void Draw_ASC(unsigned char X_coordinate,Y_coordinate,X_size,Y_size,unsigned char *ASC_code)
{
unsigned char i=0,j=0,k=0;
unsigned char X_width=0;
X_width=X_size/8;
for(k=0;k<Y_size;k++)
{
for(i=0;i<X_width;i++)
{
for(j=0;j<8;j++)
{
if(*ASC_code&0x80)
{
Draw_Dot(X_coordinate++,Y_coordinate);
}
else
{
Clear_Dot(X_coordinate++,Y_coordinate);
}
*ASC_code>>=1;
}
ASC_code++;
}
Y_coordinate++;
}
}
/******************************************************************
函数功能:在指定位置画一条指定长度的水平线
函数名:void Darw_HorizontalLine(unsigned char start_X,start_Y,end_X)
入口参数:水平线起始点X,Y方向上的坐标值,终止点X方向的坐标值
出口参数:无
******************************************************************/
void Draw_HorizontalLine(unsigned char start_X,start_Y,end_X)
{
unsigned char dalt_X=0;
unsigned char i=0;
dalt_X=end_X-start_X+1;
for(i=0;i<dalt_X;i++)
{
Draw_Dot(start_X++,start_Y);
}
}
/******************************************************************
函数功能:在指定位置画一条指定长度的垂直线
函数名:void Draw_VerticalLine(unsigned char start_X,start_Y,end_Y)
入口参数:垂直线起始点X,Y方向的坐标值,终止点Y方向的坐标值
******************************************************************/
void Draw_VerticalLine(unsigned char start_X,start_Y,end_Y)
{
unsigned char i=0;
unsigned char dalt_Y=0;
dalt_Y=end_Y-start_Y+1;
for(i=0;i<dalt_Y;i++)
{
Draw_Dot(start_X,start_Y++);
}
}
/*********************************************************************
函数功能:在指定位置画一个指定大小的矩形子函数
函数名:void Draw_retangle(unsigned char start_X,start_Y,end_X,end_Y)
入口参数:矩形起始点在X,Y方向上的坐标值,终止点在X,Y方向上的坐标值
出口参数:无
*********************************************************************/
void Draw_retangle(unsigned char start_X,start_Y,end_X,end_Y)
{
Draw_VerticalLine(start_X,start_Y,end_Y);
Draw_HorizontalLine(start_X,start_Y,end_X);
Draw_VerticalLine(end_X,start_Y,end_Y);
Draw_HorizontalLine(start_X,end_Y,end_X);
}
//*********************************************************************
void initLCM(void)
{
FS1=0;
RST=0;
delayx(500);
RST=1;
SdData(0x00); SdData(0x00); SdCmd(0x40); // 设置文本区域首地址
SdData(Width); SdData(0x00); SdCmd(0x41);// 设置文本区域宽度
SdData(0x00); SdData(0x08); SdCmd(0x42); // 设置图形区域首地址
SdData(Width); SdData(0x00); SdCmd(0x43);// 设置图形区域宽度
SdData(0x00); SdData(0x00); SdCmd(0x21); // 设置光标地址
SdCmd(0x81); // 设置显示模式,双区异或显示,使用内部字库
SdCmd(0xa7); //设置光标形状
SdCmd(0x98); // 设置显示开关:文本开,图形开,光标关,光标闪烁关
}