0.png (19.24 KB, 下載次數: 70)
下載附件
2016-9-4 20:47 上傳
51單片機在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 //檫除點
- #define Graphic_Not 0x02 //反相點
- #define Graphic_Draw 0x03 //畫點
- uchar j=0,i=0;
- uchar r=32;
- /***********************在LCD上任意坐標畫點********************************/
- void DrawPoint(uchar X,uchar Y,uchar Type)
- { //X,Y化點的坐標Type畫點的類型:反相點,檫除點,畫點
-
- uchar DX = (Y >> 3); //計算出屬于哪個字節
- uchar BX = Y - (DX << 3); //計算出屬于字節哪一位
- uchar TempData = 0;
-
-
- if (X > 63)
- {
- chip_select=2;
- X -= 64;
- }
- else
- {
- chip_select=1;
- }
- SetPage(DX); //設行地址
- SetColumn(X); //設列地址
-
- TempData = ReadData(); //讀出所畫點所在字節的內容
-
- switch (Type) //對該字節進行相應操作
- {
- 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); //設置行地址
- SetColumn(X); //設置列地址
- WriteData(TempData); //把修改后的字節送回LCD,達到畫點目的
- }
- /********插值法畫任意兩點之間直線的函數,函數中只用加減法,程序運行效率很高**********/
- DrawLine(uchar x1,uchar y1,uchar x2,uchar y2)
- { //x1,y1起點坐標;x2,y2終點坐標;
- 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); //在一系列零散的點上,兩點兩點之間連線,從而得到一條曲線
-
- xn=i;
- yn=yi;
-
- }
- }
- /*************************************************************************************/
- void DrawCircle(uchar x0,uchar y0,uchar r)//x0,y0為圓心坐標,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); //在一系列零散的點上,兩點兩點之間連線,從而得到一條曲線
-
- xn=xi;
- yn=yi;
- }
- }
- /**************************************************************************************************/
- void DrawRetic(uchar x0,uchar y0,uchar x1,uchar y1)//畫正方形,x0,y0為左上角坐標,x1,y1為右下角坐標
- {
- 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)//畫三角形,三個坐標為三角形頂點
- {
- 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);
- }
- }
復制代碼
0.png (78.08 KB, 下載次數: 60)
下載附件
2016-9-4 20:51 上傳
仿真文件下載:
Proteus中單片機89C51在LCD12864上畫曲線.rar
(62.69 KB, 下載次數: 196)
2016-9-4 20:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|