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);
  }
 
}

单片机接收程序

#include <reg51.h>
#include <intrins.h>
#include <stdio.h>

#define uchar unsigned char
#define uint unsigned int

// 串口初始化
void Serial_Init()
{
    SCON = 0x50; // 8位数据,可变波特率
    TMOD |= 0x20; // 设置定时器1为8位自动重载模式
    TH1 = 0xfd; // 波特率为9600
    TL1 = 0xfd;
    TR1 = 1; // 启动定时器1
    ES = 1; // 使能串口中断
    EA = 1; // 使能总中断
}

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
    TMOD  = 0x01;    // T0 模式1
    TH0 = -4000/256; // 4ms
    TL0 = -4000%256;
    TR0 = 1;
    Serial_Init();   // 串口初始化
    while(1);   
}

// 串口中断处理函数
void Serial_ISR() interrupt 4
{
    if(RI) // 接收到数据
    {
        RI = 0;
        switch(SBUF) // 根据接收到的数据进行处理
        {
            case 0x01: Dest_Level = 1; break;
            case 0x02: Dest_Level = 2; break;
            case 0x03: Dest_Level = 3; break;
            case 0x04: Dest_Level = 4; break;
            case 0x05: Dest_Level = 5; break;
            case 0x06: Dest_Level = 6; break;
            case 0x07: Dest_Level = 7; break;
            case 0x08: Dest_Level = 8; break;
            case 0x09: Dest_Level = 9; break;
            default: break;
        }
    }
}

void Led_Dispaly() interrupt 1
{
    uchar i;
    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;
        offset = 0;
    }
}

程序说明:

  1. Processing 程序使用鼠标点击事件模拟电梯按键,并发送相应的楼层指令到串口。
  2. 单片机程序接收 Processing 发送的指令,并控制点阵屏显示相应的楼层数字。
  3. 程序中使用了 8x8 的点阵屏,每个数字对应一个 8x8 的点阵图。
  4. 点阵屏显示逻辑是通过不断循环点亮不同的点阵单元,从而实现数字的动态显示。

注意事项:

  1. 请确保 Processing 和单片机串口通信的波特率一致。
  2. 请根据实际情况修改代码中的 COM 端口号和点阵屏的连接方式。
  3. 可以根据需要修改点阵屏显示的数字,以及显示逻辑。
Processing 与单片机串口通信实现点阵屏电梯楼层显示

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

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