📄 demo.c
字号:
j++;
LCD_CMD_ADR=0x46; // CSRW 代码
LCD_DAT_ADR=(uchar)j; // 设置光标地址
LCD_DAT_ADR=(uchar)(j>>8);
LCD_CMD_ADR=0x42; // MWRITE代码
LCD_DAT_ADR=0x82; // 写入汉字代码右上部
LCD_DAT_ADR=0x83; // 写入汉字代码右下部
}
// 写汉字函数(图形方式)
// 输入坐标都是以 8 点阵为增量单位
// O_X: 0~38
// O_Y: 0~28
// num: 要写入字符对应的 CGTAB[num][count1] 的num 值
void CCW2_PR(uchar O_X,uchar O_Y,uint num)
{
uchar idata count1;
uint idata i,j;
j=PARA*8*O_Y+O_X;
j=j+SAD2; // added by gao.
LCD_CMD_ADR=0x4f; // CSRDIR 代码(下移)
for(i=0;i<2;i++)
{
LCD_CMD_ADR=0x46; // CSRW 代码
LCD_DAT_ADR=(uchar)j; // 设置光标地址CSR
LCD_DAT_ADR=(uchar)(j>>8);
LCD_CMD_ADR=0x42; // MWRITE 代码
for(count1=i*16;count1<16*(i+1);count1++)
LCD_DAT_ADR=CGTAB[num][count1]; // 写入数据
j=j+1;
}
}
// 函数功能:在指定坐标位置写入ASCII码字符,
// O_X: 0~39
// O_Y: 0~29
void w_ASCII(uchar O_X,uchar O_Y,uchar num)
{
uint idata j;
j=PARA*O_Y+O_X;
LCD_CMD_ADR=0x46; // CSRW 代码
LCD_DAT_ADR=(uchar)j; // 设置光标地址CSR
LCD_DAT_ADR=(uchar)(j>>8);
LCD_CMD_ADR=0x4c; // CSRDIR 代码
LCD_CMD_ADR=0x42; // MWRITE 代码
LCD_DAT_ADR=num; // 写入数据
}
// 从指定起始点写入字符串(ASCII码)
// O_X: 0~39
// O_Y: 0~29
void w_string(uchar O_X,uchar O_Y,const uchar *STRING)
{
while(*STRING)
{
w_ASCII(O_X,O_Y,*STRING);
STRING++;
O_X++;
if(O_X>319)
{
O_X=0;
O_Y+=1;
}
}
}
// 功能:绘点函数
// 输入范围:O_X:0~319; O_Y:0~239;
// 说明:坐标定位 左上角为原点(0,0),水平向右为X轴正方向,垂直向下为Y轴正方向
void draw_dot(int O_X,uchar O_Y)
{
uchar idata i,j,dat;
uint idata k;
i=((uchar)O_X)&0x07; // i 为O_X 除以 8 的余数
O_X=O_X>>3; // O_X 为O_X 除以 8 的整数
k=PARA*O_Y+O_X+SAD2;
LCD_CMD_ADR=0x46; // 设置光标地址
LCD_DAT_ADR=(uchar)k; // 计算光标地址
LCD_DAT_ADR=(uchar)(k>>8);
j=0x80; // 确定要画的点对应的字节数据的值
if(i!=0)
j=j>>i;
LCD_CMD_ADR=0x43; // MREAD 代码
dat=LCD_CMD_ADR; // 读取当前显示数据
LCD_CMD_ADR=0x46; // 设置光标地址
LCD_DAT_ADR=(uchar)k; // 计算光标地址
LCD_DAT_ADR=(uchar)(k>>8);
LCD_CMD_ADR=0x42; // MWRITE 代码
LCD_DAT_ADR=dat|j; // 写入合成数据
}
// 函数功能: 画水平线
// 纵坐标: 固定为 y
// x1: 起始横坐标; x2: 终点横坐标
void draw_horizontal(int x1,int x2,uchar y)
{
uint idata i;
for(i=x1;i<=x2;i++)
draw_dot(i,y);
}
// 函数功能: 画垂直线
// 横坐标: 固定为 x
// y1: 起始纵坐标; y2: 终点纵坐标
void draw_vertical(uchar y1,uchar y2,int x)
{
uchar idata i;
for(i=y1;i<=y2;i++)
draw_dot(x,i);
}
// 函数功能:画任意斜率的直线
// 起点坐标: x1:(0~319),y1:(0~239)
// 终点坐标: x2:(0~319),y2:(0~239)
void draw_bias(int x1,uchar y1,int x2,uchar y2)
{
uint idata i;
int idata err=0;
int idata delta_x,delta_y;
if(y2<y1) // 此步骤使起点纵坐标小于等于终点纵坐标
{ err=x1;
x1=x2;
x2=err;
i=y1;
y1=y2;
y2=(uchar)i;
}
delta_x=x2-x1;
delta_y=(int)(y2-y1);
if(delta_x>=0)
{ if(delta_y<=delta_x) // 斜率 K:0~1
{ for(i=x1;i<x2;i++)
{ draw_dot(x1,y1);
x1++;
if(err<0)
err+=delta_y;
else
{ y1++;
err=err+delta_y-delta_x;
}
}
}
else // 斜率 K>1
{ for(i=y1;i<y2;i++)
{ draw_dot(x1,y1);
y1++;
if(err<0)
{ x1++;
err=err+delta_y-delta_x;
}
else
err-=delta_x;
}
}
}
else if(delta_x<0)
{ delta_x=0-delta_x;
if(delta_y<=delta_x) // 斜率 K: -1~0
{ for(i=x1;i>x2;i--)
{ draw_dot(x1,y1);
x1--;
if(err<0)
err+=delta_y;
else
{ y1++;
err=err+delta_y-delta_x;
}
}
}
else // 斜率 K < -1
{ for(i=y1;i<y2;i++)
{ draw_dot(x1,y1);
y1++;
if(err<0)
{ x1--;
err=err+delta_y-delta_x;
}
else
err-=delta_x;
}
}
}
}
/*void draw_line(int startx,uchar starty,int endx,uchar endy)
{
register char t,distance;
int xerr=0,yerr=0,delta_x,
char delta_y;
char incx,incy;
// compute the distance in both directions
delta_x=endx-startx;
delta_y=endy-starty;
// compute the direction of the increment ,
// an increment of "0" means either a vertical or horizontal lines
if(delta_x>0)
incx=1;
else if( delta_x==0 )
incx=0;
else incx=-1;
if(delta_y>0)
incy=1;
else if( delta_y==0 )
incy=0;
else incy=-1;
// determine which distance is greater
delta_x = cabs( delta_x ); // 取绝对值
delta_y = cabs( delta_y );
if( delta_x > delta_y )
distance=delta_x;
else distance=delta_y;
//draw the line
for( t=0;t <= distance+1; t++ )
{
draw_dot(startx,starty);
xerr += delta_x;
yerr += delta_y;
if( xerr > distance )
{
xerr-=distance;
startx+=incx;
}
if( yerr > distance )
{
yerr-=distance;
starty+=incy;
}
}
}
*/
// 函数功能:画圆
// 圆心坐标: x0,y0
// 半径: radius
// 说明:为了不使画圆速度太慢,没有对坐标位置是否超出屏幕范围做判断
// 所以在调用时,应该保证圆周上点的坐标不会超出显示屏幕,否则可能得到错误的显示
void draw_circle(int x0,uchar y0,uchar radius)
{
long idata delta1,delta2;
int idata x1,x2,tempx;
uchar idata y1,y2,tempy;
x1=0;
y1=radius;
x2=(int)radius;
y2=0;
draw_dot(x1+x0,y1+y0);
draw_dot(x2+x0,y2+y0);
draw_dot(x1+x0,y0-y1);
draw_dot(x0-x2,y2+y0);
while(1)
{
delta1=(x1+1)*(x1+1)+(y1+radius)*(y1-radius)-y1;
x1++;
if(delta1>0)
y1--;
draw_dot(x1+x0,y1+y0); // 画第 1 象限 45°~90° 圆弧
tempx=x0-x1;
tempy=y0-y1;
draw_dot(tempx,y1+y0); // 镜像画第 2 象限 90°~135° 圆弧
draw_dot(tempx,tempy); // 镜像画第 3 象限 225°~270° 圆弧
draw_dot(x1+x0,tempy); // 镜像画第 4 象限 270°~315° 圆弧
if(y1==y2)
break;
delta2=(y2+1)*(y2+1)+(x2+radius)*(x2-radius)-x2;
y2++;
if(delta2>0)
x2--;
draw_dot(x2+x0,y2+y0); // 画第 1 象限 0°~45° 圆弧
tempx=x0-x2;
tempy=y0-y2;
draw_dot(tempx,y2+y0); // 镜像画第 2 象限 135°~180° 圆弧
draw_dot(tempx,tempy); // 镜像画第 3 象限 180°~225° 圆弧
draw_dot(x2+x0,tempy); // 镜像画第 4 象限 315°~360° 圆弧
if(y1==y2)
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -