📄 main.c
字号:
x1++;
}
}
}
/*********************************************************
*函数名称:画线子程序
*函数功能:
*入口参数:(x1,y1),(x2,y2):直线起始和终止位置坐标,以像素点为单位
*出口参数:
*备 注:方程:y=kx+b
**********************************************************/
void Draw_Line(uint32 x1,uint32 y1,uint32 x2,uint32 y2)
{
uint8 temp;
int dalt_x,dalt_y,err=0;
if (y1>y2) //要求Y1<Y2,如果不符合要求,则两坐标置换
{
temp=x1;
x1=x2;
x2=temp;
temp=y1;
y1=y2;
y2=temp;
}
Draw_Dot(x1,y1); // 画起始点
dalt_x=x2-x1; //ΔX=X2-X1
dalt_y=y2-y1; //ΔY=Y2-Y1
if(dalt_x>=0)
{
if(dalt_y>dalt_x) //k=ΔY/ΔX >1时
{
while(y1<y2)
{
if(err<0)
{
x1=x1+1;
y1=y1+1;
err=err+dalt_y-dalt_x;
}
else
{
y1=y1+1;
err=err-dalt_x;
}
Draw_Dot(x1,y1); // 画点
}
}
else //0<k=ΔY/ΔX=<1
{
if (dalt_y==0)
y1=y1-1;
while(x1<x2)
{
if(err<0)
{
x1=x1+1;
err=err+dalt_y;
}
else
{
y1=y1+1;
x1=x1+1;
err=err+dalt_y-dalt_x;
}
Draw_Dot(x1,y1); //画点
}
}
}
else
{
dalt_x=x1-x2;
if(dalt_y>dalt_x) //k=ΔY/ΔX<-1
{
while(y1<y2)
{
if(err<0)
{
x1=x1-1;
y1=y1+1;
err=err+dalt_y-dalt_x;
}
else
{
y1=y1+1;
err=err-dalt_x;
}
Draw_Dot(x1,y1); //画点
}
}
else //0>k=ΔY/ΔX>=-1
{
if (dalt_y==0)
y1=y1-1;
while(x1>x2)
{
if(err<0)
{
x1=x1-1;
err=err+dalt_y;
}
else
{
x1=x1-1;
y1=y1+1;
err=err+dalt_y-dalt_x;
}
Draw_Dot(x1,y1);
}
}
}
}
/*********************************************************
*函数名称:画圆子程序
*函数功能:
*入口参数:坐标OX为屏幕上水平位置,以像素点为单位;
坐标OY为垂直位置,以像素行为单位
Rx为圆的半径,以像素点为单位
*出口参数:
*备 注:方程:(X-Ox)^2+(Y-Oy)^2=Rx^2
********************************************************/
void circle(uint32 Ox,uint32 Oy,uint32 Rx)
{
uint32 xx,rr,xt,yt,rs;
uint32 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;
Draw_Dot(col,row);
col=Ox-xt; //第二象限
Draw_Dot(col,row);
row=Oy+yt; //第三象限
Draw_Dot(col,row);
col=Ox+xt; //第四象限
Draw_Dot(col,row);
/***************45度镜象画另一半***************/
col=Ox+yt; //第一象限
row=Oy-xt;
Draw_Dot(col,row);
col=Ox-yt; //第二象限
Draw_Dot(col,row);
row=Oy+xt; //第三象限
Draw_Dot(col,row);
col=Ox+yt; //第四象限
Draw_Dot(col,row);
}
}
/**********************************************************
*函数名称:画正弦曲线
*函数功能:
*入口参数:
*出口参数:
*备 注:
**********************************************************/
void sin(void)
{
int x,y;
int TABLE_SIN[46]={ 0, 4, 8,12,16,
19,22,25, 27,29,
30,30, 30,29,28,
26,24,21,18,14,
10, 6, 2,-2,-6,
-10,-14, -18,-21,-24,
-26,-28,-29,-30,-30,
-30,-29,-27,-25,-22,
-19,-16,-12,-8, -4,0
} ;
for(x=0;x<184;x=x+4)
{
y=60-TABLE_SIN[x/4];
Draw_Dot(x,y);
}
}
/**********************************************************
*函数名称:画坐标和曲线图
*函数功能:
*入口参数:
*出口参数:
*备 注:
**********************************************************/
void quxian()
{
uint8 data1[]={88,89,85,87,89,90,89,89,
88,86,87,86,88,89,90,94,
95,96,96,97,99,99,101,103,
101,101,100,103,105,113,113,
117,117,116,114,107,110,114,
113,112,115,112,113,119,120,
125,124,128
};
uint8 a1,a2,b1,b2,i,num;
a1=35;b1=210;
ShowText(a1,b1,(uint8*)"time");
a1=0;b1=10;
ShowText(a1,b1,(uint8*)"temp");
a1=8;b1=10,num=11;
SdCmd(0x10,0x7f); //粗体字符显示
ShowText(a1,b1,(uint8*) "日 跟 踪 曲 线 图"); //写日跟踪曲线图
SdCmd(0x10,0x6f); //字体原形显示
linehv(15,199, 305,199);
// Draw_Line(15, 199, 305, 199); //画坐标 X coordinate
Draw_Line(15, 29, 15, 199); //画坐标 Y coordinate
/* a1=21;
for (i=0;i<48;i++)
{
Draw_Line(a1, 198, a1, 202); //画刻度 scale of X coordinate
a1=a1+6;
}
for (b1=30;b1<199;b1=b1+20)
{
Draw_Line(15, b1, 17, b1); //画刻度 scrale of Y coordinate
}
*/
a1=15;
for(i=0;i<47;i++)
{
b1=300-data1[i]*2;
b2=300-data1[i+1]*2;
a2=a1+6;
Draw_Line(a1, b1, a2, b2); // 画曲线
Draw_Dot(a1,b1+50); //画点
a1=a1+6;
}
Delay(800);
}
/**********************************************************
*函数名称:主程序
*函数功能:
*入口参数:
*出口参数:
*备 注:
**********************************************************/
int main(void)
{
PINSEL0=0x00000005; //管脚配置
PINSEL1=0x00000000;
SCS=0x03; //设置为GPIO
FIO0DIR1=0xff; //设置管脚为输出
FIO0DIR2=0xdf; //P0.21管脚置为输入
FIO0MASK1=0x00; //不屏蔽任何管脚
FIO0MASK2=0x00;
FIO0PIN1 = 0xff; //初始化所有端口
FIO0SET2=0x02; // RD=1
FIO0SET2=0x01; // _WR = 1
FIO0SET2=0x08; // RS = 1
FIO0SET2=0x04; // _CS = 1
while(1)
{
int i;
reset(); //软件复位操作
Delay(3000); //延时五十毫秒
Init(); //屏幕初始化
CleanScreen(); //清屏操作
Delay(240); //延时四毫秒
//水平卷动演示
SdCmd(0x00,0xc5);
SdCmd(0x12,0xb2);
LogoScreen();
for(i=0;i<3;i++)
Delay(48000);
/* SdCmd(0x80,0x20); //设置卷动速度
SdCmd(0x61,0x06); //设置屏幕卷动参数 水平起始字符位置
SdCmd(0x71,90); //设置屏幕卷动块起始行位置
SdCmd(0x72,180); //设置屏幕卷动块结束行位置
SdCmd(0x03,0x83); //启动水平卷动功能
Delay(1200);
SdCmd(0x071,0x00); //设置屏幕卷动参数 垂直起始行位置为0;
SdCmd(0x03,0x80); //停止卷动功能
Delay(1200);*/
CleanScreen(); //清屏操作
//画正弦线
SdCmd(0x00,0xc5);
sin();
Delay(48000);
CleanScreen();
//曲线图
SdCmd(0x00,0xc5); //绘图模式+display on
quxian();
for(i=0;i<3;i++)
Delay(48000);
CleanScreen(); //清屏操作
//画斜线图
SdCmd(0x00,0xc5);
Draw_Line(0,120,240,0);
for(i=0;i<3;i++)
Delay(48000);
CleanScreen(); //清屏操作
//画圆形图
SdCmd(0x00,0xc5);
circle(160,120,60);
Delay(48000);
CleanScreen(); //清屏操作
//画图画
/* SdCmd(0x00,0xc5); //设置写入数据为图形数据
SdCmd(0x12,0xb1); //设置写第一显示区域
SdCmd(0x40,10); //工作窗口左边界位置
SdCmd(0x20,20); //工作窗口右边界位置
SdCmd(0x50,20); //工作窗口上边界位置
SdCmd(0x30,220); //工作窗口下边界位置
SdCmd(0xe0,0xff); // 填充数据设置
SdCmd(0xf0,0xa8); // 启动填充功能
Delay(3000);
//
SdCmd(0x12,0xb2); //设置写第二显示区域
SdCmd(0x40,10); //工作窗口左边界位置
SdCmd(0x20,30); //工作窗口右边界位置
SdCmd(0x50,10); //工作窗口上边界位置
SdCmd(0x30,110); //工作窗口下边界位置
SdCmd(0xe0,0xff); // 填充数据设置
SdCmd(0xf0,0xa8); // 启动填充功能
Delay(3000);*/
linehv(80,10, 248,10);
// Draw_Line(80,10,248,10); //画四边线
Draw_Line(80,10,80,220);
linehv(80,220, 248,220);
//Draw_Line(80,220,248,220);
Draw_Line(248,10,248,220);
for(i=0;i<3;i++)
Delay(48000);
CleanScreen();
SdCmd(0x12,0xb2); // 打开图形RAM区域(第二显示区域)
ShowBMP(0,0,8,96,data2); // 写入图画块
Delay(48000);
CleanScreen();
/* SdCmd(0x01,0xf3); // 设置工作频率12MHZ
SdCmd(0xe0,0x3f); // 设置占空比参数
SdCmd(0x90,0x04); // 设置扫描频率
SdCmd(0x12,0x00); // 启动灰度显示*/
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -