📄 main.cpp
字号:
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
// 包含头文件
//---------------------------------------------------------------------------
#include <stdio.h> // 标准输入输出
#include "winio.h" // 直接IO
#include "main.h" // 主函数
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
TFmMain *FmMain;
//---------------------------------------------------------------------------
// 构造函数
//---------------------------------------------------------------------------
__fastcall TFmMain::TFmMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// 处理窗口建立事件
//---------------------------------------------------------------------------
void __fastcall TFmMain::FormCreate(TObject *Sender)
{
succ=InitializeWinIo(); // 初始化直接IO操作
succ=GetPortVal(ECR,&PtVal,1); // 读取ECR寄存器
OLDECR=PtVal; // 保存原模式
succ=SetPortVal(ECR,0x95,1); // 进入EPP模式(0x95)
succ=SetPortVal(CTL,0xE4,1); // 允许EPP读(IZ)
succ=GetPortVal(EPD,&PtVal,1); // 预读数据
}
//---------------------------------------------------------------------------
// 处理窗口撤销事件
//---------------------------------------------------------------------------
void __fastcall TFmMain::FormDestroy(TObject *Sender)
{
succ=SetPortVal(ECR,OLDECR,1); // 恢复原模式
ShutdownWinIo(); // 结束直接IO操作
}
//---------------------------------------------------------------------------
// 转换到SPP模式
//---------------------------------------------------------------------------
void __fastcall TFmMain::R1Click(TObject *Sender)
{
succ=SetPortVal(ECR,0x15,1); // 转换到SPP模式
}
//---------------------------------------------------------------------------
// 发送数据
//---------------------------------------------------------------------------
void __fastcall TFmMain::T1Click(TObject *Sender)
{
UCHAR value;
strcpy(buff,EdData->Text.c_str());
sscanf(buff,"%X",&value);
value=0x00;
// succ=SetPortVal(CTL,0xEF,1); // EPP输出
// Sleep(1);
succ=SetPortVal(CTL,0xE4,1); // EPP输出
succ=SetPortVal(EPD,value,1); // 写数据
// succ=SetPortVal(CTL,0xE6,1); // EPP输入
}
//---------------------------------------------------------------------------
// 读取数据
//---------------------------------------------------------------------------
void __fastcall TFmMain::BtDatRClick(TObject *Sender)
{
succ=SetPortVal(CTL,0xE7,1); // EPP输出
/*
succ=GetPortVal(EPD,&PtVal,1); // 读数据
sprintf(buff,"%02X",(UCHAR)PtVal);
EdData->Text=buff;
*/
}
//---------------------------------------------------------------------------
// 发送地址
//---------------------------------------------------------------------------
void __fastcall TFmMain::BtAddWClick(TObject *Sender)
{
UCHAR value;
strcpy(buff,EdData->Text.c_str());
sscanf(buff,"%X",&value);
succ=SetPortVal(CTL,0xE5,1); // EPP输出
succ=SetPortVal(EPA,value,1); // 写地址
succ=SetPortVal(CTL,0xE4,1); // EPP输入
}
//---------------------------------------------------------------------------
// 读取状态
//---------------------------------------------------------------------------
void __fastcall TFmMain::BtStatClick(TObject *Sender)
{
GetPortVal(STA,&PtVal,1);
sprintf(buff,"%02X",(UCHAR)PtVal);
EdData->Text=buff;
}
//---------------------------------------------------------------------------
// 清除ListBox内容
//---------------------------------------------------------------------------
void __fastcall TFmMain::BitBtn6Click(TObject *Sender)
{
LBMain->Items->Clear();
}
//---------------------------------------------------------------------------
// 发送命令并接收数据
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 向HPI写入4个字节(高字节在前)
//---------------------------------------------------------------------------
void TFmMain::Put4B(UINT val)
{
succ=SetPortVal(EPD,val>>24,1); // 写HPIC_3
succ=SetPortVal(EPD,val>>16,1); // 写HPIC_2
succ=SetPortVal(EPD,val>> 8,1); // 写HPIC_1
succ=SetPortVal(EPD,val ,1); // 写HPIC_0
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void TFmMain::WaitReady()
{
int i;
ULONG Curr,Prev;
GetPortVal(STA,&Prev,1);
for(i=0;i<0x07FFFFFF;i++){
GetPortVal(STA,&Curr,1);
if((Curr&0x40)==(Prev&0x40)) break;
Prev=Curr;
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void TFmMain::Fill()
{
int i;
succ=SetPortVal(CTL,0xE4,1); // 允许EPP读(IZ)
for(i=0;i<8;i++)
{
succ=SetPortVal(EPA,0x00,1); // 写地址(计数器复位)
Put4B(0x00080008); // 写HPIC
Put4B(0xFFFFFFFC); // 写HPIA
Put4B(0xFFFFFFFF); // 写HPID
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
static DWORD EAD[]=
{
0x90001554,0x000000AA,
0x90000AA8,0x00000055,
0x90001554,0x00000080,
0x90001554,0x000000AA,
0x90000AA8,0x00000055,
0x90001554,0x00000010
};
void TFmMain::EraseAll()
{
int i;
succ=SetPortVal(CTL,0xE4,1); // 允许EPP读(IZ)
for(i=0;i<6;i++)
{
succ=SetPortVal(EPA,0x00,1); // 写地址(计数器复位)
Put4B(0x00080008); // 写HPIC
Put4B(EAD[i*2+0]); // 写HPIA
Put4B(EAD[i*2+1]); // 写HPID
}
Fill();
WaitReady();
}
//---------------------------------------------------------------------------
// 擦除一个扇区
//---------------------------------------------------------------------------
static DWORD ESD[]=
{
0x90001554,0x000000AA,
0x90000AA8,0x00000055,
0x90001554,0x00000080,
0x90001554,0x000000AA,
0x90000AA8,0x00000055,
0x90000000,0x00000020
};
void TFmMain::EraseOneSector(UINT Sec)
{
int i;
succ=SetPortVal(CTL,0xE4,1); // 允许EPP读(IZ)
for(i=0;i<5;i++)
{
succ=SetPortVal(EPA,0x00,1); // 写地址(计数器复位) // 写HPIC
Put4B(0x00080008); // 写HPIA
Put4B(ESD[i*2+0]); // 写HPID
Put4B(ESD[i*2+1]);
}
succ=SetPortVal(EPA,0x00,1); // 写地址(计数器复位) // 写HPIC
Put4B(0x00080008); // 写HPIA
Put4B(Sec); // 写HPID
Put4B(ESD[i*2+1]);
Fill();
WaitReady();
}
//---------------------------------------------------------------------------
// 向FLASH写一个字节
//---------------------------------------------------------------------------
static DWORD PBD[]=
{
0x90001554,0x000000AA,
0x90000AA8,0x00000055,
0x90001554,0x000000A0
};
void TFmMain::PutByte(UINT addr,UCHAR data)
{
int i;
SetPortVal(CTL,0xE4,1); // 允许EPP读(IZ)
for(i=0;i<3;i++)
{
SetPortVal(EPA,0x00,1); // 写地址(计数器复位)
Put4B(0x00080008);
Put4B(PBD[i*2+0]);
Put4B(PBD[i*2+1]);
}
SetPortVal(EPA,0x00,1); // 写地址(计数器复位)
Put4B(0x00080008);
Put4B(addr);
Put4B((UINT)data);
Fill();
WaitReady();
}
//---------------------------------------------------------------------------
void __fastcall TFmMain::SpeedButton1Click(TObject *Sender)
{
char buf[256];
succ=GetPortVal(ECR,&PtVal,1); // 读取ECR寄存器
PtVal=PtVal&0xFF;
wsprintf(buf,"%02X",(UCHAR)PtVal);
EdDat->Text=buf;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TFmMain::BitBtn5Click(TObject *Sender)
{
EraseAll();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TFmMain::ByteProgrameClick(TObject *Sender)
{
int i;
for(i=0;i<128;i++){
PutByte(0x90000000+i*4,i);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TFmMain::SectorEraseClick(TObject *Sender)
{
EraseOneSector(0x90000000+0);
}
//---------------------------------------------------------------------------
// 程序结束
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -