久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11989|回復: 8
打印 上一主題 下一主題
收起左側

st7920控制的12864畫線,畫圓,作圖成功(上圖),拿來分享(注釋很詳細)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:68618 發表于 2014-11-22 15:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在這里首先要感謝那些好心人,沒有他們的幫忙我是寫不出來,真的很謝謝你們。我把最近所調試成功的,都一一給大家說明,并上圖和相關資料,希望對大家用。
1、打點部分
  該部分已在該論壇發帖,這里不就重復了
  (打點是所有繪圖的基礎)
2、畫線部分
  先看程序
/********************************************************
* 名稱:GUI_Line()
      采用布蘭森漢姆(Bresenham)算法畫線
* 功能:任意兩點間的直線。根據硬件特點,實現加速。
* 入口參數:x0       直線起點所在行的位置
*         y0       直線起點所在列的位置
*         x1     直線終點所在行的位置
‘       y1     直線終點所在列的位置
* 出口參數:   無
* 說明:操作失敗原因是指定地址超出緩沖區范圍。
*********************************************************/
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軸區,x值加1
      x0+=s1;
    else                     //在靠近X軸區,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個圓,再在下面寫漢字,就不用上傳了。

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


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

312.93 KB, 下載次數: 68, 下載積分: 黑幣 -5

快速直線生成算法.pdf

361.29 KB, 下載次數: 55, 下載積分: 黑幣 -5

嵌入式LCD中畫圓算法的改進與實現.pdf

256.5 KB, 下載次數: 49, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發
ID:59986 發表于 2014-12-9 22:29 | 只看該作者
回復

使用道具 舉報

板凳
ID:184282 發表于 2017-4-18 20:31 | 只看該作者
整屏畫圖函數我用了,,畫出的不是那么回事,,不是整平的
回復

使用道具 舉報

地板
ID:35873 發表于 2017-6-18 03:31 | 只看該作者
好資料咋沒人頂呢  我頂
回復

使用道具 舉報

5#
ID:199188 發表于 2017-10-22 12:26 | 只看該作者
好資料!
回復

使用道具 舉報

6#
ID:96218 發表于 2017-10-25 08:55 | 只看該作者
好東西,感謝樓主
回復

使用道具 舉報

7#
ID:235673 發表于 2020-2-17 22:18 | 只看該作者
歷害,打點的是在什么地方?
回復

使用道具 舉報

8#
ID:280405 發表于 2020-7-12 01:05 | 只看該作者
不錯,正在努力獲得12864的顯示自由。
回復

使用道具 舉報

9#
ID:71535 發表于 2021-3-23 07:49 | 只看該作者
頂一下希望用在ST7565上面有效。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费av手机在线观看 | 色www精品视频在线观看 | 久久久观看 | 国产精品区二区三区日本 | 天天曰天天干 | 黄视频网址| 久久久久亚洲精品 | 久久国产精品网站 | 真人毛片 | 免费毛片网站 | 亚洲欧洲小视频 | 无码日韩精品一区二区免费 | 久久久久久久久国产精品 | 久久久久久看片 | 国产成人精品a视频一区www | 亚洲精品久久久蜜桃网站 | 国产伦精品一区二区三毛 | 日本视频中文字幕 | 香蕉视频久久久 | 日日夜夜天天 | 秋霞av国产精品一区 | 噜噜噜色网 | 九九热免费视频在线观看 | 99久久婷婷 | 午夜精品一区二区三区三上悠亚 | 国产精品中文在线 | 亚洲福利在线观看 | 午夜精品视频在线观看 | 亚洲狠狠 | 国产成人精品在线播放 | 国产综合久久 | www.久久久.com | 日韩在线视频免费观看 | 二区中文字幕 | 超碰地址 | 中文字幕精品一区二区三区精品 | 91精品国产色综合久久不卡98 | 超碰在线播 | 免费黄色片在线观看 | 国产精品久久久久久久免费观看 | 亚洲一二三在线 |