?? 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 + -