找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5356|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机+OLED实现3D源程序 三维立体图形变换显示

  [复制链接]
跳转到指定楼层
楼主
ID:170892 发表于 2020-3-6 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于如何实现坐标转换以及转换方法这里不做讨论,想了解原理以及计算过程可以自行查阅资料。

以下是很长时间之前我在网上下载别人的开源代码,但是具体从哪里下载的我忘记了,今天就测试了一下,完美运行。
如果有人知道出处可以在评论区留言,我会加上出处。

下面是录的OLED演示视频:

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


维图形显示源码功能描述:

三维图形变换操作
  • transform_3D.c文档中包含“变换算法”
  • projection.c文档中包含“投影算法”
  • rotation_cube.c文档应用“变换矩阵算法”和“投影算法”实现旋转立方体
  • rotation_font3D.c文档实现三维空间中旋转图片(优化算法)

三维图形变换基于“变换矩阵算法”和“投影算法”来构建新坐标
显示效果是 立方体绕Y轴旋转,图片也随之旋转。

以下是下载的单片机源代码,大家可以移植一下,文件里面有说明,如下:
  1. /*******************************************************************************
  2. * 工程: 基于STC单片机“12864液晶显示旋转的立方体和图片(优化算法)”实例
  3. * 编译: Keil uVersion 3
  4. * 创建: 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文档应用“变换矩阵算法”和“投影算法”实现旋转立方体
  15. *       5.rotation_font3D.c文档实现三维空间中旋转图片(优化算法)
  16. *       6.三维图形变换基于“变换矩阵算法”和“投影算法”来构建新坐标
  17. *       7.显示效果是 立方体绕Y轴旋转,图片也随之旋转。
  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;    //闪烁标志
  31. float idata turn;           //转向角度
  32. uchar idata pic;
  33. sbit BG = P0^5; //低电平有效



  34. /******************************************************************************/
  35. /* MAIN主程序                                                                 */
  36. /******************************************************************************/
  37. void main(void)
  38. {
  39.     WDT_CONTR = 0x05; //关闭看门狗
  40.     //--------------------------------
  41.     RTC_cfg();                //配置实时时钟(启动定时器0)
  42.     LcdInit();                //LCD12864初始化
  43.     ClearScreen();        //清空屏幕
  44.     //------------
  45.     turn=0;                        //转向角度置0
  46.     pic=0;
  47.    
  48.     while(1)
  49.     {
  50.         if(T20msFlg)        //每过20ms处理事件标志位
  51.         {
  52.             T20msFlg=0;
  53.             //-----------------
  54.             ClearDis();        //清缓存也可以理解为清屏
  55.             
  56.             RotateCube2(0,turn,0);        //立方体旋转计算并写入缓存区
  57.             //RotatePic32x32(&SETICO[pic][0],0,turn,0);                //固定32*32旋转
  58.             BG = 0;                //打开LCD片选
  59.             
  60.             RefreshScreen(); //将缓存区发送到LCD显示
  61.         }
  62.                
  63.         if(T100msFlg)        //每过100ms处理事件标志位
  64.         {
  65.             T100msFlg=0;
  66.             //-----------------
  67.             turn+=1;                                //每过100ms将旋转的角度加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)        //每过500ms处理事件标志位
  78.         {
  79.             T500msFlg=0;
  80.             //-----------------
  81.             flash=!flash;       //闪烁标志
  82.             
  83.         }
  84.                
  85.         if(T1sFlg)                //每过1s处理事件标志位
  86.         {
  87.             T1sFlg=0;
  88.             //-----------------
  89.             
  90.         }
  91.     }
  92. }
复制代码

只需要以上4个.c和对应.h文件就可以移植了。

注意:使用LCD12864,是可以取屏幕数据的,OLED12864用SPI或I2C驱动是不能读取屏幕数据,需要占用单片机102
4个RAM空间作为显存区,这样就可以实现。当然也可以不用显存区,直接写,这样操作可能会覆盖其他像素,看自己是否需要选择。


个人测试:STC8A8K64S4A12  28M晶振  SPI是4分频  刷新  OLED12864(SPI驱动)  整个屏幕 大约需要4.8ms。  推荐还是用STM32加DMA这样就大大节省时间了。

全部资料51hei下载地址:
LCD三维显示源码分享.zip (174.7 KB, 下载次数: 134)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:74977 发表于 2021-12-16 09:41 | 只看该作者
666666写出这个的人肯定是个大神
回复

使用道具 举报

板凳
ID:138205 发表于 2021-12-23 19:50 | 只看该作者
编写这个的是个算法高手呀
回复

使用道具 举报

地板
ID:230500 发表于 2022-1-6 23:03 | 只看该作者
源程序作者绝对这是个大神,厉害!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表