📄 8.3-2.c
字号:
if(fnSTA01() == 0)
return 1;
LCMDW = uPar1;
if(fnSTA01() == 0)
return 2;
LCMDW = uPar2;
if(fnSTA01() == 0)
return 3;
LCMCW = uCmd;
return 0; // 返回0成功
}
/********************************************************/
//写单参数的指令
/********************************************************/
uchar fnPR11(uchar uCmd,uchar uPar1)
{
if(fnSTA01() == 0)
return 1;
LCMDW = uPar1;
if(fnSTA01() == 0)
return 2;
LCMCW = uCmd;
return 0; // 返回0成功
}
/********************************************************/
//写无参数的指令
/********************************************************/
uchar fnPR12(uchar uCmd)
{
if(fnSTA01() == 0)
return 1;
LCMCW = uCmd;
return 0; // 返回0成功
}
/********************************************************/
//写数据
/********************************************************/
uchar fnPR13(uchar uData)
{
if(fnSTA3() == 0)
return 1;
LCMDW = uData;
return 0; //返回0成功
}
/********************************************************/
//读数据
/********************************************************/
uchar fnPR2(void)
{
if(fnSTA01() == 0)return 1; //获取状态,如果状态错
return LCMDW; //返回数据
}
/********************************************************/
//设置当前地址
/********************************************************/
void fnSetPos(uchar urow, uchar ucol)
{
uint iPos;
iPos = urow * 30 + ucol;
fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
}
/********************************************************/
//设置当前显示行、列
/********************************************************/
void cursor(uchar uRow, uchar uCol)
{
fnSetPos(uRow * 16, uCol);
}
/********************************************************/
//清屏
/********************************************************/
void cls(void)
{
uint i;
fnPR1(LC_ADD_POS,0x00,0x00); //置地址指针为从零开始
fnPR12(LC_AUT_WR); //自动写
for(i=0;i<240*128/8;i++) //清一屏
{
fnSTA3();
fnPR13(0x0); //写数据,实际使用时请将0x55改成0x0
}
fnPR12(LC_AUT_OVR); //自动写结束
fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
gCurRow = 0; // 置地址指针存储变量
gCurCol = 0;
}
/********************************************************/
//LCM 初始化
/********************************************************/
char fnLCMInit(void)
{
if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
return (0xff);
fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
fnPR12(LC_CUR_SHP | 0x01); // 光标形状
fnPR12(LC_MOD_OR); // 显示方式设置
fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
return 0;
}
/********************************************************/
// ASCII(8*16) 及 汉字(16*16) 显示函数
/********************************************************/
uchar dprintf(uchar x,uchar y, char *ptr)
{
char c1,c2,cData;
uchar i,j,uLen,uRow,uCol;
uint k;
uLen=0;
i=0;
uRow = y;
uCol = x;
fnSetPos(uRow*16,uCol); //起点定位
while (ptr[uLen]!=0){uLen++;}; //探测字串长度
while(i<uLen)
{
c1 = ptr[i];
c2 = ptr[i+1];
//ascii字符与汉字内码的区别在于
//128做分界,大于界线的为汉字码
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 <=128) // ASCII
{
for(j=0;j<16;j++) //写16行
{
fnPR12(LC_AUT_WR); //写数据(命令)
if (c1 >= 0x20)
{
if( j < (16-ASC_CHR_HEIGHT) )
fnPR13(0x00); //写数据0输出空
else
fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
}
else
fnPR13(cData);
fnPR12(LC_AUT_OVR); //写数据结束
fnSetPos(uRow+j+1,uCol);
}
if(c1 != BS) //非退格
uCol++; //列数加1
}
else //中文
{
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) //查找定位
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
{
fnSetPos(uRow+k,uCol);
fnPR12(LC_AUT_WR); //写数据
if(j < sizeof(GB_16)/sizeof(GB_16[0]))
{
fnPR13(GB_16[j].Msk[k*2]);
fnPR13(GB_16[j].Msk[k*2+1]);
}
else //未找到该字
{
if(k < sizeof(GB_16[0].Msk)/4)
{
fnPR13(0x00);
fnPR13(0x00);
}
else
{
fnPR13(0xff);
fnPR13(0xff);
}
}
fnPR12(LC_AUT_OVR);
}
uCol += 2;
i++;
};
if(uCol >= 30) //光标后移
{
uRow += 16;
if(uRow < 0x80)
uCol -= 30;
else
{
uRow = 0;
uCol = 0;
}
}
fnSetPos(uRow,uCol);
i++;
}
return uLen; //返回字串长度,汉字按2字节计算
}
/*==============================*/
//延时
/*==============================*/
void shortdelay(uint tt)
{
uchar i;
while (tt)
{
i=100;
while (i)i--;
tt--;
};
}
/****************************************/
//画点
/****************************************/
void point(uchar x,uchar y,uchar s)
{
uchar x1;
x1=x>>3; //取Y方向分页地址
fnSetPos(y,x1); //起点定位
x1 = turnf[ x & 0x07 ];
x1=0xF0|x1|s; //字节内位置计算
fnPR12(x1); //画上屏幕,S显示属性8画点0擦除点
}
/************************************************/
//画线。任意方向的斜线,直线数学方程
//aX+bY=1
/************************************************/
void Linexy(uchar x0,uchar y0,uchar xt,uchar yt,uchar s)
{
register uchar t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x = xt-x0; //计算坐标增量
delta_y = yt-y0;
uRow = x0;
uCol = 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(uRow,uCol,s); //画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
uRow+=incx;
}
if( yerr > distance )
{
yerr-=distance;
uCol+=incy;
}
}
}
/************************************************/
//画圆。数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2
/************************************************/
void circle(uchar Ox,uchar Oy,uchar Rx,uchar s)
{
unsigned int xx,rr,xt,yt,rs,row,col;
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--;
row=Ox+xt; //第一象限
col=Oy-yt;
point(row,col,s);
row=Ox-xt; //第二象限
point(row,col,s);
col=Oy+yt; //第三象限
point(row,col,s);
row=Ox+xt; //第四象限
point(row,col,s);
//45度镜象画另一半
row=Ox+yt; //第一象限
col=Oy-xt;
point(row,col,s);
row=Ox-yt; //第二象限
point(row,col,s);
col=Oy+xt; //第三象限
point(row,col,s);
row=Ox+yt; //第四象限
point(row,col,s);
}
}
void main(void) //测试用
{
uchar i;
shortdelay(1200);
MCUCR |=BIT(SRE)|BIT(SRW);
fnLCMInit();
cls();
cursor(0,0);
dprintf(3,3,"This is a test: 中文测试");
dprintf(0,6,"LCM Exsample use 90S8515&6963");
dprintf(15,7,"~Xiaoqi~");
Linexy(10,20,239,110,8); // 画斜线1
Linexy(10,20,217,1,8); // 斜线2
Linexy(239,110,217,1,8); // 斜线3
circle(185,45,40,8); // 画圆
circle(185,45,41,8); // 画同心圆加粗
shortdelay(24000);
while(1)
{
//变化圆演示,直径不断的变化,由大到小再由小到
//大来回缩放
for (i=40;i>5;i--)
{
circle(185,45,i+1,0); //擦除外圆
circle(185,45,i,8);
circle(185,45,i-1,8);
shortdelay(3600);
};
shortdelay(8000);
for (i=5;i<40;i++)
{
circle(185,45,i-1,0); //擦除内圆
circle(185,45,i,8);
circle(185,45,i+1,8);
shortdelay(1800);
};
shortdelay(4000);
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -