找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

51單片機(jī)+OLED實(shí)現(xiàn)3D源程序 三維立體圖形變換顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:170892 發(fā)表于 2020-3-6 11:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)于如何實(shí)現(xiàn)坐標(biāo)轉(zhuǎn)換以及轉(zhuǎn)換方法這里不做討論,想了解原理以及計(jì)算過(guò)程可以自行查閱資料。

以下是很長(zhǎng)時(shí)間之前我在網(wǎng)上下載別人的開源代碼,但是具體從哪里下載的我忘記了,今天就測(cè)試了一下,完美運(yùn)行。
如果有人知道出處可以在評(píng)論區(qū)留言,我會(huì)加上出處。

下面是錄的OLED演示視頻:

https://player.youku.com/embed/XNDU3NTU3NzczNg==


維圖形顯示源碼功能描述:

三維圖形變換操作
  • transform_3D.c文檔中包含“變換算法”
  • projection.c文檔中包含“投影算法”
  • rotation_cube.c文檔應(yīng)用“變換矩陣算法”和“投影算法”實(shí)現(xiàn)旋轉(zhuǎn)立方體
  • rotation_font3D.c文檔實(shí)現(xiàn)三維空間中旋轉(zhuǎn)圖片(優(yōu)化算法)

三維圖形變換基于“變換矩陣算法”和“投影算法”來(lái)構(gòu)建新坐標(biāo)
顯示效果是 立方體繞Y軸旋轉(zhuǎn),圖片也隨之旋轉(zhuǎn)。

以下是下載的單片機(jī)源代碼,大家可以移植一下,文件里面有說(shuō)明,如下:
  1. /*******************************************************************************
  2. * 工程: 基于STC單片機(jī)“12864液晶顯示旋轉(zhuǎn)的立方體和圖片(優(yōu)化算法)”實(shí)例
  3. * 編譯: Keil uVersion 3
  4. * 創(chuàng)建: 2014-11-26 15:57:14
  5. * 更新: NULL
  6. * 版本: 1.0
  7. *******************************************************************************/
  8. /*******************************************************************************
  9. * 文檔: main.c
  10. * 作者: Wu LianWei
  11. * 描述: 1.三維圖形變換操作
  12. *       2.transform_3D.c文檔中包含“變換算法”
  13. *       3.projection.c文檔中包含“投影算法”
  14. *       4.rotation_cube.c文檔應(yīng)用“變換矩陣算法”和“投影算法”實(shí)現(xiàn)旋轉(zhuǎn)立方體
  15. *       5.rotation_font3D.c文檔實(shí)現(xiàn)三維空間中旋轉(zhuǎn)圖片(優(yōu)化算法)
  16. *       6.三維圖形變換基于“變換矩陣算法”和“投影算法”來(lái)構(gòu)建新坐標(biāo)
  17. *       7.顯示效果是 立方體繞Y軸旋轉(zhuǎn),圖片也隨之旋轉(zhuǎn)。
  18. *******************************************************************************/
  19. #include "STC15F2K60S2.h"
  20. #include "public.h"
  21. #include "rtc.h"
  22. #include "lcd_drive.h"
  23. #include "dis_general.h"
  24. #include "rotation_cube.h"
  25. #include "rotation_font3D.h"
  26. #include "font.h"



  27. /******************************************************************************/
  28. /* 程序變量定義                                                               */
  29. /******************************************************************************/
  30. volatile bit flash;    //閃爍標(biāo)志
  31. float idata turn;           //轉(zhuǎn)向角度
  32. uchar idata pic;
  33. sbit BG = P0^5; //低電平有效



  34. /******************************************************************************/
  35. /* MAIN主程序                                                                 */
  36. /******************************************************************************/
  37. void main(void)
  38. {
  39.     WDT_CONTR = 0x05; //關(guān)閉看門狗
  40.     //--------------------------------
  41.     RTC_cfg();                //配置實(shí)時(shí)時(shí)鐘(啟動(dòng)定時(shí)器0)
  42.     LcdInit();                //LCD12864初始化
  43.     ClearScreen();        //清空屏幕
  44.     //------------
  45.     turn=0;                        //轉(zhuǎn)向角度置0
  46.     pic=0;
  47.    
  48.     while(1)
  49.     {
  50.         if(T20msFlg)        //每過(guò)20ms處理事件標(biāo)志位
  51.         {
  52.             T20msFlg=0;
  53.             //-----------------
  54.             ClearDis();        //清緩存也可以理解為清屏
  55.             
  56.             RotateCube2(0,turn,0);        //立方體旋轉(zhuǎn)計(jì)算并寫入緩存區(qū)
  57.             //RotatePic32x32(&SETICO[pic][0],0,turn,0);                //固定32*32旋轉(zhuǎn)
  58.             BG = 0;                //打開LCD片選
  59.             
  60.             RefreshScreen(); //將緩存區(qū)發(fā)送到LCD顯示
  61.         }
  62.                
  63.         if(T100msFlg)        //每過(guò)100ms處理事件標(biāo)志位
  64.         {
  65.             T100msFlg=0;
  66.             //-----------------
  67.             turn+=1;                                //每過(guò)100ms將旋轉(zhuǎn)的角度加1
  68.             if(turn>=360)turn=0;
  69.             if(turn==280) //270
  70.             {
  71.                 pic++;
  72.                 if(pic>7)pic=0;
  73.             }
  74.             
  75.         }
  76.                
  77.         if(T500msFlg)        //每過(guò)500ms處理事件標(biāo)志位
  78.         {
  79.             T500msFlg=0;
  80.             //-----------------
  81.             flash=!flash;       //閃爍標(biāo)志
  82.             
  83.         }
  84.                
  85.         if(T1sFlg)                //每過(guò)1s處理事件標(biāo)志位
  86.         {
  87.             T1sFlg=0;
  88.             //-----------------
  89.             
  90.         }
  91.     }
  92. }
復(fù)制代碼

只需要以上4個(gè).c和對(duì)應(yīng).h文件就可以移植了。

注意:使用LCD12864,是可以取屏幕數(shù)據(jù)的,OLED12864用SPI或I2C驅(qū)動(dòng)是不能讀取屏幕數(shù)據(jù),需要占用單片機(jī)102
4個(gè)RAM空間作為顯存區(qū),這樣就可以實(shí)現(xiàn)。當(dāng)然也可以不用顯存區(qū),直接寫,這樣操作可能會(huì)覆蓋其他像素,看自己是否需要選擇。


個(gè)人測(cè)試:STC8A8K64S4A12  28M晶振  SPI是4分頻  刷新  OLED12864(SPI驅(qū)動(dòng))  整個(gè)屏幕 大約需要4.8ms。  推薦還是用STM32加DMA這樣就大大節(jié)省時(shí)間了。

全部資料51hei下載地址:
LCD三維顯示源碼分享.zip (174.7 KB, 下載次數(shù): 134)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:74977 發(fā)表于 2021-12-16 09:41 | 只看該作者
666666寫出這個(gè)的人肯定是個(gè)大神
回復(fù)

使用道具 舉報(bào)

板凳
ID:138205 發(fā)表于 2021-12-23 19:50 | 只看該作者
編寫這個(gè)的是個(gè)算法高手呀
回復(fù)

使用道具 舉報(bào)

地板
ID:230500 發(fā)表于 2022-1-6 23:03 | 只看該作者
源程序作者絕對(duì)這是個(gè)大神,厲害!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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