关于如何实现坐标转换以及转换方法这里不做讨论,想了解原理以及计算过程可以自行查阅资料。
以下是很长时间之前我在网上下载别人的开源代码,但是具体从哪里下载的我忘记了,今天就测试了一下,完美运行。
如果有人知道出处可以在评论区留言,我会加上出处。
下面是录的OLED演示视频:
https://player.youku.com/embed/XNDU3NTU3NzczNg==
维图形显示源码功能描述:
三维图形变换操作
- transform_3D.c文档中包含“变换算法”
- projection.c文档中包含“投影算法”
- rotation_cube.c文档应用“变换矩阵算法”和“投影算法”实现旋转立方体
- rotation_font3D.c文档实现三维空间中旋转图片(优化算法)
三维图形变换基于“变换矩阵算法”和“投影算法”来构建新坐标
显示效果是 立方体绕Y轴旋转,图片也随之旋转。
以下是下载的单片机源代码,大家可以移植一下,文件里面有说明,如下:
- /*******************************************************************************
- * 工程: 基于STC单片机“12864液晶显示旋转的立方体和图片(优化算法)”实例
- * 编译: Keil uVersion 3
- * 创建: 2014-11-26 15:57:14
- * 更新: NULL
- * 版本: 1.0
- *******************************************************************************/
- /*******************************************************************************
- * 文档: main.c
- * 作者: Wu LianWei
- * 描述: 1.三维图形变换操作
- * 2.transform_3D.c文档中包含“变换算法”
- * 3.projection.c文档中包含“投影算法”
- * 4.rotation_cube.c文档应用“变换矩阵算法”和“投影算法”实现旋转立方体
- * 5.rotation_font3D.c文档实现三维空间中旋转图片(优化算法)
- * 6.三维图形变换基于“变换矩阵算法”和“投影算法”来构建新坐标
- * 7.显示效果是 立方体绕Y轴旋转,图片也随之旋转。
- *******************************************************************************/
- #include "STC15F2K60S2.h"
- #include "public.h"
- #include "rtc.h"
- #include "lcd_drive.h"
- #include "dis_general.h"
- #include "rotation_cube.h"
- #include "rotation_font3D.h"
- #include "font.h"
- /******************************************************************************/
- /* 程序变量定义 */
- /******************************************************************************/
- volatile bit flash; //闪烁标志
- float idata turn; //转向角度
- uchar idata pic;
- sbit BG = P0^5; //低电平有效
- /******************************************************************************/
- /* MAIN主程序 */
- /******************************************************************************/
- void main(void)
- {
- WDT_CONTR = 0x05; //关闭看门狗
- //--------------------------------
- RTC_cfg(); //配置实时时钟(启动定时器0)
- LcdInit(); //LCD12864初始化
- ClearScreen(); //清空屏幕
- //------------
- turn=0; //转向角度置0
- pic=0;
-
- while(1)
- {
- if(T20msFlg) //每过20ms处理事件标志位
- {
- T20msFlg=0;
- //-----------------
- ClearDis(); //清缓存也可以理解为清屏
-
- RotateCube2(0,turn,0); //立方体旋转计算并写入缓存区
- //RotatePic32x32(&SETICO[pic][0],0,turn,0); //固定32*32旋转
- BG = 0; //打开LCD片选
-
- RefreshScreen(); //将缓存区发送到LCD显示
- }
-
- if(T100msFlg) //每过100ms处理事件标志位
- {
- T100msFlg=0;
- //-----------------
- turn+=1; //每过100ms将旋转的角度加1
- if(turn>=360)turn=0;
- if(turn==280) //270
- {
- pic++;
- if(pic>7)pic=0;
- }
-
- }
-
- if(T500msFlg) //每过500ms处理事件标志位
- {
- T500msFlg=0;
- //-----------------
- flash=!flash; //闪烁标志
-
- }
-
- if(T1sFlg) //每过1s处理事件标志位
- {
- T1sFlg=0;
- //-----------------
-
- }
- }
- }
复制代码
只需要以上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)
|