|
0.png (19.24 KB, 下載次數(shù): 70)
下載附件
2016-9-4 20:47 上傳
51單片機(jī)在LCD12864上畫曲線的源碼如下:
- /********************************** LCD12864曲線顯示*******************************************/
- /*********作者:王勝文。 email:nunk@163.com 希望與大家交流2017。08。03**********/
- #include<avr/io.h>
- #include<reg51.h>
- #include<drive_functions.h>
- #include<math.h>
- //#include<get_keys.h>
- #define Graphic_Clear 0x01 //檫除點(diǎn)
- #define Graphic_Not 0x02 //反相點(diǎn)
- #define Graphic_Draw 0x03 //畫點(diǎn)
- uchar j=0,i=0;
- uchar r=32;
- /***********************在LCD上任意坐標(biāo)畫點(diǎn)********************************/
- void DrawPoint(uchar X,uchar Y,uchar Type)
- { //X,Y化點(diǎn)的坐標(biāo)Type畫點(diǎn)的類型:反相點(diǎn),檫除點(diǎn),畫點(diǎn)
-
- uchar DX = (Y >> 3); //計算出屬于哪個字節(jié)
- uchar BX = Y - (DX << 3); //計算出屬于字節(jié)哪一位
- uchar TempData = 0;
-
-
- if (X > 63)
- {
- chip_select=2;
- X -= 64;
- }
- else
- {
- chip_select=1;
- }
- SetPage(DX); //設(shè)行地址
- SetColumn(X); //設(shè)列地址
-
- TempData = ReadData(); //讀出所畫點(diǎn)所在字節(jié)的內(nèi)容
-
- switch (Type) //對該字節(jié)進(jìn)行相應(yīng)操作
- {
- case Graphic_Clear:
- TempData &= ~(1<<BX);
- break;
- case Graphic_Not:
- TempData ^= (1 << BX);
- break;
- case Graphic_Draw:
- TempData |= (1 << BX);
- break;
- default: break;
- }
-
- SetPage(DX); //設(shè)置行地址
- SetColumn(X); //設(shè)置列地址
- WriteData(TempData); //把修改后的字節(jié)送回LCD,達(dá)到畫點(diǎn)目的
- }
- /********插值法畫任意兩點(diǎn)之間直線的函數(shù),函數(shù)中只用加減法,程序運(yùn)行效率很高**********/
- DrawLine(uchar x1,uchar y1,uchar x2,uchar y2)
- { //x1,y1起點(diǎn)坐標(biāo);x2,y2終點(diǎn)坐標(biāo);
- uchar x,y;
- uchar d_x,d_y;
- char err=0;
- uchar temp=0;
- if(y2<y1){x=x1;y=y1;x1=x2;y1=y2;x2=x;y2=y;}
- d_y=y2-y1;
- if (d_y==0)
- {
- if (x1>x2) {x=x1;x1=x2;x2=x;}
- for ( x=x1;x<=x2;x++ ) DrawPoint(x,y1,Graphic_Draw);
- }
- else
- {
- if(x2>=x1){temp=1;d_x=x2-x1;}else d_x=x1-x2;
- x=x1;y=y1;DrawPoint(x,y,Graphic_Draw);
- if(temp&&(d_y<=d_x))
- while(x!=x2)
- {if(err<0){x=x+1;err=err+(y2-y);}
- else {x=x+1;y=y+1;err=err+(y2-y)-(x2-x);}
- DrawPoint(x,y,Graphic_Draw);
- }
- else if(temp&&(d_y>d_x))
- while(y!=y2)
- {d_x=x2-x;d_y=y2-y;
- if(err<0){x=x+1;y=y+1;err=err+d_y-d_x;}
- else {y=y+1;err=err-d_x;}
- DrawPoint(x,y,Graphic_Draw);
- }
- else if(!temp&&(d_y<=d_x))
- while(x!=x2)
- {d_x=x-x2;d_y=y2-y;
- if(err<0){x=x-1;err=err+d_y;}
- else {x=x-1;y=y+1;err=err+d_y-d_x;}
- DrawPoint(x,y,Graphic_Draw);
- }
- else if(!temp &&(d_y>d_x))
- while(y!=y2)
- {d_x=x-x2;d_y=y2-y;
- if(err<0){x=x-1;y=y+1;err=err+d_y-d_x;}
- else {y=y+1;err=err-d_x;}
- DrawPoint(x,y,Graphic_Draw);
- }
- }
- }
- /***********************************************************************/
- void DrawLevel(void)
- {
- for(i=0;i<127;i++){DrawPoint(i,32,Graphic_Draw);}//畫水平直線
- }
- /************************************************************************************/
- void DrawSineWave(void)
- {
- uchar xn=0;
- uchar yn=32;
- uchar i;
- uchar xi,yi;
- for(i=0;i<127;i++)
- {
- xi=i;
- yi=(sin(i*0.1)*32)+32;
- DrawLine(xn,yn,xi,yi); //在一系列零散的點(diǎn)上,兩點(diǎn)兩點(diǎn)之間連線,從而得到一條曲線
-
- xn=i;
- yn=yi;
-
- }
- }
- /*************************************************************************************/
- void DrawCircle(uchar x0,uchar y0,uchar r)//x0,y0為圓心坐標(biāo),r為圓半徑
- {
- uchar xn,yn,xi,yi;
- unsigned int j;
- xn=cos(0)*r+x0;
- yn=sin(0)*r+y0;
- for(j=0;j<630;j++)
- {
- xi=(cos(j*0.01)*r)+x0;
- yi=(sin(j*0.01)*r)+y0;
- DrawLine(xn,yn,xi,yi); //在一系列零散的點(diǎn)上,兩點(diǎn)兩點(diǎn)之間連線,從而得到一條曲線
-
- xn=xi;
- yn=yi;
- }
- }
- /**************************************************************************************************/
- void DrawRetic(uchar x0,uchar y0,uchar x1,uchar y1)//畫正方形,x0,y0為左上角坐標(biāo),x1,y1為右下角坐標(biāo)
- {
- uchar i;
- for(i=0;i<=x1-x0;i++){ DrawPoint(x0+i,y0,Graphic_Draw); DrawPoint(x0+i,y1,Graphic_Draw); }
- for(i=0;i<=y1-y0;i++){ DrawPoint(x0,y0+i,Graphic_Draw); DrawPoint(x1,y0+i,Graphic_Draw); }
- }
- /**************************************************************************************************/
- void DrawTrigle(uchar x1,uchar y1,uchar x2,uchar y2,uchar x3,uchar y3)//畫三角形,三個坐標(biāo)為三角形頂點(diǎn)
- {
- DrawLine(x1,y1,x2,y2);
- DrawLine(x2,y2,x3,y3);
- DrawLine(x1,y1,x3,y3);
-
- }
- /******************************** main **********************************************************/
- void main(void)
- {
- ClearLCD();
- while(1)
- {
- ClearLCD();
- //DrawLevel();
- //DrawLine(0,63,127,0);
- DrawSineWave();
- //DrawCircle(63,32,r);
- //r-=4;
- //}
- //DrawRetic(10,10,30,30);
- //DrawTrigle(12,23,80,60,120,6);
- DrawRetic(5,5,120,60);
- }
- }
復(fù)制代碼
0.png (78.08 KB, 下載次數(shù): 60)
下載附件
2016-9-4 20:51 上傳
仿真文件下載:
Proteus中單片機(jī)89C51在LCD12864上畫曲線.rar
(62.69 KB, 下載次數(shù): 196)
2016-9-4 20:48 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|