📄 abc.c
字号:
y1=y;
y=y-e*i;
x=x-(a1*i/b1)*d;
point(x,y);
x=x1;
y=y1;
}
};
}
void clean ()//清全屏函数
{
uchar i,j;
//set_adr(0,0);
for (j=0;j<8;j++)
{
set_adr(j,0);
for(i=0;i<64;i++)
{
cs1=1; //两个屏幕同时执行//速度会快很多
cs2=1;
di=1;
rw=0;
P2=0xff;
e=0;
delay(5);
e=1;
// delay(5); //没必要加这个延时
e=0;
}
}
}
void cls(uchar a,uchar b,uchar c,uchar d)//对指定的范围进行清屏//肯定还有简洁的方法//这里写太匆忙了
{
uchar i,j;
bit e=0;
bit f=0;
uchar d1;
if(b<63){e=1;}; //如果a,b在左半屏的话e=1;
if((d<127)&&(d>63)){f=1;}; //如果c,d,在右半屏的话f=1;
d1=d;
while(e)////////////////////写左半屏
{
if (d>63){d=63;}
for (i=a;i<=c;i++)
{
set_adr(i,b);
for (j=b;j<=d;j++)
{
wdata(0xff,1,0);
}
}
e=0;
}
while(f)////////////////////写右半屏
{
if (d1>63){d1=d1-64;};
if (b<64){b=0;};
if (b>63){b=b-64;};
for (i=a;i<=c;i++)
{
set_adr(i,b);
for (j=b;j<=d1;j++)
{
wdata(0xff,0,1);
}
}
f=0;
}
}
//画一个指定位置的图,xy为起点坐标q为横向宽度,s为纵向长度
//应该可以加上不同的数据组以显示不同的图画
void found(uchar x,uchar y,uchar q,uchar s)
{
uint k=0;
uchar y1,i,j;
bit e=1;
bit f=0;
y1=y;
for (i=0;i<q;i++)
{
set_adr(x+i,y);
for (j=0;j<s;j++)
{
if (y1>63){set_adr((x+i),0);y1=y1-64;e=0;f=1;}
wdata(a[k],e,f);
y1++;
k++;
}
e=1;f=0;y1=y;
}
}
//写一个指定位置的图//反色 其他同上
void found1(uchar x,uchar y,uchar q,uchar s)
{
uint k=0;
uchar y1,i,j;
bit e=1;
bit f=0;
y1=y;
for (i=0;i<q;i++)
{
set_adr(x+i,y);
for (j=0;j<s;j++)
{
if (y1>63){set_adr((x+i),0);y1=y1-64;e=0;f=1;}
wdata(~a[k],e,f);
y1++;
k++;
}
e=1;f=0;y1=y;
}
}
void found2(uint s,bit t)//写英语字母ascii码//t=0;左半屏//反色
{
uchar i;
bit e=1;
bit f=0;
if (t==1){e=0;f=1;}
for (i=0;i<5;i++)
{
wdata(~asc[s++],e,f);//要置反写上去。因为在屏幕上1是白色,0是蓝色,而初始化后是全部为1的;
};
}
void zhimu(uchar a,uchar d,uchar c)//把 b[] 中的数按行写//可以加入指针使得函数更加通用
//0 4 174
//a为起始行,d为起始列//c为写入数组长度
{
uchar i;
bit e=0;
for (i=0;i<=c;i++)
{
if (b[i]=='/'&&b[i+1]=='0')//遇到 /0 就换行,且跳过/0;
{
a++;
if (a==8){clean();a=0;}//说明长度已经超过8行//清屏并且换行
set_adr(a,4);
///////////////////////////产生动画的效果,m没有用循环,便于修改///////////可以去掉
found2(75,0);
delay2(10);
set_adr(a,4);
found2(65,0);
delay2(10);
set_adr(a,4);
found2(300,0);
delay2(10);
set_adr(a,4);
found2(205,0);
delay2(10);
set_adr(a,4);
found2(75,0);
delay2(10);
set_adr(a,4);
found2(65,0);
delay2(10);
set_adr(a,4);
found2(300,0);
delay2(10);
set_adr(a,4);
found2(205,0);
delay2(10);
set_adr(a,4);
////////////////////////////////////////////////////
d=4;i++;i++;e=0;
};
if (d>123)//当d>123时,//说明已经写不下一个字母了//要换行。
{
a++;
if (a==8){clean();a=0;}//a=8;说明已经写不下了清屏并且换行,换到首行地址
//设定行开始地址
//前面空4个,因为64列能写12个,还剩4个,在首行空出来防止中间左右屏连接处出现空白间隔
set_adr(a,4);d=4;e=0;};
if (d<64){set_adr(a,d);e=0;};//进行换行操作小于64的话在左屏,63-123的话,在右屏。
if (d>63&&d<124){set_adr(a,d-64);e=1;};
//d=d+5;
found2((b[i]-32)*5,e);//b[i]-32是为了把ascii码转换成本地码 *5是为了寻址,因为每个字母用5个uchar;
d=d+6;//内部自定义地址自动加5,然后再加一个空格,其实可以精简成d+=5;呵呵,其实没关系的,因为keil优化后一样看待
}
}
void windows(uchar x,uchar y,uchar x1,uchar y1,uchar g,uchar h,uchar m,uchar n)
//指定位置xy起点,x1y1终点 ,gh,mn分别是清除的起始坐标和终止坐标,
//有点复杂,注意各个值的取值范围不一样;
{
uchar i;
uchar a;
uchar b;///////把此函数中的所有数字用char可能会提高一些速度。///////
uchar c;//中间值
uint a1;
uint b1;
char d=1;//标志位,1表示x大,-1表示x1大
char e=1;//标志位,1表示y大,-1表示y1大
bit f=0;//标志位,0表示a大,1表示b大
if (x1>x){a=(x1-x);d=-1;}
else a=(x-x1);
if (y1>y){b=(y1-y);e=-1;}
else b=(y-y1);
a1=a;b1=b;
if (b>a) {c=b;b=a;b=c;f=1;}
if(f==0){
for (i=0;i<=a;i++)
{
x1=x;
y1=y;
x=x-d*i;
y=y-(b1*i/a1)*e;
line(x,y,x,y1); //1
line(x,y1,x1,y1); //2
line(x,y,x1,y); //3
line(x1,y,x1,y1); //4
x=x1;
y=y1;
i++;//为了提高速度//不得不4格跳一次,描一次线//所以注意窗口的长宽像素值与当前相符
i++;
i++;
i++;
}
};
if(f==1){
for (i=0;i<=b;i++)
{
x1=x;
y1=y;
y=y-e*i;
x=x-(a1*i/b1)*d;
line(x,y,x,y1); //1
line(x,y1,x1,y1); //2
line(x,y,x1,y); //3
line(x1,y,x1,y1); //4
x=x1;
y=y1;
cls(g,h,m,n);
i++;
i++;
i++;
i++;
}
};
}
void main()
{
//reset();//重启
dison_off(0);//关闭
dison_off(1);//开启
while(1)
{
set_startline(0);//设起始行
set_adr(0,0);//设地址
while(1)
{
//
//windows(12,13,45,34);
//clean();
//windows(2,53,55,14);
clean();
zhimu(0,4,174);
//delay2(20);
//clean();
//windows(7,17,49,113,1,18,5,111);
//found1(1,18,5,92);
//clean();
//set_adr(0,0);
//windows(15,35,48,120,2,36,5,119);
//while(1);
}
while(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -