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

📄 isr.c

📁 一个用C语言编写的usb程序,测试可以运行,内附有原理图
💻 C
字号:
#include "declare.h"
#include "isr.h"

#pragma disable
void extern0_ISR(void) interrupt 0
{
  d12comm(0xf4);
  s = d12read();
  d12read();

  if (sb7 == 1)	//SuspendChange
  {
  }
  else if (sb6 == 1)	//BusReset
  {
    Configured = 0;
  }
  else if (sb0 == 1)	//EP0Out
  {
    d12comm(0x40);
    d12read();
    SetupPacketReceived();
  }
  else if (sb1 == 1) //EP0In
  {
    d12comm(0x41);
    d12read();

    if (SaveLength != 0)
    {
      PTR = SavePTR;
      SendNextPieceOfDescriptor(SaveLength);
    }
  }
  else if (sb2 == 1)	//EP1Out
  {
    d12comm(0x42);
    d12read();
  }
  else if (sb3 == 1)	//EP1In
  {
    d12comm(0x43);
    d12read();

    IsListening = 1;

    if (mode == D12TEST) Output(Counter);
  }
  else if (sb4 == 1)	//EP2Out
  {
    d12comm(0x44);
    d12read();
  }
  else if (sb5 == 1)	//EP2In
  {
    d12comm(0x45);
    d12read();
  }
  else			//SOF
  {
    if (Configured == 1)
    {
      switch (mode) {
      case D12TEST:
        if (--MSecCounter == 0)
        {
          MSecCounter = 125;
          Counter++;
       
          ReplyCount = 1;
          ReplyBuffer[0] = Counter;

          IsListening = 0;

          d12comm(0x03);

          SendReplyBuffer();
        }
        break;
      case KEYBOARD:
//        ps2write(0xfe);
//        ps2read();
//        ps2read();
//        Output(PS2_BYTE);
/*
        ReplyCount = 0;
        ReplyBuffer[0] = 0;
        ReplyBuffer[1] = 0;
        ReplyBuffer[2] = 0;
        ReplyBuffer[3] = 0;
        ReplyBuffer[4] = 0;
        ReplyBuffer[5] = 0;
        ReplyBuffer[6] = 0;
        ReplyBuffer[7] = 0;

        IsListening = 0;

        d12comm(0x03);

        SendReplyBuffer();
*/
        break;
      case MOUSE:
        break;
      case PRINTER:
        break;
      case STORAGE:
        break;
      default:
        ;
      }
    }
  }
}

void timer0_ISR (void) interrupt 1{}    /* not used */
void extern1_ISR(void) interrupt 2{}    /* not used */
void timer1_ISR (void) interrupt 3{}    /* not used */
void serial_ISR (void) interrupt 4{}    /* not used */

void SetupPacketReceived(void)
{
  SaveLength = 0;

  d12comm(0x00);

  d12comm(0xf0);
  SetupDataResv = d12read();
  SetupDataLen = d12read();
  RequestType = d12read();
  Request = d12read();
  wValueLow = d12read();
  wValueHigh = d12read();
  wIndexLow = d12read();
  wIndexHigh = d12read();
  wLengthLow = d12read();
  wLengthHigh = d12read();
/*
#define tttt 0
if (++temp == tttt)//////////////////////////////////////////////////////////////////////////////////
{
  Output(SetupDataLen);
  delay(4000);
  Output(RequestType);
  delay(4000);
  Output(Request);
  delay(4000);
  Output(wValueLow);
  delay(4000);
  Output(wValueHigh);
  delay(4000);
  Output(wIndexLow);
  delay(4000);
  Output(wIndexHigh);
  delay(4000);
  Output(wLengthLow);
  delay(4000);
  Output(wLengthHigh);
  delay(4000);
}*/

  d12comm(0xf1);
  d12comm(0xf2);
  d12comm(0x01);
  d12comm(0xf1);

  if (SetupDataLen != 0)
  {
    ServiceSetupPacket();
    if (STALL == 1)
    {
      d12comm(0x40);	//SendStall
      d12write(0x01);

      d12comm(0x41);
      d12write(0x01);
    }
    else
    {
      if (SetAddr == 1)
      {
        SetD12Address();
      }
      else if (SendData == 0)
      {
        HandShake();
      }
      else if (IsDescriptor == 0)
      {
        SendReplyBuffer();
      }
      else
      {
        SendDescriptor();
      }
    }
  }
}

void SendDescriptor(void)
{
  if (wLengthHigh == 0)
  {
    if (ReturnLength < wLengthLow)
    {
      SendNextPieceOfDescriptor(ReturnLength);
    }
    else
    {
      SendNextPieceOfDescriptor(wLengthLow);
    }
  }
  else
  {
    SendNextPieceOfDescriptor(ReturnLength);
  }
}

void SendNextPieceOfDescriptor(unsigned char Len)
{
  if (Len > EP0Size)
  {
    SaveLength = Len - EP0Size;
    SavePTR = PTR + EP0Size;
    SendPacketToD12(EP0Size);
  }
  else
  {
    SaveLength = 0;
    SendPacketToD12(Len);
  }
}

void SendPacketToD12(unsigned char Len)
{
/*
if(temp++==2)
{
  Output(Len);
  delay(5000);
}
*///to send but not sending
  ReplyCount = Len;
  if (Len != 0)
  {
    for (i=0;i<Len;i++)
    {
      ReplyBuffer[i] = *(PTR++);//CBYTE[PTR++];
    }
  }
  SendReplyBuffer();
}

void SendReplyBuffer(void)
{
  d12comm(0xf0);
  d12write(0x00);
  d12write(ReplyCount);

  if (ReplyCount != 0)
  {
    for (i=0;i<ReplyCount;i++)
    {
      d12write(ReplyBuffer[i]);
      ReplyBuffer[i] = 0;///////////////////////////////////////////////////////////
    }
  }

  d12comm(0xfa);
/*
if (temp == tttt)///////////////////////////////////////////////////////////////////
{
  Output(ReplyCount);
  delay(4000);
  for (i=0;i<ReplyCount;i++)
  {
    Output(ReplyBuffer[i]);
    delay(4000);
  }
}
*/
}

void SetD12Address(void)
{
  d12comm(0xd0);
  s = wValueLow;
  sb7 = 1;
  d12write(s);

  d12comm(0xd8);
  d12write(0x01);

  if (mode == D12TEST)
  {
    d12comm(0xfb);
    d12write(0x20);
  }

  HandShake();
}

void HandShake(void)
{
  SendPacketToD12(0);
}

void Wait4D(void)
{
  do {
    d12comm(0xf4);
    s = d12read();
    d12read();
  } while (s^0 == 0);

  d12comm(0x00);

  d12comm(0xf0);
  d12read();
  d12read();

  switch (mode) {
  case D12TEST:
    i = d12read();
    if (i == 0xff)
    {
      Counter = Input();
    }
    else
    {
      Counter = i;
    }
    break;
  case KEYBOARD:
    break;
  case MOUSE:
    break;
  case PRINTER:
    break;
  case STORAGE:
    break;
  default:
    ;
  }

  d12comm(0xf1);
  d12comm(0xf2);
  d12comm(0x01);
  d12comm(0xf1);
}

⌨️ 快捷键说明

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