8x8 LED点阵屏仿真电梯数字滚动显示 - 使用Processing控制
//8*8led点阵屏仿真电梯数字滚动显示 //processing作为上位机模拟楼层 //点击processing上相对应的楼层,点阵屏上的数字产生相应的滚动 //接收程序 #include <reg51.h>//包含头文件reg51.h #include <intrins.h> #define uchar unsigned char #define uint unsigned int
uchar code Table[]= //0~9的取模 { 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, val = 0;
void main() { Current_Level = 1; //从1开始显示
TMOD = 0x20; //TMOD=0010 0000B,定时器1工作方式为方式2
SCON = 0x50;
PCON = 0x00; //PCON中的SMOD=0
TH1 = 0xFD;
TL1 = 0xFD; //波特率为9600b/s
TR1 = 1; //启动T1,波特率发生器工作
while (1)
{
while (RI == 0); //查询是否接受到单片机甲的数据
RI = 0; //接受完毕一个字符,清零接受中断标志位
val = SBUF; //接受缓冲器的字符,即单片机甲的开关状态
P1 = val;
if (val >= 1 && val <= 9) {
Dest_Level = Table[val - 1]; //目的的操作数为1~9
}
}
}
void Led_Dispaly() { uchar i; i = Current_Level * 8 + r + offset; P0 = ~Table[i];
//上升显示
if (Current_Level < Dest_Level)
{
if (++r == 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)
{//每个数字有八个字节
r = 0;
if (++x == 4)
{//完成x次刷新后前偏
x = 0;
if (--offset == -8)
{
offset = 0;
Current_Level--;
}
}
}
}
//停止滚动,保持稳定的刷新显示
else
{
if (++r == 8) r = 0;
}
}
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); }
原文地址: https://www.cveoy.top/t/topic/nJRI 著作权归作者所有。请勿转载和采集!