📄 sed1335.c.bak
字号:
----------------------------------------------------------------------------*/
void Locatexy(Uchar x,Uchar y, Uchar attribs) {
Uint temp;
temp = (Uint)y*paraP9+x;
if(attribs)temp += BasePart2*256; // 如果需要就指向第二区,加上第二区首地址
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( (Uchar)(temp & 0xff) ); // 写入参数CSRL设置参数光标指针低8位
WriteData( (Uchar)(temp /256 ) ); // 写入参数CSRH设置参数光标指针高8位
}
/********************************************/
/*画线。任意方向的斜线,直线数学方程 aX+bY=1 */
/********************************************/
// 参数类型有待修改
void Linexy(Uint x0,Uchar y0,Uint xt,Uchar yt,Uchar att)
{
int t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy;
Uint row,col;
delta_x = xt-x0; //计算坐标增量
delta_y = yt-y0;
col = x0;
row = y0;
if(delta_x>0) incx=1; //设置单步方向
else
{
if( delta_x==0 ) incx=0; //垂直线
else {incx=-1;delta_x=-delta_x;}
}
if(delta_y>0) incy=1;
else
{
if( delta_y==0 ) incy=0; //水平线
else {incy=-1;delta_y=-delta_y;}
}
if( delta_x > delta_y ) distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for( t=0;t <= distance+1; t++ )
{ //画线输出
Point((Uint)col,row,att); //画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
col+=incx;
}
if( yerr > distance )
{
yerr-=distance;
row+=incy;
}
}
}
/*====================================================
; 绘点子程序,携入参数X坐标的最高位决定写或擦点
====================================================*/
void Point(Uint Px, Uchar Py, Uchar attr ) {
Uint tempPtr;
Uchar tempD,tempP;
tempPtr = (Uint)Py * paraP9 + (Px & 0x7fff)/8; // 去除最高位(显示属性)
WriteCommand( CsrDirD ); // CSRDIR 代码(光标自动下移)
WriteCommand( CsrW ); // 设置光标地址
WriteData( (Uchar)(tempPtr & 0xff) );
WriteData( (Uchar)(tempPtr /256) );
WriteCommand( mRead ); // 读显示ram指令
tempD = ReadDataLcm(); // 读取当前显示数据
tempP = 1<<(Uchar)(7-Px & 0x0007);
// 根据预定属性决定写点或擦除
if( attr )tempD |= tempP; // 画点
else tempD &= ~tempP; // 消点
WriteCommand( CsrW ); // 重新设置光标地址
WriteData( (Uchar)(tempPtr & 0xff) );
WriteData( (Uchar)(tempPtr /256) );
WriteCommand( mWrite ); // 代码0x42,数据写入指令
WriteData( tempD ); // 写入合成数据
}
/************************************************/
/*画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/************************************************/
void circle(Uint Ox,Uchar Oy,Uchar Rx,Uchar attr)
{
Uint xx,rr,xt,yt,rs,col,row;
yt=Rx;
rr=Rx*Rx+1; //补偿 1 修正方形
rs=(yt+(yt>>1))>>1; //(*0.75)分开1/8圆弧来画
for (xt=0;xt<=rs;xt++)
{
xx=xt*xt;
while ((yt*yt)>(rr-xx))yt--;
col=Ox+xt; //第一象限
row=Oy-yt;
Point(col,row,attr);
col=Ox-xt; //第二象限
Point(col,row,attr);
row=Oy+yt; //第三象限
Point(col,row,attr);
col=Ox+xt; //第四象限
Point(col,row,attr);
/***************45度镜象画另一半***************/
col=Ox+yt; //第一象限
row=Oy-xt;
Point(col,row,attr);
col=Ox-yt; //第二象限
Point(col,row,attr);
row=Oy+xt; //第三象限
Point(col,row,attr);
col=Ox+yt; //第四象限
Point(col,row,attr);
}
}
/**********************************************
ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数
x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
*ptr...字符串指针,本函数所指的是flash字串
att....显示区标志,0...第一区;1...第二区
返回参数:输出字串长度,留意汉字一个算两个
其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
***********************************************/
void Putstr(Uchar x,Uchar y,Uchar *pstr,Uchar flag)
{
Uchar j,m,temp;
Uchar uRow,uCol;
Uint count;
uRow=x;
uCol=y;
WriteCommand( CsrDirD );
Locatexy(uRow,uCol,flag);
while(*pstr)
{
if(*pstr>0xa0)//汉字
{
count=0;
while((HZ16_16[count]!=*pstr)||(HZ16_16[count+1]!=*(pstr+1)))
{ //根据区码位码查找汉字库
count=count+0x22;
if(HZ16_16[count]==0)
{ //没有找到退出
count=0xffff;
break;
}
}
pstr+=2;
count+=2;
for(m=0;m<2;m++)
{
Locatexy(uRow+m,uCol,flag);
WriteCommand( mWrite ); // 写数据(命令)
for(temp=0;temp<16;temp++)
{WriteData(HZ16_16[2*temp+count+m]);}
}
uRow+=2;
}//ASC码
else
{
Locatexy(uRow,uCol,flag);
WriteCommand( mWrite ); // 写数据(命令)
for(j=0;j<16;j++)
{
WriteData(ASC_MSK[(*pstr-0x20)*16 +j ]);
}
pstr++;
uRow++;
}//光标控制
if(uRow >= 40) // 光标后移
{
uCol += 16; // Y坐标
uRow = 0; // X坐标
if( uCol >= 240 ) uCol = 0;
}
Locatexy(uRow,uCol,flag);
}
}
void PutLogo(Uchar x,Uchar y,Uchar flag)
{
Uchar j,m,temp;
Uchar uRow,uCol;
Uint count;
uRow=x;
uCol=y;
WriteCommand( CsrDirD );
Locatexy(uRow,uCol,flag);
// while(*pstr)
{
// if(*pstr>0xa0)//汉字
{
count=0;
/* while((HZ32_32[count]!=*pstr)||(HZ32_32[count+1]!=*(pstr+1)))
{ //根据区码位码查找汉字库
count=count+0x82;
if(HZ32_32[count]==0)
{ //没有找到退出
count=0xffff;
break;
}
}
pstr+=2;
count+=2;*/
for(m=0;m<4;m++)
{
Locatexy(uRow+m,uCol,flag);
WriteCommand( mWrite ); // 写数据(命令)
for(temp=0;temp<32;temp++)
{WriteData(Logo[4*temp+count+m]);}
}
// uRow+=4;
}//ASC码
/* else
{
Locatexy(uRow,uCol,flag);
WriteCommand( mWrite ); // 写数据(命令)
for(j=0;j<16;j++)
{
WriteData(ASC_MSK[(*pstr-0x20)*16 +j ]);
}
pstr++;
uRow++;
}//光标控制
if(uRow >= 40) // 光标后移
{
uCol += 32; // Y坐标
uRow = 0; // X坐标
if( uCol >= 240 ) uCol = 0;
}
Locatexy(uRow,uCol,flag); */
}
}
void PutHz_32(Uchar x,Uchar y,Uchar *pstr,Uchar flag)
{
Uchar j,m,temp;
Uchar uRow,uCol;
Uint count;
uRow=x;
uCol=y;
WriteCommand( CsrDirD );
Locatexy(uRow,uCol,flag);
while(*pstr)
{
if(*pstr>0xa0)//汉字
{
count=0;
while((HZ32_32[count]!=*pstr)||(HZ32_32[count+1]!=*(pstr+1)))
{ //根据区码位码查找汉字库
count=count+0x82;
if(HZ32_32[count]==0)
{ //没有找到退出
count=0xffff;
break;
}
}
pstr+=2;
count+=2;
for(m=0;m<4;m++)
{
Locatexy(uRow+m,uCol,flag);
WriteCommand( mWrite ); // 写数据(命令)
for(temp=0;temp<32;temp++)
{WriteData(HZ32_32[4*temp+count+m]);}
}
uRow+=4;
}//ASC码
else
{
Locatexy(uRow,uCol,flag);
WriteCommand( mWrite ); // 写数据(命令)
for(j=0;j<16;j++)
{
WriteData(ASC_MSK[(*pstr-0x20)*16 +j ]);
}
pstr++;
uRow++;
}//光标控制
if(uRow >= 40) // 光标后移
{
uCol += 32; // Y坐标
uRow = 0; // X坐标
if( uCol >= 240 ) uCol = 0;
}
Locatexy(uRow,uCol,flag);
}
}
/******************************************
整数输出到字符串函数
入口: 位数:wei; 字符串:*str 变量:ivar
*******************************************/
void send_int(Uchar wei,Uchar *str,Uint shu)
{
data Uchar i,num;
Uint intbuf; // 整型数缓冲
intbuf = (Uint)shu;// 变整形
str[wei] = 0; // 字符串结束
num = wei;
for(i=0;i<wei;i++){
num --;
str[num] = intbuf % 10 + 0x30;// 送一个字符
intbuf = intbuf / 10; // 上一位
}// for
}
/**********************************************************
函数功能:输出整数
x:字节位置,y:点位置
attribte:0:一区显示;1:二区显示
**********************************************************/
void put_uint(Uchar x,Uchar y,Uchar wei,Uint shu,Uchar attribte)
{
Uchar cbuf[20]; // 字符串缓冲区
send_int(wei,cbuf,shu);
Putstr( x, y, cbuf,attribte);; // 送显示
}
/************************************************
显示浮点数函数
入口:format +62 显示6位数,2位小数,显示+/-号
fbuf 浮点数
x:字节位置,y:点位置
attribte:0:一区显示;1:二区显示
*P:指向显示位数
*************************************************/
/*void Putf(Uchar x,Uchar y,Uchar *p,float fbuf,Uchar attribte)
{
Uchar cbuf[16]; // 字符串缓冲区
SPutf(p,cbuf,fbuf);
Putstr( x, y, cbuf,attribte); // 送显示
} */
/*********************************************
浮点数输出到字符串
入口: 说明 *format, 字符串:*str 变量:fvar
***********************************************/
void SPutf(Uchar *format,Uchar *str,float fvar)
{
data Uchar a,b,i,num=0;
data unsigned long longbuf; // 整型数缓冲
if (*format =='+'){
if (fvar<0){
fvar = -fvar; // 负变量转换绝对值
str[num]='-'; // 加负号
}
else{
str[num]='+'; // 加正号
}
num ++;
format ++;
}//
a = *format - 0x30; // 取总长度a
format ++;
b = *format - 0x30; // 取小数点位数b
for (i=0;i<b;i++){
fvar = fvar * 10; // 消除小数
}//
fvar = fvar + 0.5; // 四舌五入
num = num + a;
if (b>0){
num ++; // 有小数点
}//
longbuf = (unsigned long)fvar;// 变整形
str[num] = 0; // 字符串结束
for(i=1;i<=a;i++){
num --;
str[num] = longbuf % 10 + 0x30; // 送一个字符
longbuf = longbuf / 10; // 上一位
if (i==b){
num --;
str[num] = '.'; // 加小数点
}
}//for
}
/*************************************************
函数说明:中断函数
**************************************************/
void timer0(void) interrupt 1
{
TH0=0x4c;
TL0=0x00;
click++;
if(click>=20)
{click=0;
secflag=1;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -