📄 hand_902_cmbus_ok.c
字号:
//-----------------------------------
temp_buffer[20]=rtc_buf[8];
temp_buffer[21]=rtc_buf[9];
temp_buffer[22]=':';
temp_buffer[23]=rtc_buf[10]; //
temp_buffer[24]=rtc_buf[11];
temp_buffer[25]=0;
printscr(9,3,'d',SPACE,temp_buffer);
return;
}
/*========================================================================================*
函数:void printhand(uchar line)
创建日期:2004.7.2
作者:rojam
功能:在图像三区显示手图案
参数:line-行,范围为1~8,列参数为固定值:3;
返回值:无
图形三区的RAM开始地址为:4000H
*========================================================================================*/
void printhand(uchar line)
{
uint i,j;
uchar charh,charl;
//-----------------------------------
lcdwritecom(0x4f); //光标移动方向,向下,地址加一。
for(i=0;i<3;i++)
{
charh=(line*496+3+i)/256;
charl=(line*496+3+i)%256;
lcdwritecom(0x46); //设置光标地址
lcdwritedata(charl); //csrl=0x00;
lcdwritedata(charh); //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
lcdwritecom(0x42); //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。
for(j=0;j<16;j++)
{
lcdwritedata(hand[i+j*3]);
}
}
return;
}
//---------------------------------------
void clearhand(uchar line)
{
uint i,j;
uchar charh,charl;
//-----------------------------------
lcdwritecom(0x4f); //光标移动方向,向下,地址加一。
for(i=0;i<3;i++)
{
charh=(line*496+3+i)/256;
charl=(line*496+3+i)%256;
lcdwritecom(0x46); //设置光标地址
lcdwritedata(charl); //csrl=0x00;
lcdwritedata(charh); //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
lcdwritecom(0x42); //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。
for(j=0;j<16;j++)
{
lcdwritedata(0);
}
}
return;
}
/*========================================================================================*
函数:void printscr(uchar type,const rom char *clum,uchar *clum)
创建日期:2004.7.2
作者:rojam
功能:屏幕打印函数
参数:line-行,clum-列。type:'c'-字符,'d'-变量。
返回值:无
原来显示:128×64=16字符×8字符
现在: 240*160=30字符×20字符
*========================================================================================*/
void printscr(uchar line,uchar clum,char type,static rom char *drom,uchar *dram)
{
uint dzposition,dzstep;
uint len,i,j,h;
uchar charh,charl;
for(i=0;i<248;i++) //清除缓存
{
buffer1.ichar[i]=0;
buffer2.ichar[i]=0;
}
for(len=0;len+clum<30;len++) //一行30个字符。
{
if(type=='c') //取出字符码
{
charh=drom[len];
charl=drom[len+1];
}
else //取出变量码
{
charh=dram[len];
charl=dram[len+1];
}
if((charh==0)||(charh==0xff)) //结束退出
break;
if(charh>0x7f) //汉字
{
//**********************查找汉字点阵位置**********************
// hznum 238 //汉字数组数-1,用于汉字折半查找
// hzstep 128 //汉字数组半长,用于汉字折半查找
//------------------------------------------------------------
if(len>28) break; //只剩半角退出
dzstep=dzposition=hzstep;
for(;dzstep>0;)
{
if(dzposition>hznum) dzposition=hznum; //数组超界拉回
dzstep/=2; //折半
if(HZ_MSK[dzposition].Index[0]>charh)
{
dzposition=dzposition-dzstep;
continue;
}
if(HZ_MSK[dzposition].Index[0]<charh)
{
dzposition=dzposition+dzstep;
continue;
}
if(HZ_MSK[dzposition].Index[1]>charl)
{
dzposition=dzposition-dzstep;
continue;
}
if(HZ_MSK[dzposition].Index[1]<charl)
{
dzposition=dzposition+dzstep;
continue;
}
goto next;
} //end 'for'
dzposition=0; //显示缺省字符
//-----------------------------------------------------------------------自动写数据
//-----------------dzposition:为对应汉字的位置寄存器。
next:
h=len+clum; //列位置值
for(i=0;i<8;i++)
{
buffer1.ichar[h+i*31]=HZ_MSK[dzposition].Msk[i+i]; //写u左半部分
buffer1.ichar[h+i*31+1]=HZ_MSK[dzposition].Msk[i+i+1]; //写u右半部分
}
for(i=0;i<8;i++)
{
buffer2.ichar[h+i*31]=HZ_MSK[dzposition].Msk[i+i+16]; //写d左半部
buffer2.ichar[h+i*31+1]=HZ_MSK[dzposition].Msk[i+i+16+1]; //写d右半部分
}
len++; //移2位
} //end 'if(charh>0x7f)'
//************************************查找字符点阵位置*********************************
else
{ //ascstep=64 ascnum=110
i=h=ascstep;
while(i)
{
if(h>ascnum) //数组超界拉回
h=ascnum;
i>>=1; //折半
if(ASC_MSK[h].Index>charh)
{
h-=i;
continue;
}
if(ASC_MSK[h].Index<charh)
{
h+=i;
continue;
}
goto next1;
} //end 'while'
h=0; //显示缺省字符
//--------------写数据
//--------------H:为所查找的字符在对应字符模中的索引值。
//-------------charl:为需显示的列位置。
next1:
charl=len+clum; //列位置值
for(i=0;i<8;i++)
buffer1.ichar[charl+i*31]=ASC_MSK[h].Msk[i]; //写左u部分
for(i=0;i<8;i++)
buffer2.ichar[charl+i*31]=ASC_MSK[h].Msk[i+8];//写左d部分
} //end 'else'
} //end 'for(len=0;len+clum<30;len++)'
//*********************************************************将显示缓冲区的数据送SD1335。
if(type=='c')
{//------------------------------------------------------整行刷
charh=(line*496)/256;
charl=(line*496)%256;
lcdwritecom(0x4c); //光标移动方向,向右,地址加一。
lcdwritecom(0x46); //设置光标地址
lcdwritedata(charl); //csrl=0x00;
lcdwritedata(charh); //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
lcdwritecom(0x42); //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。
for(i=0;i<248;i++)
lcdwritedata(buffer1.ichar[i]); //上半行。
for(i=0;i<248;i++)
lcdwritedata(buffer2.ichar[i]); //下半行。
}
else
{
//---------------------------------------------------部分刷,即从clum向右
for(j=0;j<8;j++)
{
charh=(line*496+clum+j*31)/256;
charl=(line*496+clum+j*31)%256;
lcdwritecom(0x4c); //光标移动方向,向右,地址加一。
lcdwritecom(0x46); //设置光标地址
lcdwritedata(charl); //csrl=0x00;
lcdwritedata(charh); //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
lcdwritecom(0x42); //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。
for(i=clum;i<31;i++)lcdwritedata(buffer1.ichar[j*31+i]); //上半行。
}
for(j=8;j<16;j++)
{
charh=(line*496+clum+j*31)/256;
charl=(line*496+clum+j*31)%256;
lcdwritecom(0x4c); //光标移动方向,向右,地址加一。
lcdwritecom(0x46); //设置光标地址
lcdwritedata(charl); //csrl=0x00;
lcdwritedata(charh); //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
lcdwritecom(0x42); //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。
for(i=clum;i<31;i++)lcdwritedata(buffer2.ichar[(j-8)*31+i]); ////下半行。
}
}
return;
}
//=====================================================================================
//
// LCD基本读写子程序
//
//=====================================================================================
/***************************************************************************************
创建日期:2004.6.28
作者:rojam
功能:lcd显示初示化程序。
返回值:
参数:
设置液晶显示模式:
****************************************************************************************/
//P1=30H-------->有边界,单屏,8*8点阵,选择80~9F之间的字符代码,选择内部字符发生器。
//P2=87H---------------->MF=1,字符宽度为07H;
//P3=07H---------------->字符高度为07H;
//P4=1eH---------------->液晶一行能够显示的最多字符为C/R=30个;
//P5=22H---------------->LCD工作频率的时间常数TC/R=C/R+4=34;
//P6=A0H---------------->LCD的点行数为160.
//P7=1E,P8=00----------->显示屏一行所占显示缓冲区的字节数,通常取:AP=C/R+1=1DH+1=1f;
//--------------------------------------------------------------------------------------
//-----SCRTAB----
//P1=00,P2=00,P3=A0----->第1显示区的首地址SAD1=0000H,及其占有显示屏上的点行数SL1=160;
//P4=00,P5=20,P6=A0----->第2显示区的首地址SAD2=2000H及其占有显示屏上的点行数SL2=160。
//P7=00,P8=40----------->第3显示区的首地址SAD3=4000H
//P8=00,P10=60---------->第4显示区的首地址SAD2=6000H
//-------------------240160的SYSTEM SET 参数-----------------------------------------
static uchar rom SYSTAB[8]={0x30,0x87,0x07,0x1E,0x22,0xA0,0x1f,0x00 };
static uchar rom SCRTAB[10]={0x00,0x00,0xA0,0x00,0x20,0xA0,0x00,0x40,0x00,0x60};
void lcdinit(void)
{
uchar i;
//-------------------------------------------
for(i=0;i<248;i++) //清除缓存
{
buffer1.ichar[i]=0;
buffer2.ichar[i]=0;
}
YJVDDCON_DDR=output;
YJVDDCON_OUT=0;
YJREST_DDR=output;
YJREST_OUT=0;
delayms(1);
YJREST_DDR=output;
YJREST_OUT=1;
//-------------------------------------------reset lcd
lcdwritecom(0x40);
for(i=0;i<8;i++) lcdwritedata(SYSTAB[i]);
lcdwritecom(0x44);
for(i=0;i<10;i++) lcdwritedata(SCRTAB[i]);
//---------------------------------------------
lcdwritecom(0x5A); //HDOT SCR代码
lcdwritedata(0x00); //设置参数片p1
//---------------------------------------------
lcdwritecom(0x5D); //CSRFORM
lcdwritedata(0x07); //设置参数片p1
lcdwritedata(0x83); //设置参数片p2
//---------------------------------------------
lcdwritecom(0x5B); //OLLAY代码
lcdwritedata(0x0C); //二重合成,设置一,三区为图型方式,合成显示方式为:或.
//---------------------------------------------
clearlcd(); //调清屏子程序
//---------------------------------------------
lcdwritecom(0x59); //显示开,
lcdwritedata(0x56); //设置:1~4区开显示,光标关。54h=01010100
lcdwritecom(0x4c); //光标移动方向,向d移动,地址加一。
//---------------------------------------------------------------------
return;
}
/*=========================================================================================*
函数:void clearscren(void)
功能:清除屏幕
参数:
返回值6
-------------------------------------------------------------------------------------------
更新日期:2003.05.15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -