|
在這里首先要感謝那些好心人,沒有他們的幫忙我是寫不出來,真的很謝謝你們。我把最近所調(diào)試成功的,都一一給大家說明,并上圖和相關(guān)資料,希望對大家用。
1、打點(diǎn)部分
該部分已在該論壇發(fā)帖,這里不就重復(fù)了
(打點(diǎn)是所有繪圖的基礎(chǔ))
2、畫線部分
先看程序
/********************************************************
* 名稱:GUI_Line()
采用布蘭森漢姆(Bresenham)算法畫線
* 功能:任意兩點(diǎn)間的直線。根據(jù)硬件特點(diǎn),實(shí)現(xiàn)加速。
* 入口參數(shù):x0 直線起點(diǎn)所在行的位置
* y0 直線起點(diǎn)所在列的位置
* x1 直線終點(diǎn)所在行的位置
‘ y1 直線終點(diǎn)所在列的位置
* 出口參數(shù): 無
* 說明:操作失敗原因是指定地址超出緩沖區(qū)范圍。
*********************************************************/
void GUI_Line8(uchar x0,uchar y0,uchar x1,uchar y1)
{
int temp;
int dx,dy; //定義起點(diǎn)到終點(diǎn)的橫、縱坐標(biāo)增加值
int s1,s2,status,i;
int Dx,Dy,sub;
dx=x1-x0;
if(dx>=0) //X的方向是增加的
s1=1;
else //X的方向是降低的
s1=-1;
dy=y1-y0; //判斷Y的方向是增加還是降到的
if(dy>=0)
s2=1;
else
s2=-1;
Dx=fabs(x1-x0); //計(jì)算橫、縱標(biāo)志增加值的絕對值
Dy=fabs(y1-y0);
if(Dy>Dx) //
{ //以45度角為分界線,靠進(jìn)Y軸是status=1,靠近X軸是status=0
temp=Dx;
Dx=Dy;
Dy=temp;
status=1;
}
else
status=0;
/********判斷垂直線和水平線********/
if(dx==0) //橫向上沒有增量,畫一條水平線
GUI_XLine(x0,y0,y1,1);
if(dy==0) //縱向上沒有增量,畫一條垂直線
GUI_YLine(x0,y0,x1,1);
/*********Bresenham算法畫任意兩點(diǎn)間的直線********/
sub=2*Dy-Dx; //第1次判斷下個點(diǎn)的位置
for(i=0;i<Dx;i++)
{
GUI_Point(x0,y0,1); //畫點(diǎn)
if(sub>=0)
{
if(status==1) //在靠近Y軸區(qū),x值加1
x0+=s1;
else //在靠近X軸區(qū),y值加1
y0+=s2;
sub-=2*Dx; //判斷下下個點(diǎn)的位置
}
if(status==1)
y0+=s2;
else
x0+=s1;
sub+=2*Dy;
}
}
下面是圖片:在(0,0)到(127,32)之間畫線
在(0,0)到(63,63)之間畫線
大家可以看到,直線越長其線性越差,主要是算法的問題

3、畫圓部分
主要思路是用Bresenham算法先畫1/8個圓,在利用對稱行畫出其余的部分
程序如下:
/*****************************************
名稱:Draw_circle (在任意位置畫圓)
說明:使用Bresenham法畫1/8個圓,在用對稱性畫出其他的7/8個圓
按下圖把圓分為8份
0
7 1
6 2
5 3
4
*****************************************/
void Draw_circle(uchar x0,uchar y0,uchar r)
{
int a,b;
int di;
a=0;
b=r;
di=3-2*r; //判斷下個點(diǎn)位置的標(biāo)志
while(a<=b)
{
GUI_Point(x0-b,y0-a,1); //3
GUI_Point(x0+b,y0-a,1); //0
GUI_Point(x0-a,y0+b,1); //1
GUI_Point(x0-b,y0-a,1); //7
GUI_Point(x0-a,y0-b,1); //2
GUI_Point(x0+b,y0+a,1); //4
GUI_Point(x0+a,y0-b,1); //5
GUI_Point(x0+a,y0+b,1); //6
GUI_Point(x0-b,y0+a,1);
a++;
/***使用Bresenham算法畫圓**/
if(di<0)
di +=4*a+6;
else
{
di +=10+4*(a-b);
b--;
}
GUI_Point(x0+a,y0+b,1);
}
}
這是在以(63,32)為圓心,32為半徑畫的圓(小問題是當(dāng)圓大后,會有部分畫不出來,有待完善)

4、整屏畫圖部分
這個比較簡單,就直接上程序了
void LCD_fulldisplay_picture_2(const uchar *pic) //全屏顯示圖片方法2
{
unsigned int x=0;
unsigned char i,j;
Write_command(0x34); //擴(kuò)展指令動作
Write_command(0x36); //擴(kuò)展指令動作
for(i=0;i<32;i++) //上半屏顯示
{
Write_command(0x80|i); //列位置
Write_command(0x80); //行位置
for(j=0;j<16;j++) //256/8=32 byte
{ //列位置每行自動增加
Write_data(*pic);
pic++;
}
}
for(i=0;i<32;i++) //下半屏顯示
{
Write_command(0x80|i); //列位置
Write_command(0x88); //行位置
for(j=0;j<16;j++) //256/8=32 byte
{
Write_data(*pic);
pic++;
}
}
Write_command(0x30);
}
下面是照片

5、圖片和文字在一起顯示
我用的是帶字庫的,所以顯示漢字較簡單,即先作圖,之后關(guān)閉繪圖模式,打開普通模式就可以顯示漢字了,先上個圖片
這個程序很簡單,就是先畫5個圓,再在下面寫漢字,就不用上傳了。
希望我的東西對大家有用,如果有更優(yōu)的源碼可以交流交流,
下面是關(guān)于一些算法的資料

|
|