光立方的设计有很多不同思路,在此讲述一下我的光立方程序设计思路
对象:一个8x8x8的光立方
光立方实体图片:

底层由64个发光二极管排列成8x8方阵,总共8层,每一层所有发光二极管的阴极连在一起引出,每竖条的发光二极管阳极依次焊接在一起,显示原理类似数码管的动态扫描!

程序中构造一个空间立方体,每个发光二极管都可看做是空间中的一个坐标点。就以一个数组表示,该数组为全局变量,如下:

该光立方数组管理512个LED,共64字节大小,512位,每一位代表一个LED,当相应二进制位为1时代表LED亮,为0时代表相应LED灭。建立此光立方数组后很容易想到只要单独写一个处理器中断中或者操作系统线程,其中按一定频率将该数组数据动态扫描到实体上(这部分涉及到I/O口的操作,不同的处理器这部分操作不同),而其他处理图形或数字的函数放在其他线程中即可(这部分函数完全脱离硬件),这样硬件扫描部分和软件控制部分完全分离互不干扰,思路清晰,也利于后面程序扩展。
在ucos-ii中单独创建一个线程执行扫描函数:

OSTaskCreate(Display,NULL,(OS_STK *)&DisplayStk[TASK_STK_SIZE-1],(INT8U)5);void Display(void *p_arg)
{p_arg = p_arg;while(1){DisplayPix();OSTimeDlyHMSM(0,0,0,4);//根据实际效果调节延时时间}
}

DisplayPix()函数需要根据实际I/O口编写,作用是将光立方数组里的数据扫描到实体上。为了保证在处理底层I/O时不被其他线程干扰,我将该线程优先级提到最高,这样也能保证扫描效果的流畅性。如果你要保证其他任务的实时性,将该线程的优先级调低也可,但是此处就要编写不可重入代码或者加互斥锁。

接下来考虑软件部分,有两个函数必须实现,这两个函数是以后扩展其它函数的基础。写好这两个函数后,加入一些必要的算法可以让光立方充满生命,如果要显示字母或图形可以用取模软件生成对应字母的字模数组,以备显示。
1.设置空间坐标点LED的亮灭状态SetPix函数

/**************
函数:SetPix
参数:(x,y,z)待动作的LED,color,1-点亮,0-熄灭,其他值-无操作
说明:开关空间坐标点LED
****************/
void SetPix(INT8S x,INT8S y,INT8S z,INT8S color)
{INT8S Pix;Pix = z*8 + y;   switch(color){case 0:LED8x8x8[Pix] &= ~(1<<x);  //熄灭位置灯break;case 1:LED8x8x8[Pix] |= 1<<x;    //点亮位置灯break;default://其他值,保持该点LED状态,无操作break;     }
}  

2.读取空间坐标点的亮灭状态GetPix函数

/**************
函数:GetPix
参数:(x,y,z)待动作的LED
输出:LED状态
说明:读取对应坐标点LED的状态
****************/
INT8S GetPix(INT8S x,INT8S y,INT8S z)
{INT8S Pix;Pix = LED8x8x8[z*8+y];Pix &= 1<<x;if(Pix==0)return 0;elsereturn 1;
}

以上函数并没有对参数范围进行检查,不算严格,实际需小心谨慎,确保传入的参数范围在实际范围内,或者最好在函数中对参数进行检查。

最容易扩展的光立方程序设计相关推荐

  1. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(2) - SSE程序设计环境概述

    SSE Programming Environment 下图是IA-32处理器上的SSE程序设计环境,所有的SSE指令操作XMM寄存器,MMX寄存器,和/或存储器. XMM寄存器,8个,128位宽,存 ...

  2. c语言中注释参与程序设计的编译吗,C语言程序设计(第4章函数)6

    4.7 C语言的预处理程序与注释 C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开 ...

  3. c/c++标准预定义宏

    转自:http://www.eefocus.com/andysun001/blog/10-06/192018_008b3.html 一.标准预定义宏 The standard predefined m ...

  4. 人人都会Vue,你的优势在哪里?

    Vue,React这样的框架可以说是现在前端的必备技能,一个刚入门两三个月的前端都是要会Vue的. 但是大家有没有想过一个问题?Vue,React这样的框架已经是基本功,我们凭什么敢说比别人厉害呢? ...

  5. C语言中的预处理详解

    目录 一.预处理的工作方式... 3 1.1.预处理的功能... 3 1.2预处理的工作方式... 3 二.预处理指令... 4 2.1.预处理指令... 4 2.2.指令规则... 4 三.宏定义命 ...

  6. 单片机c语言编程教学大纲,《单片机C语言编程》教学大纲

    <单片机C语言编程>教学大纲 课程代码:000002336 课程英文名称:Microcontroller C Programming Language 课程总学时:24 讲课:16 实验: ...

  7. 什么是 jQuery 事件

    jQuery事件是DOM事件的封装,同时支持自定义的扩展.在程序设计中,事件和代理有着相似的作用: 它们提供了一种机制,使得行为的实现方式和调用时机可以分离. 不谈jQuery,DOM本身就提供了一系 ...

  8. c语言里有js的预编译环节吗,C语言第十一讲,预处理命令.

    C语言第十一讲,预处理命令. 一丶预处理简介 什么是预处理,预处理就是预先处理. 我们知道,程序会经过编译,连接形成可执行文件 这些在编译之前对源文件进行简单加工的过程,就称为预处理(即预先处理.提前 ...

  9. 软件工程学习笔记(考试版)

    软 件 工 程 笔 记 第一章 ² 一个软件产品必须由一个完整的配置组成,软件配置主要包括:程序,数据及相关文档.程序是能够完成预定功能和性能的可执行的指令序列:数据是使程序能够适当的处理信息的数据结 ...

  10. (软件工程复习核心重点)第十章面向对象设计-第五节:设计数据管理子系统和设计类中的服务

    文章目录 一:设计数据管理子系统 (1)概念 (2)选择数据存储管理模式 A:文件管理系统 B:关系数据库管理系统 C:面向对象数据库管理系统 (3)设计数据管理子系统 A:设计数据格式 B:设计相应 ...

最新文章

  1. 美团多渠道打包方案详解,速度快到白驹过隙
  2. (volatile int)(x)与*(volatile int *)(x)
  3. 《计算机科学概论》—第2章2.2节位置记数法
  4. oracle用户相关操作
  5. springMVC 格式转换
  6. 题解报告:hdu1205吃糖果(插空法)
  7. 机器学习经典书籍论文
  8. 中国无线充电行业发展规模与投资可行性咨询报告2022-2027年版
  9. ios12怎么滑屏解锁_iOS12.2 越狱来袭,又是一波秀
  10. python技巧积累
  11. jQuery实现轮播图(fadeIn,siblings,fadeOut方法实现)
  12. 删除后别人的微信号变成wxid_“重新做人”?安卓版微信支持修改微信号,网友:哭了...
  13. 计算机cpu风扇不转怎么办,计算机CPU风扇不转怎么办
  14. python正态分布拟合曲线怎么打印出中位数值,如何用对数正态分布函数拟合数据...
  15. Android Framework 框架系列之PowerManager
  16. 谈谈privoxy:关于广告过滤和自动代理切换
  17. PS mac版的下载地址,百度软件中心
  18. 软件需求管理(二) 需求获取
  19. 修饰符*和&应该靠近数据类型还是该靠近变量名
  20. DB2自定义数据库方言

热门文章

  1. UI自动化,元素被遮挡
  2. idea黑暗护眼主题
  3. 如何安装仿宋GB2312字体
  4. Java开发微信公众号
  5. OneNote插件Notehighlight个性化设置
  6. MAC使用RZ SZ指令实现本地与远程服务器之间文件上传与下载
  7. 华为ensp模拟器 三层交换机
  8. excel转json脚本
  9. 《Nature-Inspired Metaheuristic Algorithms》——蝙蝠算法 Bat Algorithm
  10. emc测试e3软件系数导入,EMC测试标准