STC 51单片机62——极简 4x4x4光立方

server/2025/2/11 16:06:25/

本次设计一个非常简洁的光立方,省略了限流电阻,用两节1.5V干电池直接驱动。

主控芯片:STC8H1K28,属于STC中比较新的系列单片机,管脚够用,也没有很多的空余。

电源直接使用带开关的电池盒,内含2节1.5v干电池。将电池盒的引线焊接到PCB上的电源孔,增加两个滤波电容:

程序下载电路,按照datasheet设计,需要加二极管和限流电阻:

核心部分是电路板上的4x4的共阴极LED矩阵:

 

然后是每层LED的公共极,连接一个三极管:

完整原理图:

并绘制出PCB:

焊接的时候,由于不喜欢LED躺着的光立方,所以设计一个模具,能够让LED直立:

把模具排开,做成二维图,用于激光切割亚克力板:

 

 

代码就先写了个框架,凑合试试:

#include "STC8H.h"

#include "usart.h"

#define u8 unsigned char

#define u16 unsigned int

sbit Ceng1=P3^7; //公共极图层1

sbit Ceng2=P3^6; //公共极图层2

sbit Ceng3=P3^5; //公共极图层3

sbit Ceng4=P3^4; //公共极图层4

u8 Tu1[8]={0x0f,0x00,0x0f,0x00,0x0f,0x00,0x0f,0x00};//一帧图像

u8 Tu2[8]={0xf0,0x00,0xf0,0x00,0xf0,0x00,0xf0,0x00};//一帧图像

u8 Tu3[8]={0x00,0x0f,0x00,0x0f,0x00,0x0f,0x00,0x0f};//一帧图像

u8 Tu4[8]={0x00,0xf0,0x00,0xf0,0x00,0xf0,0x00,0xf0};//一帧图像

void Mydelay(u8 t)

{

  unsigned char i,j,k;

    for(i=0;i<t;i++)

        for(j=0;j<20;j++)

            for(k=0;k<250;k++)

                ;

}

void IOInit()//IO初始化

{

    P0M0 = 0x00;

    P0M1 = 0x00;

    P1M0 = 0xff;

    P1M1 = 0x00;

    P2M0 = 0xff;

    P2M1 = 0x00;

    P3M0 = 0x00;

    P3M1 = 0x00;

    P4M0 = 0x00;

    P4M1 = 0x00;

    P5M0 = 0x00;

    P5M1 = 0x00;

}   

void XuanCeng(u8 CengN) //选择哪层亮

{

  switch (CengN){

      case 1: P3=0x10; break;

        case 2: P3=0x20; break;

      case 3: P3=0x40; break;

        case 4: P3=0x80; break;   

      default: P3=0x00;

    }

    Mydelay(1); //调整延时,控制显示速度

}                   

void YiZhen(u8 Table[])//显示一帧图像

{

    P1=Table[0];

    P2=Table[1];

  XuanCeng(1);

    P1=Table[2];

    P2=Table[3];

  XuanCeng(2);

    P1=Table[4];

    P2=Table[5];

  XuanCeng(3);

    P1=Table[6];

    P2=Table[7];

  XuanCeng(4);

}

void Donghua()//动画,由多个图像帧组成

{

    u8 i;

    for(i=0;i<10;i++)

    YiZhen(Tu1);

    for(i=0;i<10;i++)

    YiZhen(Tu2);   

    for(i=0;i<10;i++)

    YiZhen(Tu3);

    for(i=0;i<10;i++)

    YiZhen(Tu4);

}

void main()//主函数

{

  unsigned int n;

    n=0;

    IOInit();

    UartInitP();//串口初始化,用于调试

    //Mydelay();

    Ceng1=0;

    Ceng2=0;   

    Ceng3=0;   

    Ceng4=0;   

   

    P1=0x01;

    P2=0x01;

    while(1){

    Donghua();

    }

}


http://www.ppmy.cn/server/166797.html

相关文章

后端开发校招面试常见问答总结(一)|Java高频考点解析

1. HashMap底层原理&#xff08;出现频率98%&#xff09; 问题&#xff1a;HashMap如何解决哈希冲突&#xff1f;JDK8做了哪些优化&#xff1f; 回答要点&#xff1a; 数组链表/红黑树结构&#xff08;JDK8后链表长度>8转红黑树&#xff09; 二次哈希计算索引&#xff1a;…

deepseek-r1(Mac版 安装教程)

文章目录 deepseek-r1安装教程&#xff08;Mac&#xff09;1. 安装ollama2. 本地下载对应的模型3. 使用3.1 终端直接使用3.2 网页使用 deepseek-r1安装教程&#xff08;Mac&#xff09; 1. 安装ollama 如果之前没有安装过ollama的&#xff0c;需要在ollama官网下载对应系统的o…

Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡

Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒&#xff0c;如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡 实战操作 去除权限 要在 Cocos2d-x 开发的游戏中去掉 APK 自带权限&#xff0c;可以按照以下步骤操作&#xff1a; 编辑 AndroidMa…

19.1.2 DML

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 DML用于操作数据&#xff0c;例如新增、删除、更新、查询等。 19.1.2.1 北风数据库的使用 打开北风数据库&#xff0c;如果由于安…

Windows系统下设置Vivado默认版本:让工程文件按需打开

在FPGA开发过程中&#xff0c;我们常常需要在一台电脑上安装多个不同版本的Vivado软件&#xff0c;以满足不同项目的需求。然而&#xff0c;当双击打开一个Vivado工程文件&#xff08;.xpr&#xff09;时&#xff0c;系统默认会调用一个固定的版本&#xff0c;这可能并不是我们…

数据结构——【二叉树模版】

#思路 1、二叉树不同于数的构建&#xff0c;在树节点类中&#xff0c;有数据&#xff0c;左子结点&#xff0c;右子节点三个属性&#xff0c;在树类的构造函数中&#xff0c;添加了变量maxNodes&#xff0c;用于后续列表索引的判断 2.GetTreeNode()函数是常用方法&#xff0c;…

WPS接入DeepSeek,实现AI辅助功能

在现代办公场景中&#xff0c;WPS Office 作为一款功能强大的办公软件&#xff0c;已经成为许多职场人士日常工作的必备工具。WPS 不仅提供了全面的文档编辑功能&#xff0c;还支持宏&#xff08;Macro&#xff09;&#xff0c;使得用户可以通过编写脚本实现文档自动化处理&…

ES6~ES11新特性全解析

在JavaScript的世界里&#xff0c;ES6 - ES11带来了许多令人兴奋的新特性&#xff0c;这些特性极大地提升了JavaScript的表达力和开发效率。今天&#xff0c;我们就来全面总结一下这些版本的新特性。 ES6 (ECMAScript 2015) 模块化&#xff1a;允许将代码分割成独立模块&#…