/****************************************/
/* 字符点阵码数据输出 */
/****************************************/
void Putedot(Uchar x,Uchar y,Uchar flash *Lib,Uchar Order,Uchar widthw)
{
Uchar i;
int xi; /*偏移量,字符量少的可以定义为Uchar */
col = x; /*暂存x,y坐标,已备下半个字符使用 */
row = y;
xi=Order * widthw<<1; /*每个字符widthw列 */
/****************上半个字符输出**************/
for(i=0;i<widthw;i++)
{
cbyte = Lib[xi]; /*取点阵码,rom数组 */
Wrdata(cbyte); /*写输出一字节 */
xi++;
col++;
if (col==LCMLIMIT){col=0;row+=2;}; /*下一列,如果列越界换行*/
if (row>7) row=0; /*如果行越界,返回首行 */
} /*上半个字符输出结束 */
col = x; /*列对齐 */
row = y+1; /*指向下半个字符行 */
/****************下半个字符输出****************/
for(i=0;i<widthw;i++)
{
cbyte = Lib[xi]; /*取点阵码 */
Wrdata(cbyte); /*写输出一字节 */
xi++;
col++;
if (col==LCMLIMIT){col=0;row+=2;}; /*下一列,如果列越界换行*/
if (row>7) row=1; /*如果行越界,返回首行 */
} /*下半个字符输出结束 */
row=y;
} /*整个字符输出结束 */
/****************************************/
/* 清屏,全屏幕清零 */
/****************************************/
void Lcmcls( void )
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++) Wrdata(0);
}
/****************************************/
/* 从液晶片上读数据,保留在全局变量中 */
/****************************************/
void Rddata(void)
{
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
DDRA = 0; /*改变PA口的状态,作为输入口 */
Datalcm=0xFF;
lcd_set_di(); /*数据 */
lcd_set_rw(); /*读数据 */
lcd_set_e();
NOP(); /*读入到LCM */
cbyte = PINA; /*虚读一次 */
lcd_clear_e();
Locatexy(); /*坐标定位,返回时保留分区状态不变 */
DDRA = 0;
Datalcm=0xFF;
lcd_set_di(); /*数据 */
lcd_set_rw(); /*读数据 */
lcd_set_e();
NOP(); /*读入到LCM */
cbyte = PINA; /*从数据口读数据,真读 */
lcd_clear_e();NOP();
DDRA = 0xFF; /*改变PA口的状态,作为输出口 */
}
/****************************************/
/* 数据写输出 */
/****************************************/
void Wrdata(Uchar X)
{
Locatexy(); /*坐标定位,保留分区状态不变 */
wtcom();
lcd_set_di(); /*数据输出*/
lcd_clear_rw();
NOP(); /*写输出 */
Datalcm = X; /*数据输出到数据口 */
lcd_set_e(); /*LCM读入*/
NOP();
lcd_clear_e();
}
/********************************/
/* 命令输出到左区控制口 */
/********************************/
void WrcmdL(Uchar X)
{
lcdbusyL(); /*确定分区,返回时保留分区状态不变*/
lcd_clear_di(); /*命令操作 */
lcd_clear_rw();NOP(); /*写输出 */
Datalcm = X; /*数据写到数据口 */
lcd_set_e();NOP();lcd_clear_e(); /*LCM读入*/
}
/********************************/
/* 命令输出到中区控制口 */
/********************************/
void WrcmdM(Uchar X)
{
lcdbusyM(); /*确定分区,保留分区状态不变*/
lcd_clear_di(); /*命令操作 */
lcd_clear_rw();NOP(); /*写输出 */
Datalcm = X; /*命令写到数据口*/
lcd_set_e();NOP();lcd_clear_e(); /*LCM读入*/
}
/********************************/
/* 命令输出到右区控制口 */
/********************************/
void WrcmdR(Uchar X)
{
lcdbusyR(); /*确定分区,保留分区状态不变 */
lcd_clear_di(); /*命令操作 */
lcd_clear_rw();NOP(); /*写输出 */
Datalcm = X; /*命令输出到数据口 */
lcd_set_e();NOP();lcd_clear_e(); /*读入到LCM */
}
/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态 */
/********************************************************/
void lcdbusyL(void)
{
lcd_clear_cs1(); /*CLR CS1 */
lcd_set_cs2(); /*SETB CS2 */
lcd_set_cs3(); /*SETB CS3 */
wtcom(); /* waitting for enable */
}
void lcdbusyM(void)
{
lcd_set_cs1(); /*SETB CS1 */
lcd_clear_cs2(); /*CLR CS2 */
lcd_set_cs3(); /*SETB CS3 */
wtcom(); /* waitting for enable */
}
void lcdbusyR(void)
{
lcd_set_cs1(); /*SETB CS1 */
lcd_set_cs2(); /*SETB CS2 */
lcd_clear_cs3(); /*CLR CS3 */
wtcom(); /* waitting for enable */
}
void wtcom(void)
{
DDRA = 0;
lcd_clear_di(); /*CLR DI */
lcd_set_rw(); /*SETB RW */
Datalcm = 0xFF; /*MOV DATA_LCM,#0FFH */
lcd_set_e();NOP();
while(lcd_read_status());
lcd_clear_e();
DDRA=0xFF;
}
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置 */
/********************************************************/
void Locatexy(void)
{
Uchar x,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 */
lcd_clear_di(); /*CLR DI */
lcd_clear_rw(); /*CLR RW */
NOP();
Datalcm = y; /*MOV P0,Y */
lcd_set_e();NOP();lcd_clear_e();
wtcom(); /* waitting for enable */
lcd_clear_di(); /*CLR DI */
lcd_clear_rw(); /*CLR RW */
NOP();
Datalcm = x; /*MOV P0,X */
lcd_set_e();NOP();lcd_clear_e();
}
/********************************/
/*液晶屏初始化 */
/********************************/
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(); /*清屏 */
}
/********************************/
/* 延时 */
/********************************/
void Delay(Uchar MS)
{
timer1=MS;
while(timer1);
}
/********************************/
//定义字符串数组 */
/********************************/
Uchar flash STR1[]=
{
0x80,0x81,0x82,0x83,0x84,0x85,
0x86,0x87,0x88,0x89,0x8a,0x8B
};
Uchar flash STR2[]="http://www.xiao-qi.com/ ";
Uchar flash STR3[]="Program by ICCAVR V6.23B";
Uchar flash STR4[]="Thank you @_@ 1234567890";