找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11965|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)在LCD12864上畫曲線的Proteus仿真及程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


51單片機(jī)在LCD12864上畫曲線的源碼如下:
  1. /********************************** LCD12864曲線顯示*******************************************/
  2. /*********作者:王勝文。 email:nunk@163.com 希望與大家交流2017。08。03**********/

  3. #include<avr/io.h>
  4. #include<reg51.h>
  5. #include<drive_functions.h>
  6. #include<math.h>
  7. //#include<get_keys.h>
  8. #define Graphic_Clear 0x01   //檫除點(diǎn)
  9. #define Graphic_Not 0x02     //反相點(diǎn)
  10. #define Graphic_Draw 0x03         //畫點(diǎn)

  11. uchar j=0,i=0;
  12. uchar r=32;
  13. /***********************在LCD上任意坐標(biāo)畫點(diǎn)********************************/

  14. void DrawPoint(uchar X,uchar Y,uchar Type)
  15. {                                                                         //X,Y化點(diǎn)的坐標(biāo)Type畫點(diǎn)的類型:反相點(diǎn),檫除點(diǎn),畫點(diǎn)
  16.                                                    
  17.    uchar DX = (Y >> 3);               //計算出屬于哪個字節(jié)
  18.    uchar BX = Y - (DX << 3);           //計算出屬于字節(jié)哪一位
  19.    uchar TempData = 0;
  20.    
  21.    
  22.    if (X > 63)
  23.    {
  24.     chip_select=2;
  25.       X -= 64;
  26.    }
  27.    else
  28.    {
  29.       chip_select=1;
  30.    }

  31.    SetPage(DX);             //設(shè)行地址
  32.    SetColumn(X);                         //設(shè)列地址
  33.    
  34.    TempData = ReadData();   //讀出所畫點(diǎn)所在字節(jié)的內(nèi)容
  35.    
  36.    switch (Type)            //對該字節(jié)進(jìn)行相應(yīng)操作
  37.    {
  38.        case Graphic_Clear:
  39.                                                   TempData &= ~(1<<BX);
  40.                                                  break;
  41.       case Graphic_Not:
  42.                                                  TempData ^= (1 << BX);
  43.                                                   break;
  44.       case Graphic_Draw:
  45.                                                   TempData |= (1 << BX);  
  46.                                                         break;
  47.           default:                                break;
  48.    }
  49.    
  50.    SetPage(DX);            //設(shè)置行地址
  51.    SetColumn(X);                          //設(shè)置列地址
  52.    WriteData(TempData);         //把修改后的字節(jié)送回LCD,達(dá)到畫點(diǎn)目的
  53. }

  54. /********插值法畫任意兩點(diǎn)之間直線的函數(shù),函數(shù)中只用加減法,程序運(yùn)行效率很高**********/

  55. DrawLine(uchar x1,uchar y1,uchar x2,uchar y2)
  56. {                           //x1,y1起點(diǎn)坐標(biāo);x2,y2終點(diǎn)坐標(biāo);
  57.     uchar x,y;
  58.     uchar d_x,d_y;            
  59.     char err=0;
  60.     uchar temp=0;

  61.     if(y2<y1){x=x1;y=y1;x1=x2;y1=y2;x2=x;y2=y;}
  62.     d_y=y2-y1;
  63.     if (d_y==0)
  64.         {
  65.         if (x1>x2) {x=x1;x1=x2;x2=x;}
  66.         for ( x=x1;x<=x2;x++ ) DrawPoint(x,y1,Graphic_Draw);
  67.         }
  68.     else
  69.         {
  70.     if(x2>=x1){temp=1;d_x=x2-x1;}else d_x=x1-x2;
  71.     x=x1;y=y1;DrawPoint(x,y,Graphic_Draw);
  72.     if(temp&&(d_y<=d_x))
  73.         while(x!=x2)
  74.             {if(err<0){x=x+1;err=err+(y2-y);}
  75.             else {x=x+1;y=y+1;err=err+(y2-y)-(x2-x);}
  76.             DrawPoint(x,y,Graphic_Draw);
  77.             }
  78.     else if(temp&&(d_y>d_x))
  79.         while(y!=y2)
  80.             {d_x=x2-x;d_y=y2-y;
  81.             if(err<0){x=x+1;y=y+1;err=err+d_y-d_x;}
  82.             else {y=y+1;err=err-d_x;}
  83.             DrawPoint(x,y,Graphic_Draw);
  84.             }
  85.     else if(!temp&&(d_y<=d_x))
  86.         while(x!=x2)
  87.             {d_x=x-x2;d_y=y2-y;
  88.             if(err<0){x=x-1;err=err+d_y;}
  89.             else {x=x-1;y=y+1;err=err+d_y-d_x;}
  90.             DrawPoint(x,y,Graphic_Draw);
  91.             }
  92.     else if(!temp &&(d_y>d_x))
  93.         while(y!=y2)
  94.             {d_x=x-x2;d_y=y2-y;
  95.             if(err<0){x=x-1;y=y+1;err=err+d_y-d_x;}
  96.             else {y=y+1;err=err-d_x;}
  97.             DrawPoint(x,y,Graphic_Draw);
  98.             }
  99.         }   
  100. }                                 


  101. /***********************************************************************/

  102. void DrawLevel(void)
  103. {

  104. for(i=0;i<127;i++){DrawPoint(i,32,Graphic_Draw);}//畫水平直線

  105. }

  106. /************************************************************************************/

  107. void DrawSineWave(void)
  108. {
  109.         uchar xn=0;
  110.         uchar yn=32;
  111.         uchar i;
  112.         uchar xi,yi;
  113. for(i=0;i<127;i++)
  114.         {
  115.                 xi=i;
  116.                 yi=(sin(i*0.1)*32)+32;

  117.                 DrawLine(xn,yn,xi,yi);      //在一系列零散的點(diǎn)上,兩點(diǎn)兩點(diǎn)之間連線,從而得到一條曲線
  118.                
  119.                 xn=i;
  120.                 yn=yi;
  121.                
  122.                 }  
  123.                 }

  124. /*************************************************************************************/

  125. void DrawCircle(uchar x0,uchar y0,uchar r)//x0,y0為圓心坐標(biāo),r為圓半徑
  126. {
  127. uchar xn,yn,xi,yi;
  128. unsigned int j;

  129. xn=cos(0)*r+x0;
  130. yn=sin(0)*r+y0;

  131. for(j=0;j<630;j++)
  132.         {
  133.                 xi=(cos(j*0.01)*r)+x0;
  134.                 yi=(sin(j*0.01)*r)+y0;

  135.                 DrawLine(xn,yn,xi,yi);      //在一系列零散的點(diǎn)上,兩點(diǎn)兩點(diǎn)之間連線,從而得到一條曲線
  136.                
  137.                 xn=xi;
  138.                 yn=yi;
  139. }

  140. }

  141. /**************************************************************************************************/

  142. void DrawRetic(uchar x0,uchar y0,uchar x1,uchar y1)//畫正方形,x0,y0為左上角坐標(biāo),x1,y1為右下角坐標(biāo)
  143. {
  144.         uchar i;
  145.         for(i=0;i<=x1-x0;i++){  DrawPoint(x0+i,y0,Graphic_Draw);  DrawPoint(x0+i,y1,Graphic_Draw);  }
  146.         for(i=0;i<=y1-y0;i++){  DrawPoint(x0,y0+i,Graphic_Draw);  DrawPoint(x1,y0+i,Graphic_Draw);  }
  147.         }


  148. /**************************************************************************************************/

  149. void DrawTrigle(uchar x1,uchar y1,uchar x2,uchar y2,uchar x3,uchar y3)//畫三角形,三個坐標(biāo)為三角形頂點(diǎn)
  150. {
  151.         DrawLine(x1,y1,x2,y2);
  152.         DrawLine(x2,y2,x3,y3);
  153.         DrawLine(x1,y1,x3,y3);
  154.         
  155. }

  156. /******************************** main **********************************************************/

  157. void main(void)
  158. {

  159. ClearLCD();

  160. while(1)
  161. {

  162. ClearLCD();
  163. //DrawLevel();
  164. //DrawLine(0,63,127,0);
  165. DrawSineWave();

  166. //DrawCircle(63,32,r);
  167. //r-=4;
  168. //}

  169. //DrawRetic(10,10,30,30);
  170. //DrawTrigle(12,23,80,60,120,6);
  171. DrawRetic(5,5,120,60);
  172. }

  173. }
