亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

    標題: st7920控制的12864畫線,畫圓,作圖成功(上圖),拿來分享(注釋很詳細) [打印本頁]

    作者: aabbcc    時間: 2014-11-22 15:29
    標題: st7920控制的12864畫線,畫圓,作圖成功(上圖),拿來分享(注釋很詳細)
    在這里首先要感謝那些好心人,沒有他們的幫忙我是寫不出來,真的很謝謝你們。我把最近所調試成功的,都一一給大家說明,并上圖和相關資料,希望對大家用。
    1、打點部分
      該部分已在該論壇發(fā)帖,這里不就重復了
      (打點是所有繪圖的基礎)
    2、畫線部分
      先看程序
    /********************************************************
    * 名稱:GUI_Line()
          采用布蘭森漢姆(Bresenham)算法畫線
    * 功能:任意兩點間的直線。根據(jù)硬件特點,實現(xiàn)加速。
    * 入口參數(shù):x0       直線起點所在行的位置
    *         y0       直線起點所在列的位置
    *         x1     直線終點所在行的位置
    ‘       y1     直線終點所在列的位置
    * 出口參數(shù):   無
    * 說明:操作失敗原因是指定地址超出緩沖區(qū)范圍。
    *********************************************************/
    void GUI_Line8(uchar x0,uchar y0,uchar x1,uchar y1)
    {
    int temp;
    int dx,dy;               //定義起點到終點的橫、縱坐標增加值
    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);             //計算橫、縱標志增加值的絕對值
    Dy=fabs(y1-y0);
    if(Dy>Dx)                 //               
      {                     //以45度角為分界線,靠進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算法畫任意兩點間的直線********/
      sub=2*Dy-Dx;                 //第1次判斷下個點的位置
      for(i=0;i<Dx;i++)
      {
        GUI_Point(x0,y0,1);           //畫點
        if(sub>=0)                              
        {
        if(status==1)               //在靠近Y軸區(qū),x值加1
          x0+=s1;
        else                     //在靠近X軸區(qū),y值加1               
          y0+=s2;
        sub-=2*Dx;                 //判斷下下個點的位置
        }
        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;             //判斷下個點位置的標志
    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為半徑畫的圓(小問題是當圓大后,會有部分畫不出來,有待完善)


    4、整屏畫圖部分
    這個比較簡單,就直接上程序了
    void LCD_fulldisplay_picture_2(const uchar *pic) //全屏顯示圖片方法2
    {
    unsigned int x=0;
    unsigned char i,j;
    Write_command(0x34);                 //擴展指令動作
    Write_command(0x36);                 //擴展指令動作

    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、圖片和文字在一起顯示
    我用的是帶字庫的,所以顯示漢字較簡單,即先作圖,之后關閉繪圖模式,打開普通模式就可以顯示漢字了,先上個圖片
    這個程序很簡單,就是先畫5個圓,再在下面寫漢字,就不用上傳了。

    希望我的東西對大家有用,如果有更優(yōu)的源碼可以交流交流,
    下面是關于一些算法的資料


    基于Bresenham的高效直線生成集成算法.pdf

    312.93 KB, 下載次數(shù): 68, 下載積分: 黑幣 -5

    快速直線生成算法.pdf

    361.29 KB, 下載次數(shù): 55, 下載積分: 黑幣 -5

    嵌入式LCD中畫圓算法的改進與實現(xiàn).pdf

    256.5 KB, 下載次數(shù): 49, 下載積分: 黑幣 -5


    作者: bestzhaohe    時間: 2014-12-9 22:29

    作者: c51hyw    時間: 2017-4-18 20:31
    整屏畫圖函數(shù)我用了,,畫出的不是那么回事,,不是整平的
    作者: jialishoushi    時間: 2017-6-18 03:31
    好資料咋沒人頂呢  我頂
    作者: piplxh    時間: 2017-10-22 12:26
    好資料!
    作者: 阿凡提    時間: 2017-10-25 08:55
    好東西,感謝樓主
    作者: thxl_kis    時間: 2020-2-17 22:18
    歷害,打點的是在什么地方?
    作者: trewtrwe    時間: 2020-7-12 01:05
    不錯,正在努力獲得12864的顯示自由。
    作者: waerdeng    時間: 2021-3-23 07:49
    頂一下希望用在ST7565上面有效。




    歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1