Proteus中單片機89C51在LCD12864上畫曲線仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16.76 KB, 下載次數: 45)
下載附件
2018-5-20 01:26 上傳
0.jpg (44.01 KB, 下載次數: 41)
下載附件
2018-5-20 01:25 上傳
單片機源程序如下:
- /********************************** LCD12864曲線顯示*******************************************/
- #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)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
Proteus中單片機89C51在LCD12864上畫曲線.rar
(62.69 KB, 下載次數: 44)
2018-5-20 00:33 上傳
點擊文件名下載附件
仿真+源程序 下載積分: 黑幣 -5
|