Processing 控制 51 单片机 8x8 LED 点阵模拟电梯数字滚动
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(){
P3 = 0x80;
Current_Level = 1; //从1开始显示
TMOD = 0x01; //T0工作方式
TH0 = -4000 / 256; //4ms //每个数字有8字节
TL0 = -4000 % 256;
TR0 = 1;
IE = 0x82;
EA = 1;
while(1);
}
void Led_Dispaly() interrupt 1
{
uchar i;
// 接收 Processing 发送的楼层信息
if (RI) {
RI = 0;
switch (SBUF) {
case 0x09: Dest_Level = 9; break;
case 0x08: Dest_Level = 8; break;
case 0x07: Dest_Level = 7; break;
case 0x06: Dest_Level = 6; break;
case 0x05: Dest_Level = 5; break;
case 0x04: Dest_Level = 4; break;
case 0x03: Dest_Level = 3; break;
case 0x02: Dest_Level = 2; break;
case 0x01: Dest_Level = 1; break;
}
}
TH0 = -4000 / 256; //4ms
TL0 = -4000 % 256;
P3 = _crol_(P3, 1);
i = Current_Level * 8 + r + offset;
P0 = ~Table[i];
//上升显示
if (Current_Level < Dest_Level )
{
if ( ++r == 8)
{
//每个数字有8字节
r = 0;
if( ++x == 4)
{
//每完成x次刷新后后偏
x = 0;
if(++offset == 8)
{
offset = 0;
Current_Level++;
}
}
}
}
//下降显示
else if(Current_Level > Dest_Level )
{
if ( ++r == 8)
{
//每个数字有8字节
r = 0;
if( ++x == 4)
{
//每完成x次刷新后前偏
x = 0;
if(--offset == -8)
{
offset = 0;
Current_Level--;
}
}
}
}
//停止滚动,保持稳定的刷新显示
else
{
if ( ++r == 8) r = 0;
}
}
代码说明:
- Processing 代码:
- 界面绘制了九层楼,并在每个楼层区域添加了点击事件。
- 点击对应楼层时,发送相应的楼层数字(1-9)到单片机。
- 51 单片机代码:
- 使用串口接收来自 Processing 发送的楼层数字。
- 根据接收到的楼层数字,更新目标楼层
Dest_Level。 - 通过定时器中断,控制 LED 点阵滚动显示。
- 实现了向上滚动(Current_Level < Dest_Level)、向下滚动(Current_Level > Dest_Level)和停止滚动(Current_Level == Dest_Level)三种状态。
运行步骤:
- 将 Processing 代码和 51 单片机代码分别上传到各自的开发环境。
- 使用虚拟串口配对软件将 Processing 和单片机串口连接起来。
- 运行 Processing 代码,点击界面上的楼层,即可观察单片机上的 LED 点阵模拟电梯数字滚动。
注意:
- 确保 Processing 代码中
COM3端口号与实际连接的串口端口号一致。 - 确保 51 单片机代码中的串口配置(波特率、中断等)与 Processing 代码中设置一致。
- 为了更平滑的滚动效果,可以调整定时器中断时间和
x值。 - 本代码仅供参考,可以根据实际情况进行修改和优化。
原文地址: https://www.cveoy.top/t/topic/k435 著作权归作者所有。请勿转载和采集!