名称:8×8LED点阵屏仿电梯数字滚动显示说明:本例模拟了电梯显示屏上下滚动显示楼层的效果当目标楼层大于当前楼层时将向上滚动显示反之则向下滚动显示。#include reg51h#include intrinsh#define uchar unsigned char#define uint unsigned intuchar code Table= 0x3C0x420x420x420x420x42
由于Processing和51单片机的编程语言不同,需要进行重写。以下是一个基于Processing的九层楼房图画并标注楼层的代码,点击相应的楼层按钮,会向串口发送相应的数字,单片机会接收到数字并开始滚动显示到相应的数字。
import processing.serial.*;
Serial myPort; //创建串口对象
int level = 1; //当前楼层
int destLevel = 1; //目标楼层
void setup() {
size(400, 400);
background(255);
textAlign(CENTER, CENTER);
//打开串口
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
}
void draw() {
background(255);
//绘制楼房
for (int i = 0; i < 9; i++) {
fill(200);
rect(100, 360 - i * 30, 200, 30);
fill(0);
textSize(20);
text(i + 1, 200, 375 - i * 30);
}
//绘制当前楼层
fill(0, 255, 0);
rect(150, 360 - (level - 1) * 30, 100, 30);
}
void mousePressed() {
//检测点击的楼层
if (mouseY >= 60 && mouseY <= 390) {
int clickedLevel = 10 - (mouseY - 60) / 30;
if (clickedLevel != level) {
destLevel = clickedLevel;
myPort.write(destLevel);
}
}
}
以下是相应的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 currentLevel = 1, destLevel = 1, x = 0, t = 0;
void main() {
P3 = 0x80;
currentLevel = 1;
TMOD = 0x01; //T0工作方式
TH0 = -4000 / 256; //4ms//每个数字有8字节
TL0 = -4000 % 256;
TR0 = 1;
IE = 0x92; //开启串口中断
EA = 1;
while (1);
}
void Led_Dispaly() interrupt 1 {
uchar i;
TH0 = -4000 / 256; //4ms
TL0 = -4000 % 256;
P3 = _crol_(P3, 1);
i = currentLevel * 8 + r + offset;
P0 = ~Table[i];
//上升显示
if (currentLevel < destLevel) {
if (++r == 8) { //每个数字有8字节
r = 0;
if (++x == 4) { //每完成x次刷新后后偏
x = 0;
if (++offset == 8) {
offset = 0;
currentLevel++;
}
}
}
}
//下降显示
else if (currentLevel > destLevel) {
if (++r == 8) { //每个数字有8字节
r = 0;
if (++x == 4) { //每完成x次刷新后前偏
x = 0;
if (--offset == -8) {
offset = 0;
currentLevel--;
}
}
}
}
//停止滚动,保持稳定的刷新显示
else {
if (++r == 8) r = 0;
}
}
void UART() interrupt 4 {
if (RI) {
destLevel = SBUF;
RI = 0;
}
}
``
原文地址: https://www.cveoy.top/t/topic/dHID 著作权归作者所有。请勿转载和采集!