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

📄 d12ci.c

📁 STC51+PDIUSBD12 USB鼠标源代码
💻 C
字号:
#include "EPPHAL.H"
#define D12_COMMAND     1
#define D12_DATA        0
#define D12_FULLEMPTY 0x01

#include "d12.h"
#include "uart.h"
sbit USB_A0 = 0xB5;
sbit USB_WR  = 0xB6;
sbit USB_RD = 0xB7;


extern EPPFLAGS              bEPPflags;




//使地址使能
void D12_SetAddress_Enable(uint8 bAddress,uint8 bEnable)
{
  outportb(D12_COMMAND,0XD0);
  if(bEnable)
    bAddress|=0x80;
  outportb(D12_DATA,bAddress);	    
}
//设置端点使能			  何处使用?
void D12_SetEndpointEnable(uint8 bEnable)
{
  outportb(D12_COMMAND,0xd8);
  if(bEnable)
    outportb(D12_DATA,1);
  else
    outportb(D12_DATA,0);
}
//设置模式命令
void D12_SetMode(uint8 bConfig,uint8 bClkDiv)
{
  outportb(D12_COMMAND,0xf3);
  outportb(D12_DATA,bConfig);
  outportb(D12_DATA,bClkDiv);
}
//设置DMA
void D12_SetDMA(uint8 bMode)
{
  outportb(D12_COMMAND,0xfb);
  outportb(D12_DATA,bMode);
}
//读取中断寄存器
uint16 D12_ReadInterruptRegister(void)
{
  uint8 b1;
  uint16 j;
  outportb(D12_COMMAND,0xf4);
  b1=inportb(D12_DATA);
  j=inportb(D12_DATA);
  j<<=8;
  j+=b1;
  return j;
}
//端点选择命令
uint8 D12_SelectEndpoint(uint8 bEndp)
{
  uint8 c;
  outportb(D12_COMMAND,bEndp);
  c=inportb(D12_DATA);
  return c;
}
//读取最后处理状态
uint8 D12_ReadLastTransactionStatus(uint8 bEndp)
{
  outportb(D12_COMMAND,0x40+bEndp);
  return inportb(D12_DATA);
}
//设置端点状态
void D12_SetEndpointStatus(uint8 bEndp,uint8 bStalled)
{
  outportb(D12_COMMAND,0x40+bEndp);
  outportb(D12_DATA,bStalled);
}
//发送恢复命令
void D12_SendResume(void)
{
  outportb(D12_COMMAND,0xf6);
}
//读取当前帧状态
uint16 D12_ReadCurrentFrameNumber(void)
{
  uint16 i,j;
  outportb(D12_COMMAND,0xf5);
  i=inportb(D12_DATA);
  j=inportb(D12_DATA);
  i+=(j<<8);
  return i;
}
//读取端点数据
uint8 D12_ReadEndpoint(uint8 endp,uint8 len,uint8 *buf)
{
  uint8 i,j;
  Prints("\r\nReadEndpoint\r\n");
  outportb(D12_COMMAND,endp);
  if((inportb(D12_DATA)&D12_FULLEMPTY)==0)					  //当前端点缓存为空,返回
    return 0; 
  outportb(D12_COMMAND,0x80+endp);
  i=inportb(D12_DATA);
  i=i&0x60;
  Prints("buff==");                                                         //缓存满否
  PrintShortIntHex(i);

  if(endp==2)
    {
	  if(i==0x60)
	    bEPPflags.bits.ep1buf_full=1;						    //端点1缓存满
	  else
	    bEPPflags.bits.ep1buf_full=0;
	}
  if(endp==4)
    {
	  if(i==0x60)
	    bEPPflags.bits.ep2buf_full=1;
	  else
	    bEPPflags.bits.ep2buf_full=0;
	}
  outportb(D12_COMMAND,0xf0);                        //读缓存区
  j=inportb(D12_DATA);
  j=inportb(D12_DATA);
  if(j>len)
    j=len;
  Prints("\r\nlen=");
  PrintShortIntHex(len);
  for(i=0;i<j;i++)
    PrintShortIntHex(*(buf+i)=inportb(D12_DATA));
  outportb(D12_COMMAND,0xf2);                     //清缓存
  return j;
}
//把数据写入端点
uint8 D12_WriteEndpoint(uint8 endp,uint8 len,uint8 * buf)
{
  uint8 i;
  outportb(D12_COMMAND,endp);
  inportb(D12_DATA);
  outportb(D12_COMMAND,0xf0);						//写缓存
  outportb(D12_DATA,0);
  outportb(D12_DATA,len);
  Prints("\r\n写入的数据是");
  for(i=0;i<len;i++)
    {
	 outportb(D12_DATA,*(buf+i));
	 PrintHex(*(buf+i));
	}
  
  outportb(D12_COMMAND,0xfa);
  outportb(D12_COMMAND,0x80+endp);
  i=inportb(D12_DATA);
  Prints("\r\n端点满否i=");
  PrintHex(i);
  return len;
}
/*void write_a_usb_data(uint8 usb_data)       
{
 USB_A0=0;
 P0=usb_data;
 USB_WR=0;
 USB_WR=1;
 P0=0XFF;
}
//写端点2
/*uint8 write_endpoint_buff(uint8 endp,uint8 len,uint8 * buff)
{
 uint8 i;
 D12_ReadLastTransactionStatus(endp);
 outportb(D12_COMMAND,endp);
 outportb(D12_COMMAND,0xf0);
 write_a_usb_data(0);
 write_a_usb_data(len);
 Prints("\r\n写入数据");

 for(i=0;i<len;i++)
  {
   P0=*(buff+i);
   PrintHex(*(buff+i));

   USB_WR=0;
   USB_WR=1;

   //PrintHex(*(buff+i));

  }
 
 P0=0xFF;
 outportb(D12_COMMAND,0xfa);
 outportb(D12_COMMAND,0x80+endp);
  i=inportb(D12_DATA);
  Prints("\r\n端点满否i=");
  PrintHex(i);
 return len;
} */
//端点应答处理
void D12_AcknowledgeEndpoint(uint8 endp)
{
  outportb(D12_COMMAND,endp);
  outportb(D12_COMMAND,0xf1);
  if(endp==0)
    outportb(D12_COMMAND,0xf2);					//清缓存
}

//读取端点状态
unsigned char D12_ReadEndpointStatus(uint8 bEndp)
{
	unsigned char c;

	if(bEPPflags.bits.in_isr == 0)
		EA=0;

	outportb(D12_COMMAND, 0x80 + bEndp);//读取端点状态
	c = inportb(D12_DATA);

	if(bEPPflags.bits.in_isr == 0)
		EA=1;

	return c;
}





































⌨️ 快捷键说明

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