復(fù)制代碼


仿真文件下載: Proteus中單片機(jī)89C51在LCD12864上畫曲線.rar (62.69 KB, 下載次數(shù): 196)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:138707 發(fā)表于 2016-9-7 12:47 | 只看該作者
O(∩_∩)O謝謝   樓主分享
回復(fù)

使用道具 舉報

板凳
ID:146583 發(fā)表于 2016-11-7 12:01 | 只看該作者
不錯,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

地板
ID:166657 發(fā)表于 2017-2-25 22:30 | 只看該作者
感謝分享,很詳細(xì)
回復(fù)

使用道具 舉報

5#
ID:169968 發(fā)表于 2017-3-16 21:54 | 只看該作者
好東西,謝謝分享,給樓主點(diǎn)贊
回復(fù)

使用道具 舉報

6#
ID:192737 發(fā)表于 2017-4-23 16:46 | 只看該作者
學(xué)習(xí),學(xué)習(xí)
回復(fù)

使用道具 舉報

7#
ID:192737 發(fā)表于 2017-4-23 17:13 | 只看該作者
這個帶字庫的和不帶字庫的引腳的定義有什么不同?
回復(fù)

使用道具 舉報

8#
ID:192737 發(fā)表于 2017-4-23 17:13 | 只看該作者
引腳CS1和CS2不怎么會接,我買的12864怎么沒有這兩個引腳的定義?
回復(fù)

使用道具 舉報

9#
ID:107680 發(fā)表于 2017-11-11 15:34 | 只看該作者
謝謝分享謝謝分享
回復(fù)

使用道具 舉報

10#
ID:265974 發(fā)表于 2017-12-24 11:39 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報

11#
ID:184706 發(fā)表于 2018-6-25 10:37 | 只看該作者
真棒  我就是要找這個 謝謝
回復(fù)

使用道具 舉報

12#
ID:499790 發(fā)表于 2019-4-18 01:14 | 只看該作者
不錯下載下來研究一下
回復(fù)

使用道具 舉報

13#
ID:160450 發(fā)表于 2020-5-22 12:08 | 只看該作者
可以借鑒
回復(fù)

使用道具 舉報

14#
ID:3802 發(fā)表于 2025-4-26 10:11 | 只看該作者
O(∩_∩)O謝謝   樓主分享
回復(fù)

使用道具 舉報

15#
ID:433219 發(fā)表于 2025-4-29 14:02 | 只看該作者
上個世紀(jì)的方案:并行 12864 。。。。太浪費(fèi)io了
回復(fù)

使用道具 舉報

16#
ID:1064915 發(fā)表于 2025-4-30 09:42 | 只看該作者
wkman 發(fā)表于 2025-4-29 14:02
上個世紀(jì)的方案:并行 12864 。。。。太浪費(fèi)io了

并行 12864如何轉(zhuǎn)換串行
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表