使用 Processing 控制 8x8 LED 点阵模拟电梯数字滚动

本示例演示了如何使用 Processing 作为上位机,通过虚拟串口控制 51 单片机,实现 8x8 LED 点阵模拟电梯数字滚动效果。用户在 Processing 画板上点击楼层,单片机接收信息并显示对应数字。

Processing 代码:

import processing.serial.*;
Serial port;

void setup(){
  port = new Serial(this, "COM3", 9600); // Arduino 板的端口号
  size(200, 500);
  textSize(150);
}

void draw(){
  background(225);
  
  String floors = 'F9 F8 F7 F6 F5 F4 F3 F2 F1';
  textSize(24);
  fill(255, 0, 0);
  textLeading(50);
  text(floors, 20, 25, 40, 500);
  
  fill(100);
  rect(50, 0, 100, 50);
  
  fill(100);
  rect(50, 50, 100, 50);
  
  fill(100);
  rect(50, 100, 100, 50);  
  
  fill(100);
  rect(50, 150, 100, 50);
  
  fill(100);
  rect(50, 200, 100, 50);
  
  fill(100);
  rect(50, 250, 100, 50);
  
  fill(100);
  rect(50, 300, 100, 50);
  
  fill(100);
  rect(50, 350, 100, 50);
  
  fill(100);
  rect(50, 400, 100, 50);
}

void mouseClicked(){
  if((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 0) & (mouseY <= 50))
  {
    println('9floor');
    port.write(0x09);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 50) & (mouseY <= 100))
  {
    println('8floor');
    port.write(0x08);
  }
  else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 100) & (mouseY <= 150))
  {
    println('7floor');
    port.write(0x07);
  }
   else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 150) & (mouseY <= 200))
  {
    println('6floor');
    port.write(0x06);
  }
   else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 200) & (mouseY <= 250))
  {
    println('5floor');
    port.write(0x05);
  }
   else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 250) & (mouseY <= 300))
  {
    println('4floor');
    port.write(0x04);
  }
   else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 300) & (mouseY <= 350))
  {
    println('3floor');
    port.write(0x03);
  }
   else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 350) & (mouseY <= 400))
  {
    println('2floor');
    port.write(0x02);
  }
   else if ((mouseX >= 50) & (mouseX <= 150) & (mouseY >= 400) & (mouseY <= 450))
  {
    println('1floor');
    port.write(0x01);
  }
 }

51 单片机代码:

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Table[]= 
{
    0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,//0
    0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,//1
    0x00,0x7E,0x02,0x02,0x7E,0x40,0x40,0x7E,//2
    0x00,0x7E,0x02,0x02,0x7E,0x02,0x02,0x7E,//3
    0x00,0x48,0x48,0x48,0x7E,0x08,0x08,0x08,//4
    0x00,0x7E,0x40,0x40,0x7E,0x02,0x02,0x7E,//5
    0x00,0x7C,0x40,0x40,0x7C,0x44,0x44,0x7C,//6
    0x00,0x7C,0x04,0x04,0x04,0x04,0x04,0x04,//7
    0x00,0x7C,0x44,0x44,0x7C,0x44,0x44,0x7C,//8
    0x00,0x7E,0x42,0x42,0x7E,0x02,0x02,0x7E,//9
    
};
uint r = 0;
char offset = 0;
uchar Current_Level = 1, Dest_Level = 1, x = 0, t = 0;

void main()
{
    Current_Level = 1;//初始为1层
    P0 = ~Table[0]; //点阵屏初始显示数字1
    TMOD  = 0x01;   //T0模式1
    TH0 = -4000/256;//4ms
    TL0 = -4000%256;
    TR0=1;
    IE = 0x82;
    EA =1;
    while(1);   
}

void Led_Dispaly() interrupt 1
{
    uchar i;
    //接收processing发送的信息
    if (RI == 1)
    {
        RI = 0;
        if (SBUF == 0x09) Dest_Level = 9;
        else if (SBUF == 0x08) Dest_Level = 8;
        else if (SBUF == 0x07) Dest_Level = 7;
        else if (SBUF == 0x06) Dest_Level = 6;
        else if (SBUF == 0x05) Dest_Level = 5;
        else if (SBUF == 0x04) Dest_Level = 4;
        else if (SBUF == 0x03) Dest_Level = 3;
        else if (SBUF == 0x02) Dest_Level = 2;
        else if (SBUF == 0x01) Dest_Level = 1;
    }
    TH0 = -4000/256;//4ms
    TL0 = -4000%256;
    i = Current_Level * 8 + r + offset;
    P0 = ~Table[i];
    
    //电梯上升
    if (Current_Level < Dest_Level )
    {
        if ( ++r == 8)
        {
            r = 0;
            if( ++x == 4)
            {
                x = 0;
                if(++offset == 8)
                {
                    offset = 0;
                    Current_Level++;                
                }
                
            }
        }
        
    }
    //电梯下降
    else if(Current_Level > Dest_Level )
    {
        if ( ++r == 8)
        {
            r = 0;
            if( ++x == 4)
            {
                x = 0;
                if(--offset == -8)
                {
                    offset = 0;
                    Current_Level--;                
                }
                
            }
        }
        
    }
    //电梯停止
    else
    {
        if ( ++r == 8) r = 0;     
    }
}

使用方法:

  1. 将 Processing 代码中的 "COM3" 替换为你的 Arduino 板的实际端口号。
  2. 编译并运行 Processing 代码。
  3. 点击 Processing 画板上的任意楼层,单片机将会控制 8x8 LED 点阵显示对应数字,并模拟电梯滚动效果。

注意:

  • 该示例假设你已经连接了 51 单片机和 8x8 LED 点阵,并设置了必要的硬件连接。
  • 你需要安装 Processing 软件,并确保你已经安装了 Processing Serial 库。
  • 确保 Processing 和 51 单片机的串口通讯速率一致。
  • 51 单片机代码中的 Table 数组存储了 8x8 LED 点阵显示数字的代码,你可以根据需要修改。
  • 该示例只演示了基本的电梯模拟功能,你可以根据需要进行扩展和改进。

扩展和改进:

  • 添加开门、关门等其他电梯功能。
  • 使用更复杂的点阵动画,模拟更逼真的电梯效果。
  • 使用多层点阵,模拟更高的楼层。
  • 使用网络连接,实现远程控制电梯。

希望该示例能帮助你学习使用 Processing 和 51 单片机控制 8x8 LED 点阵,并实现简单的电梯模拟效果。

Processing 控制 8x8 LED 点阵模拟电梯数字滚动

原文地址: https://www.cveoy.top/t/topic/k45l 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录