📄 plot.cpp
字号:
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Plot.h"
#include <windows.h>
#include "Winio.h"
#include <Forms.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
unsigned short PORT_A = 0x378;
unsigned short PORT_B = 0x37A;
unsigned short PORT_C = 0x379;
unsigned short PORT_D = 0x37B;
//PORT_A=0x278写信号 -- 控制标记头移动
unsigned long PLOT_Y_CP = 0x01;
unsigned long PLOT_Z_DIR = 0x02;
unsigned long PLOT_Y_DIR = 0x04;
unsigned long PLOT_Z_CP = 0x08;
unsigned long PLOT_X_CP = 0x10;
unsigned long PLOT_READY = 0x20;
unsigned long PLOT_X_DIR = 0x40;
//PORT_B=0x27A写信号 -- 控制标记头打印
unsigned long PLOT_DCF = 0x01; //IsVer2=0, 0=Pendown; IsVer2=1, 1=PenDown
unsigned long PLOT_FINISH = 0x02;
//PORT_C=0x279 读信号
unsigned long PLOT_PEN_IS_DOWN = 0x04;
unsigned long PLOT_IS_STOP = 0x08;
unsigned long PLOT_X_IS_NOT_ORIGIN = 0x10;
unsigned long PLOT_Y_IS_NOT_ORIGIN = 0x20;
unsigned long PLOT_PLOT_IS_START = 0x40;
unsigned long PLOT_SWITCH_IS_UP = 0x40;
unsigned long PLOT_Z_IS_NOT_ORIGIN = 0x80;
//PORT_D = 0x27B 读信号
unsigned long PLOT_IS_VERSION2 = 0x80;
TPlot::TPlot() {
InitializeWinIo();
unsigned long value = 0;
GetPortVal(PORT_D, &value, 1);
FIsVer2 = value & PLOT_IS_VERSION2 ? 1 : 0;
PenUp();
X = 0;
Y = 0;
DelayTime = 100;
}
TPlot::~TPlot() {
ShutdownWinIo();
}
void TPlot::PenUp(void) {
unsigned long value;
value = FIsVer2 ? 0x0000 : 0x0001;
SetPortVal(PORT_D, value, 1);
}
void TPlot::PenDown(void) {
unsigned long value;
value = FIsVer2 ? 0x0001 : 0x0000;
SetPortVal(PORT_D, value, 1);
}
void TPlot::MoveTo(unsigned long x, unsigned long y) {
if (!x) {
do {
RelMove(-1, 0);
} while (IsXOrigin());
}
if (!y) {
do {
RelMove(0, -1);
} while (IsYOrigin());
}
}
void TPlot::RelMove(long dx, long dy) {
long cx = 0, cy = 0;
do {
if (abs(cy * dx) > abs(cx * dy)) {
if (dx > 0) {
MoveRight();
cx++;
}
if (dx < 0) {
MoveLeft();
cx--;
}
}
else {
if (dy > 0) {
MoveDown();
cy++;
}
if (dy < 0) {
MoveUp();
cy--;
}
}
} while ((cx == dx) && (cy ==dy));
}
bool TPlot::IsXOrigin() {
unsigned long value = 0;
GetPortVal(PORT_C, &value, 1);
value &= PLOT_X_IS_NOT_ORIGIN;
return (value == 0);
}
bool TPlot::IsYOrigin() {
unsigned long value = 0;
GetPortVal(PORT_C, &value, 1);
value &= PLOT_Y_IS_NOT_ORIGIN;
return (value == 0);
}
void TPlot::MoveLeft() {
SetPortVal(PORT_A, PLOT_X_CP, 1);
Delay();
SetPortVal(PORT_A, 0, 1);
Delay();
X--;
}
void TPlot::MoveRight() {
SetPortVal(PORT_A, PLOT_X_CP | PLOT_X_DIR, 1);
Delay();
SetPortVal(PORT_A, PLOT_X_DIR, 1);
Delay();
X++;
}
void TPlot::MoveUp() {
SetPortVal(PORT_A, PLOT_Y_CP, 1);
Delay();
SetPortVal(PORT_A, 0, 1);
Delay();
Y--;
}
void TPlot::MoveDown() {
SetPortVal(PORT_A, PLOT_Y_CP | PLOT_Y_DIR, 1);
Delay();
SetPortVal(PORT_A, PLOT_Y_DIR, 1);
Delay();
Y++;
}
void TPlot::Delay() {
TimeCount = 0;
while (TimeCount < DelayTime) {
Application->ProcessMessages();
}
}
void TPlot::Test() {
unsigned long w = 1000, h = 1000;
PenUp();
MoveTo(0, 0);
PenDown();
MoveTo(w, 0);
MoveTo(w, h);
MoveTo(0, h);
MoveTo(0, 0);
for (unsigned long i = 0; i <= w; i++) {
SetPortVal(PORT_A, PLOT_X_DIR | PLOT_X_CP | PLOT_Y_DIR | PLOT_Y_CP, 1);
Delay();
X++;
Y++;
}
PenUp();
MoveTo(w, 0);
PenDown();
for (unsigned long i = 0; i <= w; i++) {
SetPortVal(PORT_A, PLOT_X_CP | PLOT_Y_DIR | PLOT_Y_CP, 1);
Delay();
X--;
Y++;
}
PenUp();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -