⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit4.cpp

📁 ISP 并口下载工具
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit4.h"
#include "WinIO.h"
//#define PBA 0x378
//---------------------------------------------------------------------------
unsigned char  inportb(unsigned short p)
{
  unsigned char redata;
  unsigned long v = 0;
  GetPortVal((unsigned short)p, &v, 1);
  redata=(unsigned char)v;
  return redata;
 }
//----------------------------------------------------------------------
void outportb(unsigned short p, unsigned char  v)
{
 SetPortVal((unsigned short)p,(unsigned long)v,1);
 }
//=======================================================================
void delayus(__int64 Us)
{
    LARGE_INTEGER CurrTicks, TicksCount;

    QueryPerformanceFrequency(&TicksCount);
    QueryPerformanceCounter(&CurrTicks);

    TicksCount.QuadPart =(TicksCount.QuadPart * Us)/1000000i64;
    TicksCount.QuadPart += CurrTicks.QuadPart;

    while(CurrTicks.QuadPart<TicksCount.QuadPart)
        QueryPerformanceCounter(&CurrTicks);
}
//======================================================
//使用并行口的数据输出口(0x378)的D3位(对应引脚是:Pin5)作为SCK,
void setsck(void)
{
 unsigned char data;
 data=inportb(0x378);
 data=data | 0x08;
 outportb(0x378,data);
}
//-------------------------------------------
void clrsck(void)
{
 unsigned char data;
 data=inportb(0x378);
 data=data & 0xf7;
 outportb(0x378,data);
}
//--------------------------------------------
//使用并行口的控制输出口(0x37a)的D2位(对应引脚是:Pin16)作为RST,
void setreset(void)
{
 unsigned char ctrl;
 ctrl=inportb(0x37a);
 ctrl=ctrl | 0x04;
 outportb(0x37a,ctrl);
 unlock();
 ctrl=inportb(0x37a);
 delayus(2);
 lock();
 delayus(500000);

}
//--------------------------------------------
void clrreset(void)
{
 unsigned char ctrl;
 ctrl=inportb(0x37a);
 ctrl=ctrl & 0xfb;
 outportb(0x37a,ctrl);
 unlock();
 delayus(2);
 lock();
 delayus(500000);
}
//--------------------------------------------
//使用并行口的控制输出口(0x37a)的D0位(对应引脚是:Pin1)作为/OE,
void enableoutput(void)
{
 unsigned char ctrl;
 ctrl=inportb(0x37a);
 ctrl=ctrl | 0x01; //由于/STB的反相关系。使得/STB输出‘0’
 outportb(0x37a,ctrl);
}
//--------------------------------------------
void disableoutput(void)
{
 unsigned char ctrl;
 ctrl=inportb(0x37a);
 ctrl=ctrl & 0xfe; //由于/STB的反相关系。使得/STB输出‘1’
 outportb(0x37a,ctrl);
}
//--------------------------------------------
//使用并行口的控制输出口(0x37a)的D3位(对应引脚是:Pin17)作为LE,
void lock(void)
{
 unsigned char ctrl;
 ctrl=inportb(0x37a);
 ctrl=ctrl | 0x08; //由于/SIN的反相关系。使得/SIN输出‘0’
 outportb(0x37a,ctrl);
}
//-------------------------------------------
void unlock(void)
{
 unsigned char ctrl;
 ctrl=inportb(0x37a);
 ctrl=ctrl & 0xf7; //由于/SIN的反相关系。使得/SIN输出‘1’
 outportb(0x37a,ctrl);
}
//-----------------------------------------
//使用并行口的数据输出口(0x378)的D0位(对应引脚是:Pin2)作为MOSI,
void sendbit(unsigned char bit)
{
  unsigned char data;
  data=inportb(0x378);
  if(bit!=0)
   data=data | 0x01;
  else
   data=data & 0xfe;
  outportb(0x378,data); 
}
//----------------------------------------------------------------
//使用并行口的状态输入口(0x379)的D3位(对应引脚是:Pin15)作为MISO,
unsigned char getbit(void)
{
  unsigned char bit;
  unsigned char state;
  state=inportb(0x379);
  state=state & 0x08;
  if(state!=0)
     bit=1;
  else
     bit=0;
  return bit;      
}
//=====================================
unsigned char outinbyte(unsigned char data)
{
//并行口的数据寄存器(0X378)的D0是输出数据(MOSI)
//并行口的状态寄存器(0x378+1)的D3位是输入数据(MISO)
 unsigned char out[8];
 unsigned char in[8];
 unsigned char temp; 
//处理输出数据和时钟
//>>>>>>>>>>>>>>>>>>>>>>>>>
  out[0]=data & 0x80;
  out[1]=data & 0x40;
  out[2]=data & 0x20;
  out[3]=data & 0x10;
  out[4]=data & 0x8;
  out[5]=data & 0x4;
  out[6]=data & 0x2;
  out[7]=data & 0x1;
//>>>>>>>>>>>>>>>>>>>>>>>
//输出数据(MOSI)和时钟(SCK)同时在SCK=1时候读入数据(MISO)
 unsigned char i;
 for(temp=0;temp<8;temp++)
  {

    clrsck();
    delayus(3);
    unlock();
    delayus(1);
    lock();

    sendbit(out[temp]);
    delayus(3);
    unlock();
    delayus(1);
    lock();

    setsck();
    delayus(3);
    unlock();
    delayus(1);    
    in[temp]=getbit(); //读入数据
    lock();
  }
//处理输入数据
 unsigned char redata;
 redata=0;
 if(in[0]!=0)
   redata=redata+0x80;
 if(in[1]!=0)
   redata=redata+0x40;
 if(in[2]!=0)
   redata=redata+0x20;
 if(in[3]!=0)
   redata=redata+0x10;
 if(in[4]!=0)
   redata=redata+0x08;
 if(in[5]!=0)
   redata=redata+0x04;
 if(in[6]!=0)
   redata=redata+0x02;
 if(in[7]!=0)
   redata=redata+0x01;
 return redata;
}

//=================================================================
#pragma package(smart_init)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -