📄 unit4.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 + -