📄 main.bak
字号:
/**********************************************
USB固件编程
File Name: main.c
Final Date: 2004-07-10
Author: LHP
Note: 问题已经基本解决
***********************************************/
#include <reg51.h>
#include "D12ci.h"
#include "chap_9.h"
#include <intrins.h>
sbit D12CS=P3^1;
sbit TXR=P3^3;
sbit DR1=P3^4;
sbit DR2=P3^5;
/*第一板
sbit OE1=P1^7;
sbit OE2=P1^6;
sbit SEL=P1^5;
sbit MR=P1^4;
sbit LDCW=P1^3;
sbit ENTX=P1^2;
sbit LD1=P1^1;
sbit LD2=P1^0;
*/
//第二板
sbit OE2=P1^7;
sbit OE1=P1^6;
sbit SEL=P1^5;
sbit LD1=P1^4;
sbit LD2=P1^3;
sbit ENTX=P1^2;
sbit LDCW=P1^1;
sbit MR=P1^0;
extern unsigned char idata OutBuf[EP1_PACKET_SIZE];//用于PC机向3282传输要发送的数据
extern unsigned char idata ControlWord[2]; //用于PC机向3282发送控制字
unsigned char idata InBuf1[EP1_PACKET_SIZE]; //用于3282通道1向pc机发送数据
unsigned char idata InBuf2[EP2_PACKET_SIZE]; //用于3282通道2向PC机发送数据
extern EPPFLAGS bEPPflags;
extern CONTROL_XFER ControlData;
void reconnect_usb(void);
void disconnect_usb(void);
void connect_usb(void);
void setup_handler(void);
//void mytxr(void);
extern void myisr(void);
//重新连接到USB总线
void reconnect_usb(void)
{
unsigned long clk_cnt;
disconnect_usb();//断开usb连接
for(clk_cnt=0;clk_cnt<50000;clk_cnt++);//延时
connect_usb();//连接到USB
}
//断开USB总线
void disconnect_usb(void)
{
//初始化D12工作状态,断开soft connect连接
D12_SetMode(D12_NOLAZYCLOCK,D12_SETTOONE|D12_CLOCK_6M);
}
//连接USB总线
void connect_usb(void)
{
DISABLE;
bEPPflags.value=0;//清标志
ENABLE;
//初始化D12工作状态,接通soft connect
D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT,D12_SETTOONE|D12_CLOCK_6M);
}
void usb_isr(void) interrupt 0
{
DISABLE;
myisr();
ENABLE;
}
void main(void)
{
SP=0x50;
P0=0xff;
P1=0xdb;
P2=0xff;
P3=0xff;
D12CS=0x0;
IT0=0;//设置INT0为低电平中断触发
EX0=1;//允许外部中断0
PX0=1;//设为高优先级
EA=1;//开总中断
D12CS=0x1;
MR=0;
_nop_();
_nop_();
MR=1;
LDCW=1;
P2=0x00;
P0=0x20;
LDCW=0;
_nop_();
_nop_();
LDCW=1;
D12CS=0x0;
bEPPflags.value=0;
reconnect_usb();
while(1)
{
if(bEPPflags.bits.setup_packet)
{
DISABLE;
bEPPflags.bits.setup_packet=0;
ENABLE;
setup_handler();
}
if(bEPPflags.bits.ep1_rxdone)//?????????????????此处是否应该加入清除标志的语句
{
DISABLE;
bEPPflags.bits.ep1_rxdone=0;
ENABLE;
/*
D12CS=0x1;
LDCW=1;
P0=ControlWord[0];
P2=ControlWord[1];
P0=0x20;
P2=0x00;
LDCW=0; */
// _nop_();
// _nop_();
// LDCW=1;
// D12CS=0x0;
/*
while(TXR!=1);
D12CS=1;
P0=0xff;
P2=0xff;
ENTX=0;
P0=OutBuf[0];
P2=OutBuf[1];
LD1=0;
LD1=1;
P0=OutBuf[2];
P2=OutBuf[3];
LD2=0;
LD2=1;
_nop_();
_nop_();
ENTX=1;
// _nop_();
// _nop_();
while(TXR!=1);
ENTX=0; */
}
//发送控制字
//if(TXR && bEPPflags.bits.ep2_rxdone)
//{
if(bEPPflags.bits.ep2_rxdone)
{
DISABLE;
bEPPflags.bits.ep2_rxdone=0;
ENABLE;
while(!TXR);
D12CS=1;
//P0=0xff;
//P2=0xff;
ENTX=0;
P0=OutBuf[0];
P2=OutBuf[1];
LD1=0;
LD1=1;
P0=OutBuf[2];
P2=OutBuf[3];
LD2=0;
LD2=1;
//_nop_();
// _nop_();
ENTX=1;
unsigned char i;
for(i=250;i>0;i--);
//_nop_():
//_nop_();
//_nop_();
//while(TXR!=1);
//ENTX=0;
D12CS=0x0;
// P1=0xdb;
// D12CS=0x1;
// _nop_();
// MR=0;
// _nop_();
// _nop_();
// MR=1;
// LDCW=1;
// P0=ControlWord[0];
// P2=ControlWord[1];
//P0=0x00;
//P2=0x20;
// LDCW=0;
// _nop_();
// _nop_();
// LDCW=1;
// D12CS=0x0;
}
//}
//接收通道1
if(DR1==0)
{
D12CS=1;
OE1=1;
SEL=0;
P0=0xff;
P2=0xff;
OE1=0;
_nop_();
InBuf1[0]=P0;
InBuf1[1]=P2;
OE1=1;
SEL=1;
P0=0xff;
P2=0xff;
OE1=0;
_nop_();
InBuf1[2]=P0;
InBuf1[3]=P2;
OE1=1;
D12CS=0;
D12_WriteEndpoint(3,4,InBuf1);
}
//接收通道2
if(DR2==0)
{
D12CS=1;
OE2=1;
SEL=0;
P0=0xff;
P2=0xff;
OE2=0;
_nop_();
InBuf2[0]=P0;
InBuf2[1]=P2;
OE2=1;
SEL=1;
P0=0xff;
P2=0xff;
OE2=0;
_nop_();
InBuf2[2]=P0;
InBuf2[3]=P2;
OE2=1;
D12CS=0;
D12_WriteEndpoint(5,4,InBuf2);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